如何在linux中设置两条默认路由

Tan*_*may 6 networking linux routing linux-networking

TL; 博士

如何在linux中设置两条默认路由(对应两个接口),使得来自两个接口的传入流量都被接受。

设想

我有一个主机有两个 NICeth0eth1. 它连接到两个网络,例如:

  • 开发:eth0,IP 1.1.1.4:,网络掩码:255.255.255.0,网关:1.1.1.1

  • 开发:eth1,IP 2.2.2.4:,网络掩码:255.255.255.0,网关:2.2.2.1

(两个网络都连接到互联网。)

路线为(ip route show):

default via 1.1.1.1 dev eth0 metric 1
default via 2.2.2.1 dev eth1 metric 2
1.1.1.0/24 dev eth0 src 1.1.1.4
2.2.2.0/24 dev eth1 src 2.2.2.4
Run Code Online (Sandbox Code Playgroud)

(较低的指标意味着较高的优先级。)


现在,当有人2.2.2.4从某个外部主机(比如4.4.4.4)ping 通时,没有回复。

tcpdump -i eth1在我的主机上的输出是:

22:41:27.431539 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 4, length 64
22:41:28.439492 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 5, length 64
22:41:29.447666 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 6, length 64
22:41:30.455528 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 7, length 64
Run Code Online (Sandbox Code Playgroud)

经过一些研究,事实证明,当 linux 网络堆栈收到来自 的数据包时4.4.4.4,它会检查其路由表以查看应该使用哪个接口4.4.4.4eth0在路由表中)。现在,由于数据包来自eth1接口,linux 只是将其丢弃(此策略可能是为了防止 IP 欺骗)。


我想要的是:

  • eth0默认情况下,传出流量(本地发起的)应使用接口。

  • 应接受来自两个接口的传入流量。(所以4.4.4.4应该能够ping通1.1.1.42.2.2.4

c4f*_*t0r 8

使用 iproute2 你可以做这样的事情:

echo "1 admin" >> /etc/iproute2/rt_tables
echo "2 users" >> /etc/iproute2/rt_tables

ip rule add from 192.168.122.40/32 dev eth0 table admin
ip rule add from 192.168.123.41/32 dev eth1 table users

ip route add default via 192.168.122.1 dev eth0 table admin
ip route add default via 192.168.123.1 dev eth1 table users
Run Code Online (Sandbox Code Playgroud)

现在您将拥有两个带有两个网关的路由表。