连接RDS实例失败,ping RDS实例内网地址时提示Destination Host Unreachable

连接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实例的内网网段与其他服务的网段冲突。

分析过程

  1. 使用PING命令ping RDS内网地址,可以看到RDS内网IP。从上述例子中,可以看到RDS实例内网IP为172.17.0.31

  2. 以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系统为例,操作如下。

  1. 停止Docker服务。

    sudo systemctl stop docker
  2. 编辑Docker配置文件。Docker配置文件通常位于/etc/docker/daemon.json/etc/docker/daemon.conf(具体文件名可能有所不同)。

    sudo vim /etc/docker/daemon.json

    确保文件内容如下。

    {
        "bip": "新的网络网段"
    }

    例如,将新的网络网段设置为192.168.0.0/16。

  3. 保存并关闭配置文件。

  4. 启动Docker服务使修改生效。

    sudo systemctl start docker

方案二:切换RDS实例的交换机

您可以切换RDS实例的交换机,使实例的交换机网段不与容器服务的网段冲突。

重要

默认情况下,不同VPC之间无法内网互通。建议仅切换交换机,不切换VPC,这样不会影响其他阿里云服务与RDS实例的内网连接。

相关文档