月下博客

启用iptables后无法解析域名和ping

常规情形下,服务器是不会开启iptables的,原因比较简单:一是外部请求需要经过代理或者中转服务器,后端服务器不会直接暴露;二是外层网络安全组已经配置访问规则,安全组正常工作的情况下,iptables的角色重复。

面向终端用户的服务器基本上要求开启iptables。配置过程中就不说被自己踢下去这样的坑了,最近几次遇到的坑是:开启iptables后,无法访问外网,也无法ping通外网,关闭后一切正常。主意到这个现象是半年前在一台服务器上开启iptables,过了几天发现解析域名异常。解析域名问题第一反应当然是排查DNS。经过配置DNS,提工单找技术支持等方案折腾后,某天灵感闪现,上网一查果然是iptables的问题。

本人最常用的iptables配置是这样:

iptables -F
iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
配置其他规则
iptables -P INPUT DROP

上述配置在不会主动访问外网(需解析域名的)url服务器上没有问题。此时如果在服务器上执行curl www.baidu.com或者ping www.baidu.com,会发现命令卡住无返回。原因在于iptables默认的策略是DROP,解析域名和ping用到的udp和icmp包在iptables中均被丢弃掉了。

解决dns解析的问题,需要加上如下规则:

iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT

ping通外网,或者让外网ping通,需要加上如下规则:

iptables -A INPUT -p imcp -j ACCEPT