![Linux 直通路由](https://linux22.com/image/215877/Linux%20%E7%9B%B4%E9%80%9A%E8%B7%AF%E7%94%B1.png)
我有一台相当普通的 Linux 机器,有两个以太网接口(我将其称为 eth0 和 eth1),以及一个 WiFi 接口(我将其称为 wlan0)。
由于种种原因,我不是希望这台机器能够直接通过其 WiFi 接口进行通话。相反,我希望它将 eth0 视为通往一切的网关。
但是我希望这台机器的 LAN 上的路由器(即可以通过 eth0 访问)能够使用这台机器的 WiFi 接口作为通往世界其他地方的桥梁。我和我的同事的想法是,路由器可以将数据包发送回 eth1 上的这台机器,而这台机器可以将它们转发到 wlan0。同样,wlan0 上的任何传入数据包都将立即通过 eth1 发送回本地路由器进行处理。
我们之所以采用这种拓扑,是因为我们相信专用路由器可以做出更好的路由决策,并且比我们尝试教相关 Linux 机器成为合适的路由器更容易。 (这并不简单,因为 WiFi 链路 (a) 并不总是在线,并且 (b) 不是通往我们世界其他地方的唯一链路。此外 (c) 该 LAN 上的其他主机可能希望通过 WiFi 链路发送数据包此外,(d) 那些其他主机的数据包也可以通过它到达。)
我知道有很多方法可以像这样在两个接口之间路由数据包。我可以使用桥接接口,也可以使用 iptables。目前我一直在研究 iptables。 (机器有点旧,无法使用nft。)
我不确定的是:
- eth1 和 wlan0 是否需要自己的 IP 地址以及
- 如果他们这样做了,我得付出多大的努力才能阻止这台机器直接使用它们。
至少我想象我可以做类似的事情
iptables -A FORWARD -i eth1 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth1 -j ACCEPT
如两个接口之间的 iptables 转发。理论上,这将 Linux 盒子变成了两个接口之间的线路,盲目地双向转发所有数据包,而不以任何方式检查或更改它们。
不过,我担心这可能很幼稚,而且行不通,因为它不会正确 ARP 之类的。
我怀疑我可能确实需要为 eth1 和 wlan0 分配 IP 地址。如果我这样做,我怀疑我可能需要(至少)在转发数据包时重写它们的源地址。根据答案我链接到的那个问题,这可能就像添加一样简单
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
也许还有
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
我的 iptables 食谱。
另外,如果我确实为这两个接口分配了 IP 地址,我想确保本地 Linux 计算机不会尝试将它们用于其他用途。我可能需要在路由表中创建一些明确的不路由规则,以强制它通过 eth0 发送所有内容,即使它似乎与分配给 eth1 和/或 wlan0 的子网匹配。
有人对如何使这项工作有任何建议吗? (或者建议这是一个坏主意并且永远不会起作用,我想,尽管我希望它会起作用。)
顺便说一句,这是一个孤立的本地网络,根本没有连接到全球互联网。所有东西都有固定的私人使用地址;没有 DHCP 运行,也不需要 NAT。
答案1
如果我理解正确的话,您基本上希望 NUC 充当 eth1 和 wlan0 之间的交换机?如果是这样,您可以使用 iproute2 ( ip link add type bridge ...
) 或bridge-utils ( )创建网桥brctl addbr ...
并添加两个接口。不需要在这些接口上分配 IP 地址。在这种情况下,您的 eth0 将是唯一具有 IP 地址的接口,并且将像唯一活动的网络接口一样工作。