背景:
我想要一个shell脚本来阻止我的计算机的所有入站/出站流量,除非我决定使用浏览器或其他应用程序,在这种情况下我会召唤它并且只运行那些应用程序。
我研究过以前由聪明人制作的脚本(最后链接到源代码),并投入时间学习自己使用iptables(仍然在这方面工作)。
以下是完成工作的结果:
结果:
在运行shell脚本之前,会创建一个名为 internet 的组:
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),测试每行代码并查看结果是否符合预期,但同时,我才开始在2天前学习iptables,所以尽管原始代码的来源是由有经验的编码人员完成的,但我并不是100%有信心将所有这些都放在一起以产生预期的结果。 感谢任何花时间阅读所有内容并参与讨论的人 !!!
来源:
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的许多基本概念,并回答了一些关于源代码的问题。
更新
所以在运行代码之后,似乎出现了问题。发生的事情如下。我运行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 之后,我尝试了以下内容:
sudo -g internet -s
命令,然后firefox
。 现在...... 当我尝试加载网站时,它没有显示未找到服务器,但它会长时间加载,很长时间。这让我相信输出响应可能已发送,但输入被阻止。 如果有人知道为什么会这样,我很想知道您的反馈意见!
答案 0 :(得分:1)
我2天前才刚开始学习iptables,所以尽管原始代码的来源是由经验丰富的编码人员完成的,但我并不是100%有信心将所有内容放在一起以产生预期的结果。
巧合的是,我在同一时间寻找相同的解决方案并看到了你的帖子。只需注册SO,希望这可以帮助您和其他人。我仍在学习并接受建议和建议:)
对代码进行一些更改。我需要打开所有端口到本地连接以使其工作。 还将192.168.0.1/24更改为192.168.0.0/16。这个范围允许包含wifi / usb tether。
# also allow local connections
#TODO. Use log to see which port are actually needed.
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT
先前的逻辑是否正常?
更改/为此代码的顺序。
#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP
还要在以前的代码之上添加此代码。这些是从默认防火墙中获取的。最初它包含特定的接口。
sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
我得到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'了解更多信息。
可能是因为您使用的是IP4地址。 将127.0.0.1更改为:: 1/128和198.168.0.1更改为fe80 :: / 10。 对IPv6无能为力。我不知道它是如何工作的,我根本不认为我的使用IPv6。
#!/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
#Some application need more port. Such as ping.
sudo iptables -A OUTPUT -p icmp -m owner --gid-owner internet -j ACCEPT
#Less secure. Open all port.
#sudo iptables -A OUTPUT -m owner --gid-owner internet -j ACCEPT
# also allow local connections
#TODO. Use log to see which port are actually needed.
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT
# reject packets for other users
sudo iptables -A OUTPUT -j REJECT
#Taken from default rules.
sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP
#IPv6 Section
# Flush ip6tables too
sudo ip6tables -F
# 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 -d ::1/128 -j ACCEPT
sudo ip6tables -A OUTPUT -d fe80::/10 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT
sudo ip6tables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo ip6tables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP