gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:21 32 4
gpt4 key购买 nike

上下文:

我想要一个 shell 脚本来阻止我计算机的所有入站/出站流量,除非我决定要使用浏览器或其他应用程序,在这种情况下我会调用它并且只有那些应用程序会运行。

我研究了以前由聪明人制作的脚本(源代码链接在末尾),并花时间自己学习使用 iptables(仍在这方面工作)。

这是完成工作的结果:

结果:

在运行 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),测试每一行代码并查看结果是否符合预期,但是与此同时,我才开始2 天前学习了 iptables,所以即使原始代码的来源是由经验丰富的编码人员完成的,我也不是 100% 有信心将它们放在一起产生预期结果的能力。 感谢所有花时间阅读所有内容并参与讨论的人!!!

来源:

https://plus.google.com/+TobyKurien/posts/YZhZJCZmGgm https://serverfault.com/questions/429400/iptables-rule-to-allow-all-outbound-locally-originating-traffic

附注:感谢@dirkt 之前帮助我理解了 iptables 的许多基本概念,并回答了我关于源代码的一些问题。


更新:

所以在运行代码之后,似乎有什么不对劲。发生的事情如下。我运行 shell 脚本:

bash myscript

我得到如下 2 个错误:

ip6tables v1.6.0: host/network 127.0.0.1 not found Try `ip6tables -h' or 'ip6tables --help' for more information.

ip6tables v1.6.0: host/network 198.168.0.1 not found Try `ip6tables -h' or 'ip6tables --help' for more information.

但其他一切都运行良好,在执行 sudo iptables -L 时,我确实确认所有其他规则都已到位。 之后,我尝试了以下操作:

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

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

最佳答案

I only started learning about iptables 2 days ago, so even though the sources of the original code is done by experienced coders, I am not 100% confident in my ability to put it all together to produced the desired result.

巧合的是,我大约在同一时间寻找相同的解决方案并看到了您的帖子。只需注册 SO,希望这可以帮助您和其他人。我仍在学习并乐于接受建议和建议:)

对代码进行了一些更改。我需要打开所有端口到本地连接才能使其工作。还将 192.168.0.1/24 更改为 192.168.0.0/16。此范围允许包括 wifi/usb 系绳。

# 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

Is the previous logic in order?

更改此代码的顺序。

#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

同时将这段代码添加到之前的代码之上。这些取自默认防火墙。最初它包含特定的接口(interface)。

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

I get 2 errors as follows:

ip6tables v1.6.0: host/network 127.0.0.1 not found Try `ip6tables -h' or 'ip6tables --help' for more information.

ip6tables v1.6.0: host/network 198.168.0.1 not found Try `ip6tables -h' or 'ip6tables --help' for more information.

可能是因为您使用的是 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

关于linux - iptables 脚本来阻止除所需应用程序之外的所有互联网访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43508741/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com