为什么以下简单而严格的 iptable 规则会阻止 apt update 执行?

为什么以下简单而严格的 iptable 规则会阻止 apt update 执行?

我设置了以下简单但严格的规则,以便我们的服务器只接受传入

  1. 远程控制
  2. http
  3. https

但是,一旦设置了这样的规则,我注意到我无法再执行 apt update

root@wenote-droplet:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
root@wenote-droplet:~# apt update
Err:1 http://mirrors.digitalocean.com/ubuntu focal InRelease
  Temporary failure resolving 'mirrors.digitalocean.com'
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
0% [Working]

如果我删除所有规则,那么 apt update 就没有问题了?

root@wenote-droplet:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
root@wenote-droplet:~# apt update
Get:1 http://mirrors.digitalocean.com/ubuntu focal InRelease [265 kB]
Hit:2 http://security.ubuntu.com/ubuntu focal-security InRelease
Get:3 http://mirrors.digitalocean.com/ubuntu focal-updates InRelease [114 kB]
Get:4 http://mirrors.digitalocean.com/ubuntu focal-backports InRelease [101 kB]

我可以知道为什么吗?我以为,apt update链输出规则(即接受默认策略)是否被使用?

因为,在期间apt update,我们不充当 HTTP 服务器,而是充当发出 OUTPUT 流量的客户端。

答案1

IPTables 规则适用于所有 IP 数据包。在 TCP 连接中,服务器既通过OUTPUT链发送数据包,也通过INPUT链接收数据包。

在您的规则中,您将使用该规则丢弃来自接收方向的所有数据包DROP

您需要使用连接跟踪才能允许接收服务器本身已启动的 TCP 连接的数据包。

这是允许它的一组基本规则:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m conntrack --ctstate NEW -j accept
iptables -P INPUT DROP

第一条规则允许已建立连接的传入数据包。

第二条规则允许端口 22,80,443 的新传入连接。

最后一条规则将链数据包的默认策略设置INPUTDROP

允许传入的 ICMP 数据包也是一种很好的做法:

iptables -A INPUT -p icmp -j ACCEPT

相关内容