我的服务器(运行在 Ubuntu 12.04 上)位于 NAT 后面,必须访问具有公共 IP 地址(64.*.*.*
)的特定服务。
问题是我无法访问该特定公共 IP(同一服务的所有其他 IP 地址均可使用;该域已分配了多个 IP 地址)。可以从另一个相同的环境访问相同的 IP 地址。NAT 服务器(我通过它)也可以访问它。
我的服务器上的 Tcpdump 仅显示 SYN 包,而在 NAT 上则不显示来自我的服务器的任何流量。该 IP 未被 NAT 服务器上的 iptables 阻止。同一服务的另一个 IP 工作正常。
方案:
我的服务器 -> 我的 NAT -> (无法访问)公共 IP
路由表:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.10.2.200 0.0.0.0 UG 0 0 0 eth0
10.10.0.0 10.10.2.1 255.255.255.0 UG 0 0 0 eth0
10.10.2.0 0.0.0.0 255.255.254.0 U 0 0 0 eth0
10.10.9.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
eth0 的 IP 地址:10.10.2.51
我发现(通过比较 tcpdumps 中的 MAC 地址并查看 arp 表)服务器不是转向我的默认网关,而是尝试通过 10.10.2.1 建立连接(但仅限于该公共 IP)64.*.*.*
,这让我很困惑。
答案1
我认为我解决了这个问题。不幸的是,我不知道我做的两件事中的哪一件解决了这个问题。
首先,我从不同的子网(10.10.8.51)添加了一个接口,更改了 NAT 服务器 IP 地址(10.10.8.200)并通过该接口发送所有默认流量。
其次,我发现 NAT 服务器执行了 ICMP 重定向,因此我禁用了接受重定向。我实际上认为这是导致我出现问题的原因,但我没有时间在暂存环境中对其进行测试。
# sysctl -w net.ipv4.conf.eth2.accept_redirects = 0
# sysctl -w net.ipv4.conf.eth2.send_redirects = 0
# sysctl -w net.ipv6.conf.eth2.accept_redirects = 0
# sysctl -w net.ipv6.conf.eth2.send_redirects = 0