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

时间:2017-04-20 01:37:19

标签: linux firewall iptables

背景:

我想要一个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 之后,我尝试了以下内容:

  • 手动双击图标运行firefox。结果如预期,我立即得到服务器未找到错误,这是一个好兆头
  • 之后我在终端中运行了sudo -g internet -s命令,然后firefox现在...... 当我尝试加载网站时,它没有显示未找到服务器,但它会长时间加载,很长时间。这让我相信输出响应可能已发送,但输入被阻止。

如果有人知道为什么会这样,我很想知道您的反馈意见!

1 个答案:

答案 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