语境:
我想要一个 shell 脚本来阻止所有到我的计算机的入站/出站流量,除非我决定要使用浏览器或其他应用程序,在这种情况下我会调用它并且只有这些应用程序会运行。
我研究了以前由聪明人制作的脚本(最后有源链接),并投入时间自己学习使用 iptables(仍在这方面工作)。
这是完成工作的结果:
结果:
在运行 shell 脚本之前,有一个名为互联网被建造:
sudo groupadd internet
外壳脚本:
#!/bin/sh
#only allow apps run from "internet" group to run
# clear previous rules
sudo iptables -F
# accept packets for internet group
sudo iptables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo iptables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
# also allow local connections
sudo iptables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT
# reject packets for other users
sudo iptables -A OUTPUT -j REJECT
# same process for IPv6:
sudo ip6tables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT
这是我目前正在开发的 shell 的另一部分,但我对此并没有 100% 的信心:
#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP
#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#SAME REPEATED FOR IPv6
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
执行上面的整个脚本后,以下命令将打开一个属于该internet
组的终端,因此该终端打开的任何应用程序(例如 firefox)都可以访问互联网,而所有其他输入/输出会被阻止
sudo -g internet -s
问题:
前面的逻辑是否合理?目前我正在努力测试所有功能,通过安装网络监控软件(nethogs),测试每一行代码并查看结果是否符合预期,但同时,我两天前才开始学习 iptables,所以尽管原始代码的来源是由经验丰富的编码人员完成的,但我对自己将它们组合在一起以产生所需结果的能力没有 100% 的信心。谢谢致所有花时间阅读本文并参与讨论的人!!!
来源:
https://plus.google.com/+TobyKurien/posts/YZhZJCZmGgm https://serverfault.com/questions/429400/iptables-rule-to-allow-all-outbound-locally-originating-traffic
PS:感谢@dirkt 之前帮助我理解了 iptables 的很多基本概念,并回答了我关于源代码的一些问题。