Ubuntu Server 24/NFTables双ISP多表IP路由配置请求
Ubuntu Server 24/NFTables双ISP多表IP路由配置请求
嘿,看起来你要搭建一个双ISP分流的路由方案,让LAN1、LAN2子网的设备分别通过WAN1、WAN2访问互联网对吧?我来一步步帮你梳理配置要点,确保每个子网的流量都走对应的ISP:
一、先理清楚你的基础网络信息
- ISP 1:IP段
111.11.111.0/28,对应WAN接口wan1,已经配置了多个公网IP - ISP 2:IP段
222.22.222.8/29,对应WAN接口默认设为wan2(你没贴全配置,后续可根据实际名称调整) - 核心需求:不同LAN子网的流量,匹配到对应的WAN接口走出去
二、完善Netplan配置(多路由表绑定)
你的Netplan里wan1的默认路由没写完,而且要给每个WAN绑定独立的路由表,这样才能实现分流。修改后的配置大概是这样,记得替换成你实际的网络参数:
network: ethernets: wan1: addresses: - 111.11.111.2/28 - 111.11.111.3/28 - 111.11.111.4/28 - 111.11.111.5/28 - 111.11.111.6/28 - 111.11.111.7/28 - 111.11.111.8/28 - 111.11.111.9/28 - 111.11.111.10/28 - 111.11.111.11/28 - 111.11.111.12/28 - 111.11.111.13/28 - 111.11.111.14/28 nameservers: addresses: [8.8.8.8, 8.8.4.4] routes: - to: default via: 111.11.111.1 # 这里填ISP1的实际网关,一般是网段第一个IP table: 100 # 给WAN1分配专属路由表100 routing-policy: - from: 192.168.1.0/24 # 替换成你的LAN1实际子网 table: 100 wan2: addresses: - 222.22.222.9/29 # 从ISP2的IP段里选一个可用公网IP nameservers: addresses: [22.22.22.22, 22.22.22.23] # 替换成ISP2提供的DNS routes: - to: default via: 222.22.222.8 # ISP2的实际网关,确认好再填 table: 200 # WAN2的专属路由表200 routing-policy: - from: 192.168.2.0/24 # 替换成你的LAN2实际子网 table: 200 lan1: addresses: [192.168.1.1/24] # LAN1的网关IP,和子网对应 lan2: addresses: [192.168.2.1/24] # LAN2的网关IP,和子网对应 version: 2
划重点:ISP的网关一定要确认准确,比如ISP1的
111.11.111.0/28网段,网关大概率是111.11.111.1,别填错了!
配置好后执行下面的命令生效:
sudo netplan generate sudo netplan apply
三、NFTables配置(NAT转发+流量过滤)
接下来要配置NFTables做源地址转换(SNAT),让LAN设备的私网IP转换成对应WAN的公网IP,同时设置转发规则允许流量通过。
创建/替换/etc/nftables.conf文件:
#!/usr/sbin/nft -f flush ruleset # NAT表:处理源地址转换 table ip nat { chain prerouting { type nat hook prerouting priority -100; policy accept; } chain postrouting { type nat hook postrouting priority 100; policy accept; # LAN1子网走WAN1做SNAT,用WAN1的所有公网IP ip saddr 192.168.1.0/24 oifname "wan1" snat to 111.11.111.2-111.111.11.14 # LAN2子网走WAN2做SNAT,用WAN2的公网IP ip saddr 192.168.2.0/24 oifname "wan2" snat to 222.22.222.9 } } # 过滤表:控制流量转发和入站规则 table ip filter { chain input { type filter hook input priority 0; policy drop; # 允许回环接口流量 iifname "lo" accept # 允许LAN1、LAN2的入站流量(比如访问路由器管理) iifname {"lan1", "lan2"} accept # 允许已建立的连接回包 ct state established,related accept } chain forward { type filter hook forward priority 0; policy drop; # 允许LAN1到WAN1的转发 iifname "lan1" oifname "wan1" accept # 允许LAN2到WAN2的转发 iifname "lan2" oifname "wan2" accept # 允许已建立的连接回包 ct state established,related accept } chain output { type filter hook output priority 0; policy accept; } }
然后启用并重启NFTables服务:
sudo systemctl enable --now nftables sudo systemctl restart nftables
四、验证配置是否生效
- 查看两个路由表是否正确配置:
ip route show table 100 ip route show table 200
- 从LAN1的设备ping外网,然后在服务器上抓包看流量是否从wan1出去:
sudo tcpdump -i wan1 icmp
- 同样测试LAN2的设备,看流量是否从wan2出去。
要是遇到问题,可以检查路由表、NFTables规则,或者用ip rule show看看路由策略是否正确。
备注:内容来源于stack exchange,提问作者Crazy Polenta
相关产品推荐
相关产品推荐

