![Linux 网络:如何使路由与同一子网上的两个网络接口一起工作?](https://linux22.com/image/655836/Linux%20%E7%BD%91%E7%BB%9C%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E8%B7%AF%E7%94%B1%E4%B8%8E%E5%90%8C%E4%B8%80%E5%AD%90%E7%BD%91%E4%B8%8A%E7%9A%84%E4%B8%A4%E4%B8%AA%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3%E4%B8%80%E8%B5%B7%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我有一台启用了 ip_forwarding 的 Ubuntu 机器。iptables 也会转发。我有 3 个网卡。
eth0-互联网
eth1-客户端1
eth2-客户端2
我希望 eth1 和 eth2 位于同一子网,相互通信并访问互联网。
只有当我使用不同的子网时,我才能使其工作。
实现这一目标的标准方法是什么?
答案1
您希望 eth1 和 eth2 位于同一子网,因此它们应该位于同一以太网链路上:您应该将您的 Linux 机器配置为桥在 eth1 和 eth2 之间。
这将创建一个新的网络接口(名称br0
如下):内核将充当桥接您的eth1
和eth2
(在第 2 层)的交换机。IP 配置将在br0
而不是eth1
和上完成(基于 MAC 地址)。它不会在 client1和 client2eth2
之间路由。eth1
eth2
eth1 eth2
[ IP ]<---------->[IP ]
[ Eth ]<->[Eth ]<->[Eth ]
Client1 bridge Client2
br0
客户端( )和 Internet之间eth0
基于 IP 地址进行路由:
br0 eth0
[ IP ]<->[IP ]<->[IP ]
[ Eth ]<->[Eth]<->[Eth ]
Client1 router to internet
从命令行:
brctl addbr br0
brctl addif br0 eth1 eth2
ip link up br0
ip addr add br0 $ip/$netmask
或者/etc/network/interfaces
:
iface br0 inet static
bridge_ports eth1 eth2
address ...
netmaks ...
broadcast ...
答案2
只是为了解释为什么需要一座桥......
A桥eth1
在两个第 2 层网络(在您的例子中)之间创建链接,eth2
以充当单个第 2 层网络。这就是交换。
A路由器在两个第 3 层网络之间创建链接(在您的情况eth0
下br0
,一旦您创建了网桥)。这就是路由。
如果两个客户端位于同一子网中,则无需路由。由于您需要同一个子网,因此它们是相同的第 3 层,因此您需要一个共同的第 2 层网络。
答案3
答案4
您通常会使用别名来执行此操作(至少对于 IPv4)
您将看到三个接口,每个接口都有不同的 IP 地址。
eth0 eth0:1 eth0:2
使用单独的设备执行此操作是……极其痛苦的,特别是当您最终遇到不对称路由/防火墙问题时(添加一些外部 NAT 设备——例如一些负载平衡器),您会非常开心(如果您是受虐狂)。我尝试(非常努力,尽管基于策略的路由对我来说很新)来使类似的东西工作,即数据包将返回到它们进入的同一接口。
希望这是可能的,但不值得为此头疼。尽管我很乐意证明我错了。