iptables伪装/ NAT防火墙与IP一起工作,在某些连接上失败,特别是在涉及域名时

问题描述:

两个网关(“防火墙”)系统中的一个失败了,所以我在replace硬件上生成了一个“完全相同的”,结果发现当我切换一台内部机器去通过新的网关时,ping失败了。 切换回来,它的作品。 所以,我尝试了一个IP ping,避免DNS,它的工作。 在故障排除期间,我发现如果通过旧的网关路由,我可以运行“挖掘”就好了,但是通过新的路由器,它会失败:

[root@MyHost sysconfig]# dig @67.100.88.26 google.com mx ; <<>> DiG 8.2 <<>> @67.100.88.26 google.com mx ; (1 server found) ;; res options: init recurs defnam dnsrch ;; res_nsend to server 67.100.88.26: Connection refused [root@MyHost sysconfig]# 

如果我把它切换回另一个网关,一切正常。 这表明客户端框没有任何问题,但防火墙实际上并不完全相同,即使它似乎是。

我添加了丢弃数据包的日志logging,但内部系统完全没有!

请注意,这是隐含的DNS / iptables交互问题。 观察“修复DNS,你会解决你的问题”只是从不同的angular度来重述问题。

问题是:具体来说,关于这个防火墙的configuration是什么,当相同的机器,相同的操作系统等,在同样的iptablesconfiguration下工作正常时,以及与同样精确的testing系统(以及任何可能对/错的它的resolve.conf)。

(另外请注意:我认为这个问题没有评论为什么要投下这个蛮胆的)。

例子:

 [root@MyHost sysconfig]# ping google.com ping: unknown host google.com [root@MyHost sysconfig]# ping 74.125.224.82 PING 74.125.224.82 (74.125.224.82) from 192.168.127.16 : 56(84) bytes of data. 64 bytes from 74.125.224.82: icmp_seq=0 ttl=53 time=46.425 msec 64 bytes from 74.125.224.82: icmp_seq=1 ttl=53 time=45.486 msec --- 74.125.224.82 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/mdev = 45.486/45.955/46.425/0.516 ms [root@MyHost sysconfig]# 

背景信息:

  • 新的防火墙,新的Fedora Core 14安装上的旧硬件 – 这两个网关系统与我可以做到的完全相同。

  • NetworkManager(适当)closures。

  • DNSconfiguration在防火墙和内部节点上似乎都很好 – 没有DNS服务(BIND等)在这里使用,只是公共DNS服务器。 从两个网关访问DNS服务都很好。

  • iptables指令“-A FORWARD -m状态 – 状态ESTABLISHED,相关的-j ACCEPT”应该使DNS消息毫无困难地通过,就像ping的例子一样,但是用挖掘,我只是不知道。

  • 我添加了“-A INPUT -m limit -limit 3 / min -j LOG -log-prefix”FW-IN-DROP-DEFAULT“–log-tcp-options –log-ip-options”一个尝试的答案,而NO LOGGING是由于这个失败的DNS调用与这个例子中提到的ping相关的。

我不知道是否应该使用实际的MASQUERADING而不是SNAT / DNAT。

/ etc / sysconfig / iptables的内容:

 *nat :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 192.168.127.0/24 -o eth0 -j SNAT --to-source 76.110.113.22 -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.127.50 -A PREROUTING -i eth0 -p tcp --dport 1234 -j DNAT --to-destination 192.168.127.61:99 -A PREROUTING -i eth0 -p tcp --dport 993 -j DNAT --to-destination 192.168.127.50 -A PREROUTING -i eth0 -p tcp --dport 995 -j DNAT --to-destination 192.168.127.50 COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A FORWARD -i lo -j ACCEPT -A FORWARD -i eth2 -j ACCEPT -A FORWARD -o eth2 -j ACCEPT -A FORWARD -i eth0 -m state --state NEW -m tcp -p tcp -d 192.168.127.50 --dport 25 -j ACCEPT -A FORWARD -i eth0 -m state --state NEW -m tcp -p tcp -d 192.168.127.61 --dport 99 -j ACCEPT -A FORWARD -i eth0 -m state --state NEW -m tcp -p tcp -d 192.168.127.50 --dport 993 -j ACCEPT -A FORWARD -i eth0 -m state --state NEW -m tcp -p tcp -d 192.168.127.50 --dport 995 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT 

你的问题是,DNS不能正常工作。

从防火墙的angular度来看,它不能分辨是否键入:

 $ ping google.com 

要么:

 $ ping 2001:4860:800f::63 

修复DNS,你会解决你的问题。


为了帮助诊断,请尝试添加一些规则,例如:

 -A INPUT -m limit --limit 3/min -j LOG --log-prefix "FW-IN-DROP-DEFAULT " --log-tcp-options --log-ip-options 

在你的拒绝规则之前。 那么你会知道是否被丢弃。