You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

四、验证配置是否生效

  1. 查看两个路由表是否正确配置:
ip route show table 100
ip route show table 200
  1. 从LAN1的设备ping外网,然后在服务器上抓包看流量是否从wan1出去:
sudo tcpdump -i wan1 icmp
  1. 同样测试LAN2的设备,看流量是否从wan2出去。

要是遇到问题,可以检查路由表、NFTables规则,或者用ip rule show看看路由策略是否正确。

备注:内容来源于stack exchange,提问作者Crazy Polenta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:29:51