CONTEXT:
我想要一个 shell 脚本来阻止所有到我的计算机的入站/出站流量,除非我决定要使用浏览器或其他应用程序,在这种情况下,我会调用它并且只有这些应用程序会运行。
我研究了以前由聪明人制作的脚本(最后有源链接),并投入时间自己学习使用 iptables(仍在这方面工作)。
这是完成工作的结果:
RESULTS:
在运行 shell 脚本之前,有一个名为internet被建造:
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),测试每一行代码并查看结果是否符合预期,BUT同时,我两天前才开始学习 iptables,所以尽管原始代码的来源是由经验丰富的编码人员完成的,但我对自己将它们组合在一起以产生所需结果的能力没有 100% 的信心。Thanks致所有花时间阅读本文并参与讨论的人!!!
sources:
https://plus.google.com/+TobyKurien/posts/YZhZJCZmGgm
https://serverfault.com/questions/429400/iptables-rule-to-allow-all-outbound-locally-originating-traffic
P.S.:感谢@dirkt 之前帮助我理解了 iptables 的很多基本概念,并回答了我关于源代码的一些问题。
UPDATE:
所以运行代码后,似乎出现了问题。发生的情况如下。我运行 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
我确实确认所有其他规则均已到位。AFTER那,我尝试了以下方法:
- 通过手动双击图标来运行 Firefox。结果果然如我所料,立刻就得到了找不到服务器错误,这是一个好兆头
- 之后我运行了命令
sudo -g internet -s
在终端中,然后firefox
. NOW...当我尝试加载网站时,它没有显示找不到服务器,但它会持续加载很长一段时间,非常长。这让我相信输出响应可能已发送,但输入被阻止。
如果有人知道为什么会发生这种情况,我很想知道您的反馈!