Linux
如何在linux中設置兩條預設路由
TL;博士
如何在linux中設置兩條預設路由(對應兩個介面),使得從兩個介面傳入的流量都被接受。
設想
我有一個主機有兩個網卡
eth0
和eth1
. 它連接到兩個網路,例如:
- 開發:
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.4
(eth0
在路由表中)。現在,由於數據包來自eth1
介面,linux簡單地丟棄它(這個策略可能是為了防止IP欺騙)。我想要的是:
- 預設情況下,傳出流量(本地發起)應使用
eth0
介面。- 應接受來自兩個介面的傳入流量。(所以
4.4.4.4
應該能夠同時 ping1.1.1.4
和2.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
然後你的例子應該像你想要的那樣工作。