我有一个带有两个 NIC 的 Linux 机器,每个 NIC 连接到不同的 LAN:
LAN A: 192.168.1.0 255.255.255.0
LAN B: 192.168.2.0 255.255.255.0
路由器包括:
RouterA: 192.168.1.1
RouterB: 192.168.2.1
无线接入点包括:
WAP-B1: 192.168.2.3
WAP-B2: 192.168.2.4
Linux NIC 包括:
NIC A: 192.168.1.2 (eth0) default gateway 192.168.1.1, metric 100
NIC B: 192.168.2.2 (eth1) metric 101
这是一个 ASCII 图:
+-------+ +-------+
| ISP A | | ISP B |
+-------+ +-------+
| |
+---------+ +-------+ +-----------+ +-------+ +-----------+
| RouterA | <--> | LAN A | <--> | Linux Box | <--> | LAN B | <--> | RouterB-1 |
+---------+ +-------+ +-----------+ +-------+ +-----------+
| |
+--------+ +--------+
| WAP-B1 | | WAP-B2 |
+--------+ +--------+
我希望所有互联网流量都通过 LAN A 和 ISP A。我仅将此 Linux 盒连接到 LAN B,以便可以对 LAN-B 上的设备(特别是 RouterB 和 WAP-B1、WAP-B2)进行管理。因此,我仅希望地址 192.168.2.0/24 通过 NIC B (eth1) 路由。我希望所有其他流量都通过 NIC A 路由。我不希望任一 LAN 中的主机能够相互连接(或相互 ping 等)。我希望 LAN A 和 LAN B 保持隔离。
我连接了网线,一切似乎都正常了。我假设路由指标是按照我连接网线的顺序建立的。但是,我想知道设置路由规则的正确方法,以确保我保持有效的配置。
更新:响应评论,以下是输出route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 192.168.2.1 0.0.0.0 UG 101 0 0 eth1
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
这是我猜测的正确路由表。(这只是猜测。)
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.2.0 192.168.2.1 255.255.255.0 UG 101 0 0 eth1
192.168.1.0 192.168.1.1 255.255.255.0 U 100 0 0 eth0
在 NetworkManager > IPv4 > 路由中,我选中了“忽略自动获取的路由”,并添加了以下静态路由:192.168.2.0,网络掩码:255.255.255.0,网关:192.168.2.1,度量:101
以下是这些变化产生的路由表。
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.2.0 192.168.2.1 255.255.255.0 UG 101 0 0 eth1
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
192.168.1.0 192.168.1.1 255.255.255.0 U 100 0 0 eth0
在我看来这不对劲,但今天是我第一次查看路由表。
更新:我正在运行 Arch Linux 和 NetworkManager。但是,我更喜欢基于ip address
和 之类的命令的答案ip route
。
更新 2:感谢@瓦哈的答案,这是所需的路由表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
我还没有弄清楚如何创建一个持久的配置以确保重新启动时这个路由表。
但是,我可以使用以下步骤手动建立这些路线:
在 NetworkManager > IPv4 > 路由中,选中两个接口的“忽略自动获取的路由”。
$ sudo ip route add default via 192.168.1.1 metric 100 dev eth0
$ sudo ip route delete default via 192.168.2.1 dev eth1
其他变体(例如不选中 eth0 的“忽略自动获取的路由”)不起作用。例如,当我仅忽略 eth1 的自动获取路由时,我的系统在启动时使用 192.168.2.1 作为默认网关。这是一个意想不到且令人困惑的结果。
我的最后一个问题是如何配置我的系统以便这些是重启后的默认路由?
答案1
让我们分两个步骤消除您的疑虑:
步骤1
因此,我仅希望地址 192.168.2.0/24 通过 NIC B (eth1) 路由。我希望所有其他流量都通过 NIC A 路由。
默认路由表(之前你手动配置的表)提供了你所寻找的路由规则。
以下是详细解释:
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
表示子网 192.168.2.0/24 是本地网络,不需要网关。任何以该网络中的地址为目标的数据包都将直接传送到目的地,而无需跳跃。
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
对于子网 192.168.1.0/24 来说也是同样的事情。
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 192.168.2.1 0.0.0.0 UG 101 0 0 eth1
表示剩余流量将通过 eth0 和 eth1 路由,其中路由决策取决于度量值。度量值越低,优先级越高。但如果 eth0 已关闭,则所有流量将通过 eth1 路由,反之亦然。顺便说一句,我不确定,但我对 eth0 具有比 eth1 更高的优先级的最佳猜测是接口名称的字母顺序。
总之,下表就是您要找的。我不熟悉 NetworkManager,但我认为您可以忽略两个接口的自动获取路由,并手动设置自己的路由来实现此路由表。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
第2步
我不希望两个 LAN 中的主机能够互相连接(或互相 ping 等)。我希望 LAN A 和 LAN B 保持隔离。
简单地将您的 Linux 机器连接到两个不同的网络不会影响它们的隔离,除非在机器的防火墙上定义了 NAT 规则或者机器的接口是桥接的。
iptables
您可以通过或检查 NAT 规则,nftables
它们是 Arch Linux 上管理防火墙的工具。另请参阅Arch Linux wiki - 防火墙。
列出 NAT 规则的示例命令:iptables -t nat -L -v -n
您的路由表中没有看到任何网桥,但您可以使用以下方法之一详细检查网桥Arch Linux wiki - 网桥。