我配置了两台虚拟机,都运行 Debian Wheezy,以便将它们用作同一 NAT 网络中的服务器和客户端系统。正如 ping 所示,它们都能够互相访问。
今天我在服务器上配置了 Squid 代理,但是通过 PAM 身份验证访问代理或通过将 HTTP 流量重定向到其端口来访问代理(在将 Squid 配置为透明代理之后)都不起作用,即使我花了几个小时检查和修改配置,我也无法解决这个问题。
然而,我在这里想问的具体问题与 iptable 条目的一个完全奇怪的行为有关,该条目通常应该将 HTTP 流量重定向到 Squid 端口 - 尽管我也花了相当多的时间来搜索这个问题,但我找不到其他遇到这种行为的人。
iptables 命令非常容易理解,正如我所说:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
该条目也出现在 NAT 表的 PREROUTING 链中:
iptables -t nat -L -n -v
链 PREROUTING(策略接受 10 个数据包,4249 字节)pkts 字节目标 prot 选择加入退出源目标
0 0 REDIRECT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 3128
尽管如此,这条规则还是被忽略了,因为 traceroute 没有显示我的 Squid 代理的 NAT IP 作为第一跳,而是标准网关 (10.0.0.1)。Squid 日志还显示它没有收到任何请求。
我将此配置作为各种 Linux 管理任务的一部分,其他几个人在相同的虚拟 Debian Wheezy 系统上使用完全相同的配置(包括服务器和客户端系统的 Virtual Box 的相同 NAT 配置)时没有遇到任何问题。经验丰富的 Linux 系统管理员也无法找到这种奇怪现象的任何解释。
我可以访问网站,所以我猜想 PREROUTING 链会被忽略。
因为我真的想知道这种行为的原因是什么,所以我对 iptables 命令运行了 strace,也许输出中的一些内容有助于找到解释:
strace iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
strace iptables -t nat -L -n -v
如果有人知道这种奇怪行为的原因是什么,我将不胜感激。
提前致谢
大卫