连接RDS实例失败,且ping RDS内网地址时提示Destination Host Unreachable
。
问题现象
从ECS实例无法ping通RDS内网地址,返回Destination Host Unreachable
。
PING rm-bpxxxx.mysql.rds.aliyuncs.com (172.17.0.31) 56(84) bytes of data.
From xxxx (172.17.0.1) icmp_seq=1 Destination Host Unreachable
From xxxx (172.17.0.1) icmp_seq=2 Destination Host Unreachable
From xxxx (172.17.0.1) icmp_seq=3 Destination Host Unreachable
问题原因
原因通常是RDS实例的内网网段与其他服务的网段冲突。
分析过程
使用PING命令ping RDS内网地址,可以看到RDS内网IP。从上述例子中,可以看到RDS实例内网IP为
172.17.0.31
。以Linux系统为例,执行
route-n
命令查看路由,返回信息类似如下。Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.2.253 0.0.0.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 172.17.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br-350b446c181a
返回信息显示网卡
br-350b446c181a
的网段为172.17.0.0/24
,与RDS内网IP地址冲突,导致ECS实例无法路由到RDS实例。这种情况通常是容器服务的网段与RDS网段冲突。下面以容器服务为例,介绍如何解决路由冲突问题。
解决方案
方案一:修改容器服务的默认网段
本方案不适用RDS SQL Server实例,RDS SQL Server实例请直接参考方案二处理。
停止Docker或者修改Docker默认网段会中断业务,建议业务低峰期进行操作。
修改Docker默认网段时请确保与任何现有容器和应用程序的网络设置兼容,以避免潜在的连接问题。
以Linux系统为例,操作如下。
停止Docker服务。
sudo systemctl stop docker
编辑Docker配置文件。Docker配置文件通常位于
/etc/docker/daemon.json
或/etc/docker/daemon.conf
(具体文件名可能有所不同)。sudo vim /etc/docker/daemon.json
确保文件内容如下。
{ "bip": "新的网络网段" }
例如,将新的网络网段设置为192.168.0.0/16。
保存并关闭配置文件。
启动Docker服务使修改生效。
sudo systemctl start docker
方案二:切换RDS实例的交换机
您可以切换RDS实例的交换机,使实例的交换机网段不与容器服务的网段冲突。
默认情况下,不同VPC之间无法内网互通。建议仅切换交换机,不切换VPC,这样不会影响其他阿里云服务与RDS实例的内网连接。