需求描述:
阿里云也好,腾讯云也好,主机可以添加多个网卡(辅助网卡),每个网卡绑定一个公网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
两家云都是基于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/