Linux iptables 脚本用于阻止除所需应用程序之外的所有互联网访问

Linux iptables 脚本用于阻止除所需应用程序之外的所有互联网访问

语境:

我想要一个 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现在...当我尝试加载网站时,它没有显示找不到服务器,但它会持续加载很长时间,非常长。这​​让我相信也许输出响应已发送,但输入被阻止了。

如果有人知道为什么会发生这种情况,我很想听到您的反馈!

相关内容