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

发布时间:2020-06-28 整理:编程之家
编程之家收集整理的这篇文章主要介绍了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就是问题的原因.

总结

以上是编程之家为你收集整理的linux – 在进行出站TCP连接时,无法绑定到特定的IPv4地址,也不能绑定到同时解析为IPv4和IPv6地址的主机名全部内容,希望文章能够帮你解决linux – 在进行出站TCP连接时,无法绑定到特定的IPv4地址,也不能绑定到同时解析为IPv4和IPv6地址的主机名所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!