我花了大概6个小时试图解决这个问题,现在我认为当连接到一个具有IPv6地址的主机名时,CentOS / Linux无法绑定到特定的虚拟IPv4地址。 这是有多个IP地址的服务器上的问题。
我正在使用Centos 6(Linux内核2.6.32-573.12.1.el6.x86_64)
重现这个巨大的:
telnet -b 30.0.0.2 www.microsoft.com 80 (此testing使用特定的ipv4地址进行出站连接) telnet -b 30.0.0.2 serverfault.com 。 有用。 它使你想要的IP连接。 这是一个问题,因为某些程序(如邮件(exim))在发出出站TCP请求时需要使用某些IP,这不一定是主机的IP。 当进行出站TCP连接时,机器上的某些客户端/程序依靠ACL或反向DNS来正确匹配。
所以,如果其他人注意到他们的程序无法绑定到正确的接口进行传出连接的同一个奇怪的问题,这可能是为什么。
此问题仅影响IPv4连接。 IPv6连接正确地绑定到您在机器上具有的任何传出IP。
这对于telnet来说不是问题。 我也使用我的邮件服务器(exim)testing了这个问题,并得到了类似的结果。 如果目标主机名具有IPv6地址,则它将从错误的IP进行IPv4连接。
也许有人有这个奇怪的问题的解决scheme,但在这个时候,我认为这可能是一个Linuxnetworking的错误。
Ps-如果有人想知道如果主机名parsing为IPv6地址,为什么不build立IPv6连接?有时IPv6地址closures或者连接无法build立,那么它将恢复到它的IPv4地址。
你可以信任netstat给你正确的IP地址信息(至less和-n )。
如果TCP连接的端点不同意使用哪个IP地址,则意味着两者之间存在NAT。
从评论中提供的附加信息中,我们了解到,在这种特殊情况下,一个多余的iptables规则-A POSTROUTING -j MASQUERADE是导致问题的原因。