如何配置iptables阻止服务器入站请求同时保留网络连通性?
如何配置iptables阻止服务器入站请求同时保留网络连通性?
兄弟,我仔细看了你的问题和iptables规则,马上找到核心问题了——你漏掉了允许回环接口(lo)流量的规则!这是新手配置iptables时超容易踩的坑,刚好就是导致你DNS解析失败、服务器连不上网的原因。
问题原因拆解
现在Ubuntu这类现代Linux发行版,默认用systemd-resolved处理DNS解析,它会监听本地回环地址127.0.0.53。当你执行apt update或者ping www.google.com时,系统其实是向这个本地地址发DNS请求,而这些请求属于回环接口的入站流量。但你的INPUT链里完全没允许lo接口的流量,最后被那条REJECT规则直接拦了,自然就出现解析失败的错误。
虽然你已经加了允许RELATED,ESTABLISHED状态的规则,但本地回环的流量如果没被匹配到(或者没被明确允许),就会被后续的拒绝规则阻断——本地DNS请求恰好就属于这种情况。
修复步骤
1. 临时添加回环接口允许规则(立即生效)
把这条规则插到INPUT链的最前面,确保它在拒绝规则之前生效:
sudo iptables -I INPUT 1 -i lo -j ACCEPT
这条规则的意思很直白:所有来自回环接口的入站流量,直接允许通过。
2. 验证修复效果
现在再试试之前失败的命令,应该能正常跑起来了:
ping www.google.com sudo apt update
3. 永久保存规则(重启后不丢失)
Ubuntu可以用iptables-persistent工具保存当前规则,避免重启后失效:
# 先安装工具 sudo apt install -y iptables-persistent # 保存当前iptables规则 sudo netfilter-persistent save
最终INPUT链规则参考
修复后的INPUT链应该是这个样子的(你可以用sudo iptables -L INPUT --line-numbers查看):
1. ACCEPT all -- anywhere anywhere 2. ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 3. ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED 4. REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
额外提醒
- 回环接口是服务器内部进程通信的基础,除了DNS,很多本地服务(比如数据库、监控工具)都依赖它,这条规则几乎是所有iptables配置的必备项;
- 你现有的
RELATED,ESTABLISHED规则已经能覆盖所有服务器主动发起的连接的响应(比如apt的HTTP请求、外部DNS的响应等),不需要额外修改; - 调整iptables规则时,一定要把允许类规则放在拒绝规则前面,因为iptables是按顺序匹配规则的,先匹配到的规则会先执行。
备注:内容来源于stack exchange,提问作者Bad_Panda
相关产品推荐
相关产品推荐

