« Server Push blocked by Compress - 压缩模式不能实现Server Push | Main | 配置Mediawiki支持短URL »
August 06, 2006
IPtables 规则错误导致DNS查询失败之解决办法
受朋友之托,检查其主机上的iptables规则引起的dns问题。主要现象是打开了如下的规则后,squid就不能正常的查找主机的ip地址,dns解析试销。
# Generated by iptables-save v1.3.4 on Sun Aug 6 11:28:42 2006 *nat :PREROUTING ACCEPT [293:39183] :POSTROUTING ACCEPT [5:299] :OUTPUT ACCEPT [5:299] COMMIT # Completed on Sun Aug 6 11:28:42 2006 # Generated by iptables-save v1.3.4 on Sun Aug 6 11:28:42 2006 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [949:834012] -A INPUT -p tcp -m multiport --dports 21,25,80,81,110,143,3128 -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT -A INPUT -p udp -m udp --dport 53 -j ACCEPT #-A INPUT -p udp -m udp -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec --limit-burst 10 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m state --state INVALID,NEW -j DROP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP -A INPUT -p udp -m udp -j DROP COMMIT # Completed on Sun Aug 6 11:28:42 2006
当屏蔽了上述规则中#-A INPUT -p udp -m udp -j ACCEPT 的规则后,squid就无法正常工作了。在机器上用nslookup 查询主机名 + 外部dns ip,发现timeout,应该是udp包无法发送到对方的dns服务器53端口。
后来man了一下iptables,发现可以用LOG来记录ip包的情况,于是打开log,增加了如下的规则集:
-A INPUT -j LOG -p udp -m udp --log-prefix "DNS monitor: "
重新启动iptables,在/var/log/message里看到如下信息:
注意这里的SPT=53 DPT=33036,检查一下规则发现放行的是目的地53口,没有发行源端口(即sport),估计问题在这里,于是增加一条记录:
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
重新启动后,正常了。看来,没有log的帮助还一时搞不明白为什么。也怪平时没仔细研究iptables,嘿嘿,通过这次也受到教训了:-)
Posted by hzqbbc at August 6, 2006 12:01 PM
Comments
好久不见老大更新blog了。呵呵
受益了。^_^
Posted by: CnYouker at August 6, 2006 07:36 PM
老大就是厉害
Posted by: myhstone at August 6, 2006 09:43 PM
呵呵,高手。请把平时学习到的东西拿来分享一下,虽然有多数俺根本看不懂,但俺一直关注着你的Blog。
Posted by: yutiefeng at August 8, 2006 06:42 PM