ubuntu小技巧

腾讯云阿里云服务器多个网卡配置多个公网ip

需求描述:
阿里云也好,腾讯云也好,主机可以添加多个网卡(辅助网卡),每个网卡绑定一个公网ip,实现出向访问走不同网卡用不同的公网ip。
从eth0出去是公网ip1,从eth1出去是公网ip2。

原理:
多个公网IP,出向访问怎么走网关呢?
主动访问公网的业务,需要在实例上自定义默认路由或明细路由,默认路由从主网卡出,可以通过调整路由优先级的方式让报文从弹性网卡出公网,您也可以配置明细路由,让报文以形式从多个网卡分发或从某一网卡随机地分发出公网。

前提准备工作:
在云平台后台加网卡,原来默认只有eth0,比如新加了eth1,可以参考官网文档:
腾讯云:
https://cloud.tencent.com/document/product/1199/44153
阿里云:
https://help.aliyun.com/zh/eip/use-cases/associate-multiple-eips-with-a-secondary-eni-in-nat-mode

腾讯云阿里云服务器多个网卡配置多个公网ip

两家云都是基于centos的,本文是ubuntu20.04的。下面以腾讯云为例:

一些准备工作:要知道需要配置的ip地址,掩码,dns nameserver,网关

查看当前dns nameserver的命令:

resolvectl status 或者 resolvectl dns
root@VM-0-8-ubuntu:~# resolvectl dns
Global:
Link 3 (eth1):
Link 2 (eth0): 183.60.83.19 183.60.82.98
如果在ubuntu18里,可能没有这个命令:
root@VM-0-14-ubuntu:~# resolvectl dns
resolvectl: command not found
改用:systemd-resolve --status

查看网关:

root@VM-0-8-ubuntu:~# ip r | grep ^def
default via 172.21.0.1 dev eth0 proto dhcp src 172.21.0.8 metric 100 
root@VM-0-8-ubuntu:~# ip route
default via 172.21.0.1 dev eth0 proto dhcp src 172.21.0.8 metric 100 
172.21.0.0/20 dev eth0 proto kernel scope link src 172.21.0.8 

这里看到默认网关是172.21.0.1

配置路由表文件:
首先查看机器是否安装了iproute2,一般情况下都默认安装,如果没有安装,可以利用 apt install iproute2 命令安装。
然后打开路由表文件: vim /etc/iproute2/rt_tables
添加新的路由表 100 ~ 101:

root@VM-0-8-ubuntu:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
100     100  #eth0
101     101  #eth1

编辑 /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg 文件,添加:network: {config: disabled}

root@VM-0-8-ubuntu:~# cat /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network: {config: disabled}

为啥要加这个呢?
因为netplan的配置文件(/etc/netplan/50-cloud-init.yaml)中开头告诉你了,不加的话会网络配置文件不会生效,会被自动覆盖。

下面是手动配置网络文件,实现eth0和eth1 的手动配置:

root@VM-0-8-ubuntu:~# cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    version: 2
    ethernets:
        eth0:
            dhcp4: true
            match:
                macaddress: 52:54:00:22:8b:67
            set-name: eth0
            addresses:
                    - 172.21.0.8/20 # 私有IP/子网掩码
            gateway4: 172.21.0.1 # 网关, 只有一个网卡需要配置gateway4参数
            nameservers:
                    addresses:
                            - 183.60.83.19 #上面命令中查到的腾讯云dns
                            - 183.60.82.98 #上面命令中查到的腾讯云dns
            routes:
                    - to: 0.0.0.0/0 # 路由的目标地址。
                      via: 172.21.0.1 # 为通过路由的流量设置源 IP 地址。(网关)
                      table: 100 # eth0对应的路由表
            routing-policy:
                    - from: 172.21.0.8 # 主网卡私网ip,设置源 IP 地址以匹配此策略规则的流量。
                      table: 100 # 路由表编号
                      priority: 300 # 指定路由策略规则的优先级,以影响处理路由规则的顺序。
                                    # 数字越大,优先级越低:规则按优先级数字递增的顺序处理。
        eth1:
            dhcp4: true
            match:
                macaddress: 20:90:6f:f7:81:0a
            set-name: eth1
            addresses:
                    - 172.21.0.7/20
            nameservers:
                    addresses:
                            - 183.60.83.19
                            - 183.60.82.98
            routes:
                    - to: 0.0.0.0/0
                      via: 172.21.0.1 # 网关
                      table: 101 # eth1对应的路由表
            routing-policy:
                    - from: 172.21.0.7 # eth1私网ip
                      table: 101
                      priority: 300

执行netplan apply ,应用网络配置。查看路由:

注意,可能会发生以下错误
** (generate:17913): WARNING **: 22:12:39.065: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

** (process:17911): WARNING **: 22:12:39.312: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.
是因为ubuntu的版本不同,网络配置文件的格式要求不一样,路由命令 gateway4 的那一行去掉,改为如下:
            routes:
                    - to: default
                      via: 172.16.0.1
root@VM-0-8-ubuntu:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.21.0.1      0.0.0.0         UG    0      0        0 eth0
0.0.0.0         172.21.0.1      0.0.0.0         UG    100    0        0 eth0
0.0.0.0         172.21.0.1      0.0.0.0         UG    100    0        0 eth1
172.21.0.0      0.0.0.0         255.255.240.0   U     0      0        0 eth0
172.21.0.0      0.0.0.0         255.255.240.0   U     0      0        0 eth1

测试一下:

root@VM-0-8-ubuntu:~# curl ifconfig.me --interface eth0
181.170.16.135
root@VM-0-8-ubuntu:~# curl ifconfig.me --interface eth1
110.113.19.68

可以看到,不同的网卡出去的公网地址不同。

参考:
https://www.opensourcelisting.com/how-to-configure-multiple-network-interfaces/
https://netplan.readthedocs.io/en/latest/netplan-yaml/#routing
https://serverspace.io/support/help/multiple-network-interfaces-ubuntu-20-04/