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

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

语境:

我想要一个 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 的很​​多基本概念,并回答了我关于源代码的一些问题。

相关内容