Linux
阻止程序的網路訪問?
是否可以阻止單個程序的(傳出)網路訪問?
使用 Linux 2.6.24+(在 2.6.29 之前被認為是實驗性的),您可以為此使用網路命名空間。您需要在您的核心 ( ) 中啟用“網路命名空間”,並使用該工具啟用
CONFIG_NET_NS=y
util-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