![Linux iptables 脚本用于阻止除所需应用程序之外的所有互联网访问](https://linux22.com/image/1528056/Linux%20iptables%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E9%98%BB%E6%AD%A2%E9%99%A4%E6%89%80%E9%9C%80%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E4%BA%92%E8%81%94%E7%BD%91%E8%AE%BF%E9%97%AE.png)
语境:
我想要一个 shell 脚本来阻止所有到我的计算机的入站/出站流量,除非我决定使用浏览器或其他应用程序,在这种情况下我会调用它并且只有那些应用程序会运行。
我研究过以前由聪明人编写的脚本(最后的来源链接),并且花时间自己学习使用 iptables(仍然在这方面努力)。
完成工作的成果如下:
结果:
在运行 shell 脚本之前,一个名为互联网被建造:
sudo groupadd internet
Shell 脚本:
#!/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)都可以访问互联网,而所有其他 INPUT/OUTPUT 都将停止
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的基本概念以及回答了我关于源代码的一些疑问。
更新:
因此,运行代码后,似乎出现了问题。发生的情况如下。我运行了 shell 脚本:
bash myscript
我收到如下2个错误:
ip6tables v1.6.0:
127.0.0.1
未找到主机/网络 请尝试“ip6tables -h”或“ip6tables --help”获取更多信息。ip6tables v1.6.0:
198.168.0.1
未找到主机/网络 请尝试“ip6tables -h”或“ip6tables --help”获取更多信息。
但其他一切都进展顺利,而且在这样做的时候sudo iptables -L
我确实确认了所有其他规则都已到位。后我尝试了以下方法:
- 通过手动双击图标来运行 Firefox。结果正如预期的那样,我马上就得到了找不到服务器错误,这是一个好兆头
- 之后我
sudo -g internet -s
在终端中运行该命令,然后firefox
。现在...当我尝试加载网站时,它没有显示找不到服务器,但它会持续加载很长时间,非常长。这让我相信也许输出响应已发送,但输入被阻止了。
如果有人知道为什么会发生这种情况,我很想听到您的反馈!