基于Netplan实现双上行链路按源子网路由的配置咨询
基于Netplan实现双上行链路按源子网路由的配置咨询
嗨,这个需求完全可以通过Netplan结合Linux的多路由表功能搞定,我给你梳理下具体的配置步骤和关键细节:
一、正确的Netplan配置文件
首先要解决的核心问题是给不同源子网绑定专属的路由表,Netplan支持直接在配置里定义路由表和路由规则,这里是调整后的完整配置(注意YAML的缩进必须严格,建议用2个空格):
network: version: 2 ethernets: eth0: addresses: [5.5.5.2/27] routes: - to: default via: 5.5.5.1 table: 100 # 为快速计费链路创建专属路由表,编号100 routing-policy: - from: 10.20.30.0/24 table: 100 # 匹配10.20.30子网的流量,使用100号路由表 eth1: addresses: [6.6.6.2/27] routes: - to: default via: 6.6.6.1 table: 200 # 为包月慢链路创建专属路由表,编号200 routing-policy: - from: 10.20.40.0/24 table: 200 # 匹配10.20.40子网的流量,使用200号路由表 eth2: addresses: [10.20.30.1/24] eth3: addresses: [10.20.40.1/24] # 可选配置:确保内网子网互访的路由优先级(Netplan通常会自动添加直连路由,这部分可省略) routing-policy: - from: 10.20.30.0/24 to: 10.20.40.0/24 table: main - from: 10.20.40.0/24 to: 10.20.30.0/24 table: main
配置说明:
- 自定义路由表:给两条上行链路分别创建独立的路由表(100和200),每个表中只包含对应链路的默认路由,避免路由冲突。
- 路由规则:通过
routing-policy指定“来自某个源子网的流量,使用对应的专属路由表”,这就是实现按源子网选路的核心。 - 内网互访:当你给eth2、eth3配置内网地址后,Netplan会自动在主路由表(
main)中添加直连路由,所以两个子网默认就能互相通信。如果遇到互访问题,加上上面的全局路由规则可以强制内网流量走主表的直连路由。
二、iptables NAT配置
因为你的服务器是网关,需要给内网流量做SNAT(源地址转换)才能正常访问外网,执行以下命令:
# 给10.20.30.0/24子网的流量做SNAT,使用eth0的公网地址 iptables -t nat -A POSTROUTING -s 10.20.30.0/24 -o eth0 -j SNAT --to-source 5.5.5.2 # 给10.20.40.0/24子网的流量做SNAT,使用eth1的公网地址 iptables -t nat -A POSTROUTING -s 10.20.40.0/24 -o eth1 -j SNAT --to-source 6.6.6.2
如果要让这些规则开机自动生效,在Debian/Ubuntu系统上可以安装iptables-persistent包,然后保存规则:
apt install iptables-persistent iptables-save > /etc/iptables/rules.v4
三、配置验证
配置完成后,执行netplan apply生效,然后通过以下命令验证:
- 查看专属路由表内容:
ip route show table 100 # 应该显示 default via 5.5.5.1 dev eth0 ip route show table 200 # 应该显示 default via 6.6.6.1 dev eth1 - 查看路由规则:
ip rule show # 应该能看到类似这样的条目: # 32764: from 10.20.30.0/24 lookup 100 # 32765: from 10.20.40.0/24 lookup 200 - 流量测试:从10.20.30子网的机器ping外网,用
tcpdump -i eth0 icmp抓包,应该能看到对应流量;同理测试10.20.40子网的流量会从eth1出去,同时两个子网之间可以互相ping通。
小提示
- 路由表编号可以自定义(1-252之间,避开系统预留的0、253、254、255),也可以在
/etc/iproute2/rt_tables里给编号起名字,比如添加100 fast_link,这样Netplan配置里可以用table: fast_link更直观。 - 注意防火墙规则(比如ufw)要允许内网之间的流量,以及出站的外网流量,避免被拦截。
备注:内容来源于stack exchange,提问作者zrav
相关产品推荐
相关产品推荐

