Простым подходом может быть использование сетевых пространств имен Linux.
Сетевые пространства имен Linux
Как следует из названия, сетевые пространства имен разделяют использованиесети - устройства, адреса, порты, маршруты, правила брандмауэра и т. д. - в отдельные блоки, по существу, виртуализируя сеть в одном работающем экземпляре ядра.Сетевые пространства имен вошли в ядро в 2.6.24, ...
см. https://lwn.net/Articles/580893/
Unshare
unshare () позволяет процессу (или потоку) разъединять части своего контекста выполнения, которые в настоящее время используются совместно с другими процессами (или потоками).
см. http://man7.org/linux/man-pages/man2/unshare.2.html
Testcase
Поскольку программа должна иметь возможность общаться с самим собой, нам нужна программа, которая взаимодействует сама с собойчерез носки.Есть крутой ответ SO, который показывает простую Java-программу, которая передает текст «Hello World!»через сокет к себе, см. здесь https://stackoverflow.com/a/8119708.
/usr/bin/java SendReceive
работает как положено и выдает «Hello World!»
С помощью опции -n можно отменить пространство имен сети.
unshare -n -- sh -c '/usr/bin/java SendReceive'
дает SocketException: сеть недоступна , потому что нет доступа к устройству обратной связи.
unshare -n -- sh -c 'ip link set dev lo up; /usr/bin/java SendReceive'
наконец передает «Hello World!»снова через петлевой интерфейс.Кстати, это частное петлевое устройство.Вы не можете получить доступ к открытым портам на стандартном устройстве обратной связи.
См. Также этот крутой ответ Unix Stackexchange: https://unix.stackexchange.com/a/83348: Блокировать сетевой доступ процесса?
Снимок экрана
Вот скриншот упомянутого выше тестового примера, выполненного в Ubuntu 18.10: