![通过指定接口路由一个 IP 地址的流量](https://linux22.com/image/180140/%E9%80%9A%E8%BF%87%E6%8C%87%E5%AE%9A%E6%8E%A5%E5%8F%A3%E8%B7%AF%E7%94%B1%E4%B8%80%E4%B8%AA%20IP%20%E5%9C%B0%E5%9D%80%E7%9A%84%E6%B5%81%E9%87%8F.png)
我有一个具有固定IP地址(192.168.1.86)的设备。我还有一个使用 192.168.1.x 的 DHCP 网络,并且不允许我在该网络上仅保留 192.168.1.86。我有一台机器(称之为桥),需要能够与主网络和一个固定地址设备进行通信。
A 有两个网络适配器,所以到目前为止我所做的就是使用 DHCP 配置一个接口与主网络通信,另一个手动配置与固定地址设备通信。然后我启用一个接口并禁用另一个接口,这样在任何给定时间我都可以与其中一个或另一个进行通信。这显然非常笨拙,有时甚至令人沮丧。
我希望能够在不手动启用/禁用接口的情况下做到这一点,但将所有发往 192.168.1.86 的流量自动发送到一个接口,而任何其他地址的流量则由另一个接口发送。是的,我意识到,如果我能做到这一点,那台桥接机将无法再与主网络上的 192.168.1.86 进行通信——我对此很满意。作为奖励,它会如果我能让固定地址设备通过桥接机与互联网通信,那就太好了。
这似乎应该是静态路由,但我不确定如何(或者即使可能)为一个特定地址而不是整个子网设置静态路由(特别是当该地址位于子网内部时)由其他接口处理)。
那么,我可以(如果可以的话如何)配置桥接机将专门针对 192.168.1.86 的流量发送到一个接口,并将任何其他地址的流量发送到另一个接口?
桥接机器(连接到网络其余部分和固定地址设备的机器)运行 CentOS 7。
答案1
使用以下命令添加到 192.168.1.86 的主机路由:
ip route add 192.168.1.86/32 dev eth1
其中 eth1 是设备连接到的接口。该路由比正常的 192.168.1.0/24 路由更具体,并且将在与设备通信时选择,对于其他主机,则应用正常路由。
答案2
如果您能够为 192.168.1.86 主机分配一个额外的地址,您可以像这样处理它:
在 192.168.1.86 上使用“ifconfig -a”获取当前接口设置列表,例如:
# ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.86 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:21:f6:41:94:37 txqueuelen 1000 (Ethernet)
RX packets 68267884 bytes 20871214051 (19.4 GiB)
RX errors 0 dropped 3485 overruns 0 frame 0
TX packets 5758238 bytes 843203020 (804.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 1663 bytes 508496 (496.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1663 bytes 508496 (496.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions
就我而言,我使用 eth0 作为接口。您可以忽略 lo(环回)接口。
要向该接口添加地址,您只需配置另一个“子”接口并为其分配地址和网络掩码。例如:
# ifconfig eth0:1 10.33.33.33 netmask 255.255.255.0 up
这将产生一个名为“eth0:1”的新接口:
# ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.86 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:21:f6:41:94:37 txqueuelen 1000 (Ethernet)
RX packets 68268140 bytes 20871241191 (19.4 GiB)
RX errors 0 dropped 3485 overruns 0 frame 0
TX packets 5758341 bytes 843217718 (804.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.33.33.33 netmask 255.255.255.0 broadcast 10.33.33.255
ether 00:21:f6:41:94:37 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 1663 bytes 508496 (496.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1663 bytes 508496 (496.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
然后,在“网桥”主机上,对于需要与 192.168.1.86 主机通信的接口,将该接口配置为也在 10.33.33.x 网络上(在本示例中)...例如 10.33.33.1。
此时,您将不再通过 192.168.1.86 地址引用 192.168.1.86 主机......现在可以通过 10.33.33.33 访问它。
这应该可以消除“桥接”主机上的两个接口上具有相同网络的问题。
要使附加接口定义在 192.168.1.86 主机上永久存在,您可以在 /etc/sysconfig/network-scripts 中添加一个名为 ifcfg-eth0:1 的文件,该文件的内容可能类似于以下内容:
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0:1
ONBOOT=yes
IPADDR=10.33.33.33
PREFIX=24
请注意,在我的例子中,接口是 eth0。您的可能会有所不同,因此请根据需要进行推断。另外,在我的示例中,我使用了网络 10.33.33.x,但您需要确保指定的网络不会与环境中的其他地方发生冲突。通常 10.xxx 网络非常安全,只需选择一个未使用的子网即可。
Johan 使用静态路由的建议简单明了。它会留下必须在桥接主机两侧引用相同网络的混乱,但应该可以工作。我的上述建议将有助于从实际角度消除“丑陋”的双网络问题。要么应该解决你的困境。