我设置了以下简单但严格的规则,以便我们的服务器只接受传入
- 远程控制
- http
- 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 的新传入连接。
最后一条规则将链数据包的默认策略设置INPUT
为DROP
。
允许传入的 ICMP 数据包也是一种很好的做法:
iptables -A INPUT -p icmp -j ACCEPT