RDS Custom网络简介

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍RDS Custom网络默认配置,以及如何配置自定义镜像的网络初始化。

RDS Custom网络简介

RDS Custom实例(双网卡模式)默认配置了两块网卡,一块主网卡(通常命名为eth0),另一块弹性网卡(通常命名为eth1)。

  • eth0:创建于管控VPC下,由于安全组的限制,仅允许ECS管控网段100.100.0.0/16的流量通过eth0接口出。

    说明

    100.100.2.136100.100.2.138是内网DNS IP地址,需通过eth1进出。

  • eth1:创建于用户VPC网络下,正常情况下,除ECS管控网段外,所有流量均通过eth1进出,用户通过安全组管理进出流量。

正常情况下,连接RDS Custom实例后,其网卡、路由表和iptables防火墙规则如下:

  • 执行ip address show命令,查看实例网卡状态。

    image

  • 执行route -n命令,查看实例路由表。

    流量仅通过eth1网卡进行传输。

    image

  • 执行iptables -L -n命令,查看实例iptables默认配置。

    image

如果您对RDS Custom实例路由表、iptables防火墙规则及网卡配置(包括重启eth0)等进行了操作,导致无法连接到RDS Custom实例,您可以通过重启实例来初始化RDS Custom网络。

警告

RDS Custom实例通过/etc/rds_custom_init.sh脚本进行网络初始化,请勿删除该脚本,以免导致无法进行初始化。

配置自定义镜像的网络初始化

通过自定义镜像创建RDS Custom实例时,对于大多数的公共镜像,RDS Custom会自动配置/etc/rds_custom_init.sh脚本,实现网络初始化。目前支持的镜像包括Alibaba Cloud Linux 3、Alibaba Cloud Linux 2、CentOS 8、CentOS 7、Debian 11、Debian 10.5、AlmaLinux 9.2、Ubuntu 22、Ubuntu 20Ubuntu 16。如需使用其他自定义镜像,在创建自定义镜像前,需要在原镜像实例中手动创建rds_custom_init.sh脚本。

rds_custom_init.sh脚本的主要功能是:

  1. 针对无法自动激活弹性网卡的系统,执行eth1的网络配置,并启动相关服务。

  2. 修改路由配置,将默认路由指向eth1,并将ECS管控网段100.100.0.0/16指向eth0。

  3. 修改路由配置,将内网DNS IP地址100.100.2.136100.100.2.138指向eth1。

重要

启动RDS Custom实例时,系统会将eth0的网关记录在/etc/eth0_gateway,并对大多数的公共镜像自动配置/etc/rds_custom_init.sh脚本。如果您计划对RDS Custom实例进行网络相关的初始化,请确保在网络初始化完成后,手动执行/etc/rds_custom_init.sh脚本。如果发现eth1无法服务(例如IP地址未被识别),请联系我们,或对网络进行配置,以确保eth1正常运行。

手动创建脚本并设置开机自启动

  1. 在/etc目录下创建rds_custom_init.sh脚本,脚本的具体内容如下。

    rds_custom_init.sh脚本

    #!/bin/bash
    echo "RDS CUSTOM INIT START, $(date)" >> /tmp/rds_custom_init.log
    flag=0
    for ((i=1; i<=5; i++)); do
        eth1_ip=$(ip address show eth1 | grep "inet " | awk "{print \$2}" | cut -d'/' -f1)  
        if [[ -n "$eth1_ip" ]]; then
            break
        else
            sleep 1
        fi
    done
    eth0_gateway=$(ip route | grep "default via " | grep "eth0" | awk "{print \$3}")
    # check eth0_gateway
    if [ -z "$eth0_gateway" ]; then
        if [ -f /etc/eth0_gateway ]; then
            eth0_gateway=$(cat /etc/eth0_gateway)
        else
            echo "No gateway found for eth0, and /etc/eth0_gateway file does not exist." >> /tmp/rds_custom_init.log
            exit 0
        fi
    fi
    if [ -z "$eth1_ip" ] && ip address show | grep -q "eth1"; then
        if lsb_release -a 2>/dev/null | grep -q -e "Ubuntu 16.04" -e "Debian"; then
          sed -i 's/eth0/eth1/g' /etc/network/interfaces
          echo "auto eth0" >> /etc/network/interfaces
          echo "iface eth0 inet dhcp" >> /etc/network/interfaces
          sudo systemctl restart networking
          flag=1
          echo "UP ETH1 FOR UBUNTU 16.04 or Debian, $(date)" >> /tmp/rds_custom_init.log
        else   
          HWADDR=$(ip address show eth1 | grep "link/ether" | awk "{print \$2}")
          echo -e "DEVICE=eth1\nBOOTPROTO=dhcp\nONBOOT=yes\nTYPE=Ethernet\nUSERCTL=yes\nPEERDNS=no\nIPV6INIT=no\nPERSISTENT_DHCLIENT=yes\nHWADDR=$HWADDR\nDEFROUTE=yes" | tee /etc/sysconfig/network-scripts/ifcfg-eth1 > /dev/null
          service network restart
          echo "UP ETH1, $(date)" >> /tmp/rds_custom_init.log
        fi
    fi
    eth1_ip=$(ip address show eth1 | grep "inet " | awk "{print \$2}" | cut -d'/' -f1)
    if [ "$flag" -eq 0 ] && lsb_release -a 2>/dev/null | grep -q "Ubuntu 16.04"; then
      sudo systemctl restart networking
      echo "UP ETH1 FOR UBUNTU 16.04, $(date)" >> /tmp/rds_custom_init.log
    fi
    if [ -n "$eth1_ip" ]; then
        ip route add 100.100.0.0/16 via $eth0_gateway dev eth0 2> /dev/null
        keep_route="100.100.0.0/16 via $eth0_gateway dev eth0"
        routes=$(ip route | grep "dev eth0")
        echo "$routes" | while read -r route; do
          if [[ "$route" != "$keep_route" ]]; then
            prefix=$(echo "$route" | awk "{print \$1}")
            ip route delete $prefix dev eth0 > /dev/null
          fi
        done
        echo "DELETE IP ROUTE FOR ETH0, $(date)" >> /tmp/rds_custom_init.log
        eth1_gateway=$(ip route | grep "default via " | grep "eth1" | awk "{print \$3}")
        if ip route | grep -q "100.100.2.136 via $eth1_gateway dev eth1"; then
          ip route delete 100.100.2.136 via "$eth1_gateway" dev eth1
        fi
        if ip route | grep -q "100.100.2.138 via $eth1_gateway dev eth1"; then
          ip route delete 100.100.2.138 via "$eth1_gateway" dev eth1
        fi
        ip route add 100.100.2.136 via $eth1_gateway dev eth1 2> /dev/null
        ip route add 100.100.2.138 via $eth1_gateway dev eth1 2> /dev/null
        ip route delete default via $eth1_gateway dev eth1 2> /dev/null
        ip route add default via $eth1_gateway dev eth1 metric 0 2> /dev/null
    fi
    echo "RDS CUSTOM INIT FINISHED, $(date)" >> /tmp/rds_custom_init.log
  2. 执行chmod a+x /etc/rds_custom_init.sh为该脚本授予可执行权限。

  3. 编辑/etc/rc.local,将rds_custom_init.sh脚本配置为开机自启动。

    • 若系统非Ubuntu,请在/etc/rc.local中增加/etc/rds_custom_init.sh,并为/etc/rc.local授予相应权限。

      chmod 777 /etc/rc.local
    • 若系统为Ubuntu,请配置并开启rc-local.service服务。

      1. 编辑/lib/systemd/system/rc-local.service,增加如下内容。

        [Install]
        WantedBy=multi-user.target
      2. rc-local.service服务配置为开机自启动。

        #设置为开机自启动服务
        systemctl enable rc-local.service
        #检查开机自启动服务
        systemctl is-enabled rc-local.service
      3. 启动rc-local.service服务。

        #启动服务 
        systemctl start rc-local.service
        #检查服务
        systemctl status rc-local.service
      说明

      Ubuntu20.04、22.0424.04默认支持自动配置绑定的辅助弹性网卡。如自动配置未能成功,请执行以下手动配置步骤。

      手动配置步骤

      1. 执行以下命令,打开辅助弹性网卡的配置文件。

        vi /etc/netplan/eth1-netcfg.yaml
      2. 在网卡配置文件中添加以下辅助弹性网卡的信息,然后保存并退出。

        network:
          version: 2
          renderer: networkd
          ethernets:
            eth1:
              dhcp4: yes
              dhcp6: no
      3. 执行以下命令以使配置生效。

        netplan apply

相关文档