(这是基于 antiX 的系统,而 antiX 本身又基于 Debian stretch。)我对 iptables 有以下规则:
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -d 192.168.10.0/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.0/24 -d 192.168.10.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner root -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner internet_access -j ACCEPT
iptables -nvL
这个想法是,对于 root 所做的一切以及 internet_access 组中的所有内容,都允许外部流量。这似乎(大部分)按预期工作。但是,synaptic(以及 apt 系列中的其他程序)似乎不喜欢该规则集。它无法重新加载其数据库,而是挂起。我在 Google 上搜索解决方案,发现添加此行有帮助:
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
我(我想我)知道它的作用,但我不明白为什么首先有必要这样做。synaptic 以 root 身份运行,因此它应该具有完全的互联网访问权限(以 root 身份启动的其他应用程序确实具有互联网访问权限)。
其次,如果我将上面的规则改为这样:
iptables -A OUTPUT -p tcp --dport 80 -m owner --uid-owner root -m state --state NEW -j ACCEPT
它再次停止工作。但是,如果我使用 psgrep 列出突触进程,它会显示为用户 root 和组 root。我很困惑。
(如果您还没推断出这一点的话,我对 Linux 还很陌生(可以说对 iptables 还很陌生)。)
答案1
在我的 Kubuntu 中,这是因为apt-get
运行多个/usr/lib/apt/methods/http
进程。它们的所有者是_apt
,而不是root
。我知道_apt
在我的 Debian 中也存在。
成为_apt
您所在组的成员internet_access
应该会有所帮助。
成为_apt
您所在组的成员internet_access
不会有所帮助,因为--gid-owner
如果数据包套接字的文件结构归给定组所有,则匹配。这与“如果数据包套接字的文件结构归给定组的成员所有”不同。
在我的 Kubuntu 中,这些进程由/http
拥有。最简单的解决方案似乎只是允许用户通信:_apt
nogroup
_apt
iptables -A OUTPUT -m owner --uid-owner _apt -j ACCEPT