可能重复:
如何桥接两个不同的互联网连接
我正在寻找仅通过一个以太网适配器连接多个路由器的最佳方法及其副作用。
我有一台带有一个以太网端口的 Linux PC,连接到交换机。此交换机连接到具有不同网络的多个路由器(例如 192.168.1.1、192.168.2.1、192.168.3.1),我希望能够将套接字绑定到特定的“设备”,以便我将使用相关路由器进行该连接。
我相信这可以通过为每个路由器创建一个虚拟 eth 接口并为每个路由器设置适当的 ip/子网/gw 来实现。
问题是:这是正确的吗?怎么做?我是否应该怀疑奇怪的副作用。
* 所有路由器的总网络速度甚至不会超过 10M。
答案1
这里不需要虚拟接口。您需要的是同一设备上的多个 IP 地址,以及具有策略路由的良好路由表,以选择要使用的路由表。现在,进入配置部分。让我们用 /32 配置您的 IP 地址,这样我们就可以自己创建我们的在线路由
ip addr flush dev eth0
ip addr add 192.168.1.yourhost/32 dev eth0
ip addr add 192.168.2.yourhost/32 dev eth0
ip addr add 192.168.3.yourhost/32 dev eth0
现在来看看路由表。第一个路由表将匹配发往你的局域网的数据包。
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.2.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.3.0/24 dev eth0 src 192.168.1.yourhost table 2
table 2
指定要使用的路由表。2 是任意数字。可以通过编辑 /etc/iproute2/rt_tables 将数字映射到名称。让我们添加2 lan
到该文件,现在您可以简单地使用table lan
。
现在,让我们默认使用该路由表:
ip rule add table lan
现在,如果你看一下的输出ip rule
,你会看到类似这样的内容:
0: from all lookup local
99: from all lookup lan
32766: from all lookup main
32767: from all lookup default
local
是保留表,用于内核检查某个 IP 地址是否是自己的 IP 地址;lan
是我们的表;main
是您知道的常规路由表;default
是无法路由的数据包的特殊表。基本上,内核将从第一个规则开始尝试这些规则,如果在该表中找到路由,则转到下一个规则。
因此,我们添加了另一个路由表,将到 LAN 的路由放入其中,该路由在main
路由表之前尝试。现在让我们在主路由中添加一个默认路由:当您不将套接字绑定到 IP 地址时,您将仅使用此默认路由。让我们选择 192.168.1.1:
ip route add default via 192.168.1.1 src 192.168.1.yourhost
现在,如果你将套接字绑定到 192.168.2.yourhost,你不想使用该默认路由,而是使用另一个。让我们将此默认路由添加到另一个路由表:
ip route add default via 192.168.2.1 src 192.168.2.yourhost dev eth0 table 3
# and while we are at it, let's do this for 192.168.3.1 as well
ip route add default via 192.168.3.1 src 192.168.3.yourhost dev eth0 table 4
现在您想使用这些路由表,但前提是您的套接字绑定到这些其他 IP 地址。
ip rule add from 192.168.2.yourhost iif lo table 3
ip rule add from 192.168.3.yourhost iif lo table 4
from 192.168.2.yourhost
将使内核仅在数据包中的 IP 源地址为 192.168.2.yourhost 时尝试该表。iif
允许指定从哪个接口接收数据包(这在转发流量时很有用),但有一个特殊例外,这iif lo
意味着流量是在本地生成的。
现在,您可以通过尝试或使用ip route get
命令来测试您的路由表来检查它是否有效:
$ ip route get 192.168.2.5
192.168.2.5 dev eth0 src 192.168.2.yourhost
cache
$ ip route get 64.34.119.12
64.34.119.12 via 192.168.1.1 dev eth0 src 192.168.1.yourhost
cache
$ ip route get 64.34.119.12 from 192.168.2.yourhost
64.34.119.12 via 192.168.2.1 dev eth0 src 192.168.2.yourhost
cache