AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 972906
Accepted
tudor -Reinstate Monica-
tudor -Reinstate Monica-
Asked: 2019-06-26 20:17:32 +0800 CST2019-06-26 20:17:32 +0800 CST 2019-06-26 20:17:32 +0800 CST

Netplan:通过端口转发将多个并行互联网连接路由到具有 1 个网络端口的单个服务器

  • 772

这是我的网络图:

        56.56.56.56 192.168.0.1/24
                    MAC:AA:BB:CC:DD:EE:01
               ___________     
            ---| Modem 1 |-------
            |  ___________      |             ___________
Internet ---|               | Switch |--------| Machine |
            |  ___________      |             ___________
            ---| Modem 2 |-------            192.168.0.3/24
               ___________     
        67.67.67.67 192.168.0.2/24
                    MAC:AA:BB:CC:DD:EE:02
  1. 两个调制解调器都将相同的端口从互联网转发到机器。
  2. 调制解调器后面的机器应该适当地响应来自互联网的任何请求。例如,调制解调器 1 数据包通过调制解调器 1 返回,调制解调器 2 数据包通过调制解调器 2 返回。
  3. 机器只有一个网口,交换机不受管理。
  4. 机器使用Netplan、iptables 和 iproute2 进行网络配置。
iptables
  • 1 1 个回答
  • 1424 Views

1 个回答

  • Voted
  1. Best Answer
    tudor -Reinstate Monica-
    2019-06-26T20:17:32+08:002019-06-26T20:17:32+08:00

    我最终从基于 Sender MAC Address 的 Linux 上的 Policy Routing 中的文章和评论以及关于 Policy-Routing的Netplan.io 参考中得到了我的解决方案。

    诀窍是通过源 MAC 地址标记和 CONNTRACK 传入数据包到单独的路由表iptables -t mangle,然后告诉 Netplan 使用该表适当地路由传出数据包。

    首先,我们需要将数据包放入的表格:

    将以下内容附加到文件中/etc/iproute2/rt_tables:

    1 modem1
    2 modem2
    

    然后,告诉 Netplan 表、路由和标记:

    network:
      version: 2
      ethernets:
        eth0:
          routes:
            - to: 0.0.0.0/0
              via: 192.168.0.1
              table: 1
            - to: 0.0.0.0/0
              via: 192.168.0.2
              table: 2
          routing-policy:
            - from: 0.0.0.0/0
              mark: 1
              table: 1
            - from: 0.0.0.0/0
              mark: 2
              table: 2
    

    第一部分告诉netplan这些不同表中的数据包需要不同的默认路由。第二部分说一些数据包将有一个fwmark来自 iptables 的数据包,这些数据包应该被放入这些表中。

    然后,告诉iptables通过它们的原始 MAC 地址标记数据包,但前提是它不是来自本地网络(一个小脚本):

    #!/bin/bash -x
    MAC_MODEM1=AA:BB:CC:DD:EE:01
    MAC_MODEM2=AA:BB:CC:DD:EE:02
    MARK_MODEM1=0x1
    MARK_MODEM2=0x2
    LOCALNET=192.168.0.0/24
    
    ## Optional - Clear everything first
    iptables -t mangle -F
    
    for MODEM in MODEM1 MODEM2; do
        MAC=MAC_$MODEM
        MARK=MARK_$MODEM
        iptables --table mangle --append INPUT \
        --match state --state NEW \
        --match mac --mac-source ${!MAC} \
        ! --source $LOCALNET \
        --jump CONNMARK --set-mark ${!MARK}
    done
    iptables --table mangle --append OUTPUT \
    --jump CONNMARK --restore-mark
    

    然后,告诉 netplan 生成并应用:

    $ sudo netplan generate
    $ sudo netplan apply
    

    瞧!

    奖金答案

    如果您有多个内部网络(例如通过非本地 IP 的 VPN),请使用ipsetand iptables -m set ! -match-set alias,例如

    ipset destroy officenets #optional - to clear
    
    LOCALNET=192.168.0.0/24
    VPNNET=10.10.10.0/29
    
    ipset create privatenets hash:net
    ipset add privatenets $LOCALNET
    ipset add privatenets $VPNNET
    

    然后在 iptables 脚本中......

        iptables --table mangle --append INPUT \
        --match state --state NEW \
        --match mac --mac-source ${!MAC} \
        -m set \
        ! --match-set privatenets src \
        --jump CONNMARK --set-mark ${!MARK}
    

    确认

    验证路由表的 fwmark 规则:

    $ ip rule
    0:  from all lookup local 
    0:  from all fwmark 0x1 lookup modem1 
    0:  from all fwmark 0x2 lookup modem2 
    32766:  from all lookup main 
    32767:  from all lookup default 
    

    验证 iptables mangle 路由:

    $ sudo iptables -t mangle -L
    ...
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    CONNMARK   all  --  anywhere             anywhere             state NEW MAC AA:BB:CC:DD:EE:01 ! source 192.168.0.1/24 CONNMARK set 0x1
    CONNMARK   all  --  anywhere             anywhere             state NEW MAC AA:BB:CC:DD:EE:02 ! source 192.168.0.2/24 CONNMARK set 0x2
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    CONNMARK   all  --  anywhere             anywhere             CONNMARK restore
    ...
    

    验证传出表路由:

    $ ip route list table modem1
    default via 192.168.0.1 dev eth0 proto static
    $ ip route list table modem2
    default via 192.168.0.2 dev eth0 proto static
    
    • 3

相关问题

  • OpenVPN 的 Linux IP 转发 - 正确的防火墙设置?

  • iptables 单个规则中的多个源 IP

  • 存储 iptables 规则的规范方法是什么

  • 使用 iptables 和 dhcpd 进行端口转发

  • 根据 Apache 日志数据自动修改 iptables 以阻止行为不良的客户端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve