Вот как это сделать, используя пространства имен ip (требуются привилегии суперпользователя, следующее должно выполняться от имени суперпользователя).
Создайте пространство имен для сервера:
ip netns add myserverns
Назначьте IP-адрес для обратной связи в пространстве имен и включите ее (источник: this {{1} } post ):
ip netns exec myserverns ifconfig lo 127.0.0.1 up
Запустить
сервер
в пространстве имен (где «serveruser» - это пользователь, который должен запускать сервер)
ip netns exec myserverns sudo -u serveruser server
Предположим, что сервер прослушивает порт
4242
. Теперь используйтеsocat
, чтобы привязать петлю к пространству имен (обратите внимание на использованиеbind = 127.0.0.1
, которое является всей точкой) (источник: этот ответ ):
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
Это достигает моей намеченной цели: даже если сервер
пытается привязаться к' * '(или к другим портам в целом), когда мы запускаем его таким образом, мы убедитесь, что его можно получить только на локальном компьютере с портом 4242
.