AWS EC2实例路由不对称问题解决
摘要:
给AWS的EC2实例(Ubuntu)添加网络接口,会出现网络不对称的问题只能使用一个网卡通信(如果是Amazon linux就没有),附加新的网络接口后:
新增网卡
原网卡ens5:公网 16.163.127.36 内网192.168.141.95
新增网卡ens6:公网 43.199.38.70 内网 192.168.15.35
配置
- 启动网卡
此时新增的ens6网卡应该是输入down的状态,可以通过ip a 查看
ip link set ens6 up
- 修改配置文件(错误方式)
root@ip-192-168-141-95:/etc/netplan# cat 50-cloud-init.yaml
network:
version: 2
ethernets:
ens5:
dhcp4: true
dhcp6: false
match:
macaddress: 06:c3:2c:a6:96:3f
set-name: ens5
ens6:
dhcp4: true
dhcp6: false
match:
macaddress: 06:a6:87:67:71:81
set-name: ens6
如果你是通过dchp配置的网卡,此时你ping 16.163.127.36 这个网卡ens5的时候 通过
tcpdump抓包可以发现 ens5网卡只能收到request请求
05:49:07.492364 IP 8.137.125.230 > ip-192-168-141-95.ap-east-1.compute.internal: ICMP echo request, id 24385, seq 229, length 64
而回复请求却是ens6网卡:
05:49:43.492381 IP ip-192-168-141-95.ap-east-1.compute.internal > 8.137.125.230: ICMP echo reply, id 24385, seq 265, length 64
这通常是系统的IP,路由规则配置不正确。这是多宿主系统中常见的问题,其中多个网络接口的路由没有正确隔离,导致了非对称路由问题。
非对称路由
默认路由配置:默认情况下,Linux会使用路由表中的第一个可用路由来发送响应。如果默认路由设置通过ens6,那么所有出站流量,包括ICMP回复,都将使用这条路由,无论请求是通过哪个接口进入的。
出站数据包的源IP:Linux基于路由表决定使用哪个源IP发送数据包,除非明确指定。如果通过ens6的路由具有更低的度量值或者在表中的位置更靠前,它可能会选择与ens6关联的IP作为所有出站数据包的源IP。
查看路由:
ip show route:
root@ip-192-168-141-95:/etc/netplan# ip route show
default via 192.168.0.1 dev ens6 proto dhcp src 192.168.15.35 metric 100
default via 192.168.128.1 dev ens5 proto dhcp src 192.168.141.95 metric 100
可以看到:这两个默认路由的度量(metric)值都是100,这意味着Linux内核在决定通过哪个接口发送流量时可能会随机选择,因为两个路由的优先级相同。(其实通过上面的抓包也可以发现其实偶尔也能ping通一下)
修改配置文件(正确方式):
network:
version: 2
renderer: networkd
ethernets:
ens5:
dhcp4: no
addresses: [192.168.141.95/20]
routes:
- to: default
via: 192.168.128.1
table: 100
routing-policy:
- from: 192.168.141.95
table: 100
ens6:
dhcp4: no
addresses: [192.168.15.35/20]
routes:
- to: default
via: 192.168.0.1
table: 101
routing-policy:
- from: 192.168.15.35
table: 101
#重新应用
netplan apply
这将帮助确保针对每个网络接口的流量都是通过正确的路径,即通过它们各自的默认网关。这种配置确保了网络流量的对称性。
此时再去ping 两个IP就是正常的