在Linux实例中访问外部网络地址, 提示“Network is unreachable”错误怎么办?

本文介绍在Linux实例中访问外部网络地址,提示“Network is unreachable”错误的解决方案。

问题描述

在Linux系统的ECS实例中访问外部网络地址,提示Network is unreachable错误。

问题原因

该问题可能是由于实例缺失默认路由配置,导致无法为数据包确定适当的发送目标,进而阻碍了对外部网络的访问。

解决方案

VPC网络内的ECS实例推荐优先使用DHCP动态获取IP配置和默认路由配置,这样可以避免大多数由于静态IP配置不当导致默认路由缺失引起的网络不通问题。

静态IP配置修改为动态IP配置的方法,请参见Linux实例中本地网卡的DHCP配置检查与修复

步骤一:获取默认网关IP地址

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

  1. 找到连接到同一虚拟交换机的其它实例,登录该实例。

  2. 执行以下命令,查看同一虚拟交换机的网卡并记录其MAC地址。

    ip addr

    系统显示类似如下,主网卡eth0与问题实例连接到同一虚拟交换机,其MAC地址为00:16:52:07:**:**

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:**:**:**:** brd 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:**:** brd ff:ff:ff:ff:ff:ff
        inet 172.16.*.***/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