问题描述:
两个网关(“防火墙”)系统中有一个发生故障,因此我在替换硬件上生成了一个“相同”的系统,并发现当我将其中一台内部机器切换到新网关时,ping 失败。切换回来后,它正常工作了。因此,我尝试使用 IP 进行 ping,避免使用 DNS,并且成功了。在故障排除过程中,我发现如果我通过旧网关路由,我可以正常运行“dig”,但通过新网关,它会失败,并显示以下内容:
[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]#
如果我将其切换回另一个网关,一切都会正常。这表明客户端盒子没有问题,但防火墙实际上并不相同,尽管看起来是相同的。
我添加了丢弃数据包的日志记录,但内部系统根本没有任何内容!
请注意,这隐含着 DNS / iptables 交互问题。观察“修复 DNS 并且你就会解决你的问题”只是从不同的角度重新表述问题。
问题是:当相同的机器、相同的操作系统等使用相同的 iptables 配置和完全相同的测试系统(以及其 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(适当地)关闭。
防火墙和内部节点上的 DNS 配置似乎都很好 - 这里没有使用 DNS 服务(BIND 等),只有公共 DNS 服务器。从两个网关访问 DNS 服务都很好。
iptables 指令“-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT”应该可以让 DNS 消息顺利通过,就像 ping 示例一样,但对于 dig,我就不知道了。
我按照尝试回答中的建议添加了“-A INPUT -m limit --limit 3/min -j LOG --log-prefix“FW-IN-DROP-DEFAULT“--log-tcp-options --log-ip-options”,由于与示例中引用的 ping 相关的 DNS 调用失败,因此没有执行任何日志记录。
我想知道我是否应该使用实际的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
答案1
您的问题是 DNS 不起作用。
从防火墙的角度来看,它无法判断您是否输入了:
$ 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
在您的 REJECT 规则之前。然后您就会知道它是否被丢弃。