首页 >Linux系统的ECS实例中缺少默认路由配置导致无法访问网络

Linux系统的ECS实例中缺少默认路由配置导致无法访问网络

问题描述

在阿里云Linux系统的ECS实例中,访问部分或者全部的非本实例的网络地址,提示“Network is unreachable”错误。

排查方法

ECS实例无法访问部分网络或者非本实例的网络的排查方法如下:

  1. 执行以下命令,通过curl命令访问http://example.com网站。
    curl http://example.com
    系统返回结果类似如下:
    curl: (7) Failed to connect to [$IP]: Network is unreachable
    说明:[$IP]为example.com网站对应的IP地址。
  2. 执行以下命令,查看网卡状态和IP配置状态。
    ip addr
    系统显示类似如下,配置正常。
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:16:3e:14:66:30 brd ff:ff:ff:ff:ff:ff
        inet 172.16.2.248/24 brd 172.16.2.255 scope global eth0
           valid_lft 311974909sec preferred_lft 311974909sec
        inet6 fe80::216:3eff:fe14:6630/64 scope link 
           valid_lft forever preferred_lft forever
  3. 执行以下命令,查看/etc/resolv.conf配置文件中的DNS服务器配置。
    cat /etc/resolv.conf
    系统显示类似如下,配置正常。
    options timeout:2 attempts:3 rotate single-request-reopen
    ; generated by /usr/sbin/dhclient-script
    nameserver 100.100.2.136
    nameserver 100.100.2.138
  4. 执行以下命令,查看路由配置,发现缺少以default开头的默认路由配置。
    ip route
    系统显示类似如下。
    100.64.0.0/10 via 172.16.2.253 dev eth0
    169.254.0.0/16 dev eth0 scope link metric 1002 
    172.16.2.0/24 dev eth0 proto kernel scope link src 172.16.2.248

问题原因

网络传输的IP协议数据包需要通过路由来确定其下一跳的发送目标。如果在路由表中无法找到匹配的路由条目,就无法确定数据包应该传输到何处,从而反映为目标地址无法到达。例如,上面的路由表中就缺少匹配example.com网站对应主机的路由,因此导致无法访问该网址。

  • 默认情况下,通过DHCP获取或者通过手动配置一个匹配任意IP地址的路由,即默认路由。示例如下:
    default via 172.16.2.253 dev eth0
    说明
    • 172.16.2.253为默认网关。
    • eth0为发送出口网卡。
  • 缺少默认路由会使得只能访问路由表中剩余的路由条目所能匹配的地址,除此之外的均无法访问。例如,上面的路由表中缺少了默认路由,但是存在能够转发匹配100.64.0.0/10的IP地址的路由,因此可以访问如100.100.100.200的有限的网络地址,但是无法访问IP地址为[$IP]example.com网站的主机。

解决方案

VPC网络内的ECS实例推荐优先使用DHCP动态获取IP配置和默认路由配置,这样可以避免大多数由于静态IP配置不当导致默认路由缺失引起的网络不通问题。从静态IP配置修改为动态IP配置的方法请参见Linux实例中本地网卡的DHCP配置检查与修复。继续使用静态IP配置修复默认路由配置的方法如下:

获取默认网关IP地址

如果问题实例已经无法访问任意的非本示例地址,那么需要从连接到同一虚拟交换机的其它实例上获取默认网关的IP地址:

  1. 找到连接到同一虚拟交换机的其它实例,登录该实例。
  2. 行以下命令,查看同一虚拟交换机的网卡并记录其MAC地址。
    ip addr
    系统显示类似如下,主网卡eth0与问题实例连接到同一虚拟交换机,其MAC地址为00:16:52:07:13:06
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:16:52:07:13:06 brd ff:ff:ff:ff:ff:ff
        inet 172.16.2.214/24 brd 172.16.2.255 scope global eth0
           valid_lft 311974909sec preferred_lft 311974909sec
        inet6 fe80::216:52ff:fe07:1306/64 scope link 
           valid_lft forever preferred_lft forever
  3. 通过执行以下命令,请求实例元数据服务器,获取默认网关IP地址。
    说明:如果问题实例还可以ping通实例元数据服务器100.100.100.200,也可以在问题实例中执行以下命令,选择需要作为默认数据包出口的网卡即可,通常为主网卡eth0。
    curl http://100.100.100.200/latest/meta-data/network/interfaces/macs/[$MAC_Address]/gateway
    说明:[$MAC_Address]为上一步中获取的MAC地址。

临时配置默认路由

  1. 执行以下命令,可以快速向路由表中添加默认路由,而无需修改网卡配置和重启网络服务,但是关机或者重启以后会失效。
    ip route add default via [$Gateway_IP] dev [$Network]
    说明
    • [$Gateway_IP]为获取默认网关IP地址中获取的默认网关IP地址。
    • [$Network]为获取默认网关IP地址中与问题实例在同一虚拟交换机中查询默认网关时的网卡。
  2. 执行以下命令,查看路由表,可以看到已经添加了默认路由。
    ip route
    系统显示类似如下。
    default via 172.16.2.253 dev eth0 
    10.64.0.0/10 via 172.16.2.253 dev eth0
    169.254.0.0/16 dev eth0 scope link metric 1002 
    172.16.2.0/24 dev eth0 proto kernel scope link src 172.16.2.248
    说明:例如,配置默认网关为172.16.2.253,默认出口网卡为主网卡为eth0。

长期配置默认路由

稳定配置默认路由需要修改网卡配置文件,如果需要立即生效,还需要重启网络服务,有可能引起网络断流。以下操作以CentOS 7.9系统为例,其它Linux发行版本需要参考对应的系统文档和网络配置文档。

  1. 编辑默认数据包出口网卡的/etc/sysconfig/network-scripts/ifcfg-eth0配置文件,将以上步骤中记录的网关信息填写到该配置文件中,保存并退出。例如,以主网卡eth0为默认数据包出口网卡,网关IP地址为172.16.2.253
    DEVICE=eth0
    TYPE=Ethernet
    BOOTPROTO=static
    ONBOOT=yes
    STARTMODE=auto
    IPADDR=172.16.2.248
    NETMASK=255.255.255.0
    GATEWAY=172.16.2.253
  2. 执行以下命令,重启网络服务。 
    systemctl restart network

适用于

  • 云服务器ECS
阿里云首页 相关技术圈