可能的重複:
如何橋接兩個不同的互聯網連接
我正在尋找僅透過一個乙太網路適配器連接到多個路由器的最佳方法及其副作用。
我有一台帶有一個乙太網路連接埠的 Linux PC,連接到交換器。該交換器連接到具有不同網路的多個路由器(例如192.168.1.1、192.168.2.1、192.168.3.1),我希望能夠將套接字綁定到特定的“設備”,因此我將使用相關的那個路由器連接。
我相信這可以透過為每個路由器建立一個虛擬 eth 介面並為每個路由器設定正確的 ip/子網路/gw 來實現。
問題是:這是正確的嗎? , 怎麼做? ,我應該懷疑奇怪的副作用嗎?
* 所有路由器加起來的總網路速度連10M都不會超過。
答案1
這裡不需要虛擬介面。您想要的是同一台設備上有多個 IP 位址,以及良好的路由表和策略路由來選擇要使用的路由表。現在,在配置部分。讓我們用 /32 設定您的 IP 位址,這樣我們就可以自己建立連結路由
ip addr flush dev eth0
ip addr add 192.168.1.yourhost/32 dev eth0
ip addr add 192.168.2.yourhost/32 dev eth0
ip addr add 192.168.3.yourhost/32 dev eth0
現在介紹路由表。第一個路由表將匹配進入您的區域網路的資料包。
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.2.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.3.0/24 dev eth0 src 192.168.1.yourhost table 2
table 2
指定要使用的路由表。 2是任意數。可以透過編輯 /etc/iproute2/rt_tables 將數字對應到名稱。讓我們添加2 lan
到該文件中,現在您可以簡單地使用table lan
.
現在,讓我們預設使用該路由表:
ip rule add table lan
現在,如果您查看 的輸出ip rule
,您將看到以下內容:
0: from all lookup local
99: from all lookup lan
32766: from all lookup main
32767: from all lookup default
local
是一個保留表,用於核心可以檢查某個 IP 位址是否是他自己的 IP 位址,lan
是我們的表,main
是您知道的常用路由表,default
是我們無法路由的封包的特殊表。基本上,核心將從第一個規則開始嘗試這些規則,如果在該表中找不到路由,則會轉到下一個規則。
因此,我們新增了另一個路由表,將我們的路由放入 LAN,並在該main
表之前進行嘗試。現在讓我們在 main 中新增一個預設路由:當您沒有將套接字綁定到 IP 位址時,您只會使用該預設路由。我們選擇 192.168.1.1:
ip route add default via 192.168.1.1 src 192.168.1.yourhost
現在,如果您將套接字綁定到 192.168.2.yourhost,則您不想使用該預設路由,而是使用另一個路由。讓我們將此預設路由新增到另一個路由表中:
ip route add default via 192.168.2.1 src 192.168.2.yourhost dev eth0 table 3
# and while we are at it, let's do this for 192.168.3.1 as well
ip route add default via 192.168.3.1 src 192.168.3.yourhost dev eth0 table 4
現在您想要使用這些路由表,但前提是您的套接字已綁定到這些其他 IP 位址。
ip rule add from 192.168.2.yourhost iif lo table 3
ip rule add from 192.168.3.yourhost iif lo table 4
from 192.168.2.yourhost
如果封包中的 IP 來源位址是 192.168.2.yourhost,則將使核心僅嘗試該表。iif
允許指定從哪個介面接收封包(這在轉送流量時很有用),但有一個特殊例外,即iif lo
表示流量是本地產生的。
現在您可以透過嘗試或使用ip route get
命令測試路由表來檢查它是否有效:
$ ip route get 192.168.2.5
192.168.2.5 dev eth0 src 192.168.2.yourhost
cache
$ ip route get 64.34.119.12
64.34.119.12 via 192.168.1.1 dev eth0 src 192.168.1.yourhost
cache
$ ip route get 64.34.119.12 from 192.168.2.yourhost
64.34.119.12 via 192.168.2.1 dev eth0 src 192.168.2.yourhost
cache