我在设置为路由器的主机(i5 cpu、8Gb RAM、SSD 和硬盘)上运行 Fedora 33;它有 5 个 NIC。我已经设法使用 nftables 让双互联网网关和双 LAN 工作得相当好。
一个网关是带 pppoe 的 DSL,另一个是电缆调制解调器。两者都可以连接并且可以看到互联网。两个局域网都可以看到互联网并提供互联网可以看到的服务。IOW、NAT 和转发运行良好。
问题是:我不知道如何设置路由表。问题出在哪个网关具有最低度量标准与 NAT 一起使用并转发到其 LAN,但它关闭了 NAT 并转发到其他网关和 LAN。从 LAN 机器的角度来看,我一次只在一个网关上工作。
root@gata[~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 67.193.x.x 0.0.0.0 UG 100 0 0 coglink
0.0.0.0 206.248.x.x 0.0.0.0 UG 104 0 0 ppp0
10.0.0.0 0.0.0.0 255.0.0.0 U 103 0 0 tekgw
67.193.56.0 0.0.0.0 255.255.248.0 U 100 0 0 coglink
192.168.1.0 0.0.0.0 255.255.255.0 U 102 0 0 coggw
206.248.155.132 0.0.0.0 255.255.255.255 UH 105 0 0 ppp0
我知道可以设置路由,以便 10.0.0.0 上的机器始终使用 ppp0,而 192.168.1.0 上的机器始终使用 coglink,但是关于如何做到这一点的网络搜索一直没有结果。与面向互联网的接口相同。如果有人可以向我指出有关多个接口的 IP 路由的清晰相关教程,我将不胜感激。
此答案将使用策略路由,其中数据包的命运不仅取决于其目的地,而且(首先)取决于其他因素(此处为源 IP 地址和/或传入接口)。策略路由不适用于 Linux-obsolete
route
命令,而仅适用于使用ip rule
andip route
(以及ip link
和ip address
)的较新 API。目标是将所有路由的单个视图拆分为多个路由表,其中每个路由表都将提供打算使用的路由的特定视图,就好像其他不感兴趣的部分不存在一样。除此之外,这允许定义同时使用的多个默认路由:每个路由表一个。默认情况下只有这个存在,(最后一条规则的默认表为空):
这里 OP 的情况可以用这种策略路由来表达,当处理一个数据包时:
虽然可以只添加规则来处理ppp0并保留主路由表句柄coglink,但为了对称起见,我仍然会为两者添加规则。
完成一些空白点并选择任意值(以提供没有语法错误的命令):
via 206.248.155.132
)。每个路由表将仅包括要使用的 WAN,而不是两者,但还必须包括到将使用它的网络的路由。如果启用了 SRPF,这些 LAN 路由的复制是强制性的,否则这些 LAN 路由通常可以省略(只要它们在主路由表中)。
这不会影响将路由器作为端节点本身的流量,它将继续仅使用主表(它是具有较低度量的默认路由:coglink的),因为:
因此,某些极端情况仅适用于 Fedora 路由器(实际上不是路由时),例如选择ppp0的 IP 地址作为源,目标位于 Internet 上,仍然会通过coglink选择路由,并且无法正常工作。这就是路由器在其 ppp0 IP 地址上应答 ping 时发生的情况。
因此,为了解决问题的标题,为了让路由器在与一个接口上的 IP 地址绑定并通过另一个接口路由时选择正确的路由,可以添加额外的规则,从源地址选择路由表:
通过使用来自本地系统(而不是来自lo接口)的具有特殊含义的附加选择器,即使只知道可能的地址范围(例如:使用
whois
命令检索)也足够了。前面的两条规则可以替换为:iif lo
对于其他情况(当最初未绑定套接字时),主路由表的默认路由具有最低度量将选择接口(当前为 coglink),默认情况下将其 IP 地址作为源。
注意事项和警告:
iptables或nftables提供的 NAT 规则仍然需要
使用iptables,由于始终正确选择了传出接口,这可能看起来像这样:
或使用nftables和内核 >= 5.5入口接口可用于后路由:
mynat.nft
(与 一起使用nft -f mynat.nft
):当然,选择更简单的 NAT 规则会起作用。
如果接口消失并重新出现,或者只是上下移动,则必须相应地重新应用以前所做的许多设置:路由将消失并且必须重新应用,并且在某些情况下引用接口的路由规则可能会变得陈旧。
因此,必须在启动时和之后与处理网络的工具进行一些集成,以保持这些路由表和路由规则正常工作。
如果工具有限制,可以更改一些策略路由规则以适应。例如,对于当前拓扑,
iif tekgw
(几乎但不完全)等价于from 10.0.0.0/8
.即使coglink的地址和默认路由的网关发生变化,这两条信息仍然可用……在coglink接口和路由上(如果使用 DHCP,也可能在 DHCP 客户端的租约文件中)。这只是重用现有数据进行集成的一个案例。这是一个使用 JSON 输出的示例,并且
jq
:地址:
网关:
它们甚至可以由处理系统网络的工具中的钩子直接提供,例如NetworkManager。