Linux

如何在linux中設置兩條預設路由

  • June 29, 2018

TL;博士

如何在linux中設置兩條預設路由(對應兩個介面),使得從兩個介面傳入的流量都被接受。

設想

我有一個主機有兩個網卡eth0eth1. 它連接到兩個網路,例如:

  • 開發: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

(較低的指標意味著較高的優先級。)


2.2.2.4現在,當有人從某個外部主機(例如) ping 時4.4.4.4,沒有回复。

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

經過一番研究,事實證明,當 linux 網路堆棧從 接收數據包時4.4.4.4,它會檢查其路由表以查看應該使用哪個介面4.4.4.4eth0在路由表中)。現在,由於數據包來自eth1介面,linux簡單地丟棄它(這個策略可能是為了防止IP欺騙)。


我想要的是:

  • 預設情況下,傳出流量(本地發起)應使用eth0介面。
  • 應接受來自兩個介面的傳入流量。(所以4.4.4.4應該能夠同時 ping1.1.1.42.2.2.4

使用 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

現在您將擁有兩個帶有兩個網關的路由表。

這種現象稱為單播 rpf(反向路徑轉發),作為 Linux 中的標準但反向路徑過濾器。您可以禁用此功能而不會產生任何重要的負面後果(除非您是 isp.. 和路由器)。

echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter

然後你的例子應該像你想要的那樣工作。

引用自:https://serverfault.com/questions/823058