Обертка для предотвращения доступа программы к нелокальным соединениям

Рассмотрим server программ, который связывается с '*' и прослушивает входящие соединения. Я подключаюсь только к server с localhost, и я не хочу, чтобы внешние пользователи могли подключиться к нему. Тем не менее, программа server плохо написана и не предоставляет параметр конфигурации или флаг для привязки только к localhost. Кроме того, мне неудобно взломать исходный код server чтобы исправить это.

Следовательно, я бы искал оболочку для запуска server но привязывал его к localhost, а не к '*'. (Например, может быть, трюк, основанный на LD_PRELOAD, мог бы выполнить эту работу, например, tsocks чтобы принудительно использовать прокси SOCKS в сторонней программе.) Существует ли что-то подобное? Я нахожусь на машине, если это помогает.

Я знаю, что другое решение будет состоять в том, чтобы использовать iptables для этого, но эти правила не сохраняются при перезагрузках, чтобы они могли тихо сломаться. Кроме того, они являются «глобальными» и могут быть изменены другими пользователями сервера или запутать их. Напротив, при запуске серверной программы в качестве wrapper server я бы более уверен, что установка не будет ломаться по какой-либо другой причине.

Вот как это сделать, используя пространства имен ip (требуется привилегии root, следующее должно выполняться как root).

Создайте пространство имен для сервера:

ip netns add myserverns

Назначьте IP-адрес loopback в пространстве имен и включите его (source: this post ):

ip netns exec myserverns ifconfig lo 127.0.0.1 up

Запустить server в пространстве имен (где «serveruser» – это пользователь, который должен запускать сервер)

ip netns exec myserverns sudo -u serveruser server

Предположим, что сервер прослушивает порт 4242 . Теперь используйте socat для привязки loopback к пространству имен (обратите внимание на использование bind=127.0.0.1 которое является целым) (source: this answer ):

socat tcp-listen:4242,bind=127.0.0.1,fork,reuseaddr exec:'ip netns exec myserverns socat STDIO tcp-connect\:127.0.0.1\:4242',nofork

Это достигает моей намеченной цели: даже если server пытается привязываться к «*» (или к разным портам вообще), когда мы запускаем его таким образом, мы уверены, что его можно найти только на локальной машине с портом 4242 .