linux – 在进行出站TCP连接时,无法绑定到特定的IPv4地址,也不能绑定到同时解析为IPv4和IPv6地址的主机名

我花了大约6个小时试图解决这个问题,现在我相信当连接到具有IPv6地址的主机名时,CentOS / Linux无法绑定到特定的虚拟IPv4地址.这是具有多个IP地址的服务器上的问题.

我正在使用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地址.

解决方法

您可以信任netstat为您提供有关IP地址的正确信息(至少只要使用-n).

如果TCP连接的端点不同意正在使用的IP地址,则意味着两者之间存在NAT.

从评论中提供的其他信息中我们了解到,在这种特殊情况下,一个多余的iptables规则-A POSTROUTING -j MASQUERADE就是问题的原因.

相关文章

文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限...
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Wi...
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Lin...
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,...
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 Open...