这是我的网络图:
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 数据包通过调制解调器 1 返回,调制解调器 2 数据包通过调制解调器 2 返回。
- 机器只有一个网口,交换机不受管理。
- 机器使用
Netplan
、iptables 和 iproute2 进行网络配置。
我最终从基于 Sender MAC Address 的 Linux 上的 Policy Routing 中的文章和评论以及关于 Policy-Routing的Netplan.io 参考中得到了我的解决方案。
诀窍是通过源 MAC 地址标记和 CONNTRACK 传入数据包到单独的路由表
iptables -t mangle
,然后告诉 Netplan 使用该表适当地路由传出数据包。首先,我们需要将数据包放入的表格:
将以下内容附加到文件中
/etc/iproute2/rt_tables
:然后,告诉 Netplan 表、路由和标记:
第一部分告诉
netplan
这些不同表中的数据包需要不同的默认路由。第二部分说一些数据包将有一个fwmark
来自 iptables 的数据包,这些数据包应该被放入这些表中。然后,告诉
iptables
通过它们的原始 MAC 地址标记数据包,但前提是它不是来自本地网络(一个小脚本):然后,告诉 netplan 生成并应用:
瞧!
奖金答案
如果您有多个内部网络(例如通过非本地 IP 的 VPN),请使用
ipset
andiptables
-m set ! -match-set alias
,例如然后在 iptables 脚本中......
确认
验证路由表的 fwmark 规则:
验证 iptables mangle 路由:
验证传出表路由: