Linux

阻止程序的網路訪問?

  • March 9, 2020

是否可以阻止單個程序的(傳出)網路訪問?

使用 Linux 2.6.24+(在 2.6.29 之前被認為是實驗性的),您可以為此使用網路命名空間。您需要在您的核心 ( ) 中啟用“網路命名空間”,並使用該工具啟用CONFIG_NET_NS=yutil-linux 。unshare

然後,在沒有網路訪問權限的情況下啟動程序非常簡單:

unshare -n program ...

這會為程序創建一個空的網路命名空間。也就是說,它在沒有網路介面的情況下執行,包括沒有 loopback。在下面的範例中,我們添加 -r 以僅在目前有效使用者和組 ID 已映射到超級使用者 ID 後執行程序(避免使用 sudo):

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

如果您的應用需要網路介面,您可以設置一個新的:

$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms

請注意,這將創建一個新的本地環回。也就是說,生成的程序將無法訪問主機的127.0.0.1.


如果您需要訪問命名空間內的原始網路,您可以使用nsenter進入另一個命名空間。

以下範例ping使用 PID 1 使用的網路命名空間執行(通過 指定-t 1):

$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms

引用自:https://unix.stackexchange.com/questions/68956