我正在使用Centos 6(Linux内核2.6.32-573.12.1.el6.x86_64)
重现这个大:
>查找至少具有/ 29 IPv4公共地址空间和IPv6公共IP的Linux计算机.
>为主接口(eth0或其他)至少添加一个额外的IPv4.对于此示例,我将30.0.0.1视为计算机的主要eth0 IPv4地址,30.0.0.2是在30.0.0.0/29的网络上绑定到eth0:2的别名.
>查找同时具有IPv4和IPv6地址的主机名.例如,www.microsoft.com.
> telnet -b 30.0.0.2 www.microsoft.com 80(此测试使用特定的ipv4地址进行出站连接)
>尝试主机名的IPv6地址失败后,IPv4请求成功连接,但TCP连接实际上是从计算机的主IP(30.0.0.1)启动的,而不是您想要的IP(30.0.0.2). Netstat说不然,但是错了.如果连接到您拥有的主机名并且可以查看其日志,则连接来自主IP(30.0.0.1)而不是您想要的IP(30.0.0.2).
>尝试另一个没有IPv6地址的域,例如:telnet -b 30.0.0.2 serverfault.com.有用.它通过您想要的IP建立连接.
这是一个问题,因为某些程序(如邮件(exim))在发出出站TCP请求时需要使用某些IP,这不一定是主机的IP.在进行出站TCP连接时,计算机上的某些客户端/程序依赖ACL或反向DNS来正确匹配.
因此,如果其他人注意到在进行传出连接时程序无法绑定到正确的接口的同样奇怪的问题,这可能就是原因.
此问题仅影响IPv4连接. IPv6连接正确绑定到计算机上的任何传出IP.
这不是telnet的问题.我也使用我的邮件服务器(exim)测试了这个问题,并得到了类似的结果.如果目标主机名具有IPv6地址,则从错误的IP进行IPv4连接.
也许某人有解决这个奇怪问题的方法,但此时,我认为这可能是一个Linux网络错误.
Ps-如果有人想知道为什么不在主机名解析为IPv6地址时建立IPv6连接…有时IPv6地址已关闭或连接无法建立,则它将恢复为其IPv4地址.
解决方法
如果TCP连接的端点不同意正在使用的IP地址,则意味着两者之间存在NAT.
从评论中提供的其他信息中我们了解到,在这种特殊情况下,一个多余的iptables规则-A POSTROUTING -j MASQUERADE就是问题的原因.