在 Azure Linux 虚拟机中配置多个网络接口

适用于:✔️ Linux VM

注意

本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期指南

本文介绍如何在运行最常见 Linux 分发版的 Azure Linux 虚拟机(VM)中配置多个虚拟网络接口。

总结

可以创建一个附加到它的多个网络接口的 Azure VM。 常见方案是具有用于前端和后端连接的不同子网,或者专用于监视或备份解决方案的网络。

本文提供了多个网络接口在基于以下示例方案的 Azure Linux VM 中工作所需的配置:

  • VM 在同一子网中具有两个或多个网络接口。
  • VM 在不同的子网中具有两个或多个网络接口,但在同一个虚拟网络(VNET) 中。

有关详细信息,请参阅以下屏幕截图:

在每个方案中,都可以从同一 VNET 中的任何 VM 测试连接。

重要

在具有两个以上的 NIC 的 VM 中,也可以遵循相同的过程。

为多个网络接口配置来宾 OS

向 Linux VM 添加多个网络接口时,必须创建路由规则。 这些规则使 VM 能够发送和接收属于特定网络接口的流量。 否则,无法正确处理流量。 例如,属于 eth1 的流量不能由定义的默认路由正确处理。

以下部分提供了两个网络接口在运行最常见 Linux 分发版的 Linux VM 中所需的配置。

注意

使用根权限运行以下部分中的所有命令(通过切换到根权限或使用 sudo 命令实用工具)。

在每个部分中,假设 VM 有两个具有以下设置的网络接口:

  • 路由(命令的 sudo ip route show 输出):

    • 同一子网中的两个 NIC:

      default via 10.0.1.1 dev eth0 proto static metric 100
      10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.4 metric 100
      10.0.1.0/24 dev eth1 proto kernel scope link src 10.0.1.5 metric 101
      168.63.129.16 via 10.0.1.1 dev eth0 proto dhcp metric 100
      169.254.169.254 via 10.0.1.1 dev eth0 proto dhcp metric 100
      
    • 不同子网中的两个 NIC,但位于同一 VNET 中:

      default via 10.0.1.1 dev eth0 proto static metric 100
      10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.4 metric 100
      10.0.2.0/24 dev eth1 proto kernel scope link src 10.0.2.5 metric 101
      168.63.129.16 via 10.0.1.1 dev eth0 proto dhcp metric 100
      169.254.169.254 via 10.0.1.1 dev eth0 proto dhcp metric 100
      
  • 接口(命令的 sudo ip address show 输出):

    • 同一子网中的两个 NIC:

      lo: inet 127.0.0.1/8 scope host lo
      eth0: inet 10.0.1.4/24 brd 10.0.1.255 scope global eth0
      eth1: inet 10.0.1.5/24 brd 10.0.1.255 scope global eth1
      
    • 不同子网中的两个 NIC,但位于同一 VNET 中:

      lo: inet 127.0.0.1/8 scope host lo
      eth0: inet 10.0.1.4/24 brd 10.0.1.255 scope global eth0
      eth1: inet 10.0.2.5/24 brd 10.0.2.255 scope global eth1
      
  1. 通过运行以下命令将两个路由表添加到 /etc/iproute2/rt_tables 文件(每个 NIC 需要一个条目):

    sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
    sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
    

    如果将更多网络接口附加到 VM,请添加额外的路由表(例如 202 eth2-rt203 eth3-rt 等)。

  2. 请确保 /etc/sysconfig/network-scripts/ 目录中每个网络接口都存在配置文件。 可以根据 ifcfg-eth0 配置文件创建新的网络接口配置文件(修改DEVICE行并从新文件中删除DHCP_HOSTNAMEHWADDR行)。 为此,请运行以下命令:

    sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0 > /etc/sysconfig/network-scripts/ifcfg-eth1
    sudo sed -i 's/DEVICE=eth0/DEVICE=eth1/' /etc/sysconfig/network-scripts/ifcfg-eth1
    sudo sed -i '/DHCP_HOSTNAME/d' /etc/sysconfig/network-scripts/ifcfg-eth1
    sudo sed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth1
    
  3. 若要在网络堆栈激活期间持久更改并应用更改,请编辑文件 /etc/sysconfig/network-scripts/ifcfg-eth0/etc/sysconfig/network-scripts/ifcfg-eth1ifcfg-eth2ifcfg-eth3 等),如果 VM 具有两个以上的网络接口,则更改yes其值NM_CONTROLLEDno 为此,请运行以下命令:

    sudo cp -rp /etc/sysconfig/network-scripts/ifcfg-eth0 /tmp/ifcfg-eth0.bkp
    sudo cp -rp /etc/sysconfig/network-scripts/ifcfg-eth1 /tmp/ifcfg-eth1.bkp
    sudo sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' /etc/sysconfig/network-scripts/ifcfg-eth0
    sudo sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' /etc/sysconfig/network-scripts/ifcfg-eth1
    

    注意

    使用cat /etc/sysconfig/network-scripts/ifcfg-eth*命令验证该NM_CONTROLLED=no行是否已添加到 /etc/sysconfig/network-scripts/ifcfg-eth0/etc/sysconfig/network-scripts/ifcfg-eth1 文件。 如果行不在文件中,请使用 sudo echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0sudo echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth1 命令手动添加它。

  4. 修改此配置后,通过运行以下命令重启网络服务以应用更改:

    sudo systemctl restart network
    
  5. 使用任何文本编辑器(在以下示例中使用 vi 编辑器)创建相应的规则和路由文件,并将相应的规则和路由添加到每个文件。 使用以下步骤为每个网络接口创建一组 rule-eth#route-eth# 文件。 在每个步骤中相应地替换 IP 地址和子网信息。 如果有更多的网络接口,请使用相应的 IP 地址、网络和网关详细信息为每个接口创建相同的规则 eth# 和 route-eth# 文件集

    • eth0 创建规则和路由:

      1. 若要为 eth0 创建规则文件,请打开文件 /etc/sysconfig/network-scripts/rule-eth0

        sudo vi /etc/sysconfig/network-scripts/rule-eth0
        
      2. 将以下内容添加到规则文件。 相应地替换 IP 地址,确保在配置中指定 IPv4 地址,并保留 32 位值:

        from 10.0.1.4/32 table eth0-rt
        to 10.0.1.4/32 table eth0-rt
        
      3. 若要为 eth0 创建路由文件,请打开文件 /etc/sysconfig/network-scripts/route-eth0

        sudo vi /etc/sysconfig/network-scripts/route-eth0
        
      4. 将以下内容添加到路由文件。 相应地替换网络和网关值。

        10.0.1.0/24 dev eth0 table eth0-rt
        default via 10.0.1.1 dev eth0 table eth0-rt
        
    • eth1 创建规则和路由:

      1. 若要为 eth1 创建规则文件,请打开文件 /etc/sysconfig/network-scripts/rule-eth1

        sudo vi /etc/sysconfig/network-scripts/rule-eth1
        
      2. 将以下内容添加到规则文件。 相应地替换 IP 地址,确保你在命令中指定 IPv4 地址,并保留 32 位值。

        • 同一子网中的两个 NIC:

          from 10.0.1.5/32 table eth1-rt
          to 10.0.1.5/32 table eth1-rt
          
        • 不同子网中的两个 NIC,但位于同一 VNET 中:

          from 10.0.2.5/32 table eth1-rt
          to 10.0.2.5/32 table eth1-rt
          
      3. 若要为 eth1 创建路由文件,请打开文件 /etc/sysconfig/network-scripts/route-eth1

        sudo vi /etc/sysconfig/network-scripts/route-eth1
        
      4. 将以下内容添加到路由文件。 相应地替换网络和网关值。

        • 同一子网中的两个 NIC:

          10.0.1.0/24 dev eth1 table eth1-rt
          default via 10.0.1.1 dev eth1 table eth1-rt
          
        • 不同子网中的两个 NIC,但位于同一 VNET 中:

          10.0.2.0/24 dev eth1 table eth1-rt
          default via 10.0.2.1 dev eth1 table eth1-rt
          
  6. 若要应用更改,请运行以下命令以重启网络服务:

    sudo systemctl restart network
    

    路由规则现在已正确设置,并且连接应从任何网络接口运行。 可以使用安全外壳(SSH)测试连接性,也可以从同一 VNET 中的 VM 中 ping 这两个 IP。

  7. 使用以下命令验证当前路由和规则是否已加载:

    sudo ip route show
    sudo ip rule show
    

重要

如果仍存在与第二个 NIC 通信的问题,请使用 sudo reboot 命令重启 VM,重复步骤 7,然后再次测试连接。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区