通过指定接口路由一个 IP 地址的流量

通过指定接口路由一个 IP 地址的流量

我有一个具有固定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 使用静态路由的建议简单明了。它会留下必须在桥接主机两侧引用相同网络的混乱,但应该可以工作。我的上述建议将有助于从实际角度消除“丑陋”的双网络问题。要么应该解决你的困境。

相关内容