
是否可以使用 iptables 設定 Linux 伺服器來執行此操作?
PC (192.168.1.11) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router1 (192.168.0.1)
PC (192.168.1.12) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router1 (192.168.0.1)
PC (192.168.1.13) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router1 (192.168.0.1)
...
PC (192.168.1.21) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router2 (192.168.0.2)
PC (192.168.1.22) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router2 (192.168.0.2)
PC (192.168.1.23) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router2 (192.168.0.2)
...
PC (192.168.1.31) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router3 (192.168.0.3)
PC (192.168.1.32) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router3 (192.168.0.3)
PC (192.168.1.33) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router3 (192.168.0.3)
...
答案1
iptables不是路由工具。儘管有時可以透過標記資料包來補充路由配置,但這裡甚至不需要這樣做。
需要的是基於策略的路由:使用目標位址以外的其他內容來選擇路由:來源位址。
假設或陳述:
- Linux 伺服器將會被調用伺服器
- 所有 9 台電腦,伺服器且3個路由器已經根據OP的示意圖進行配置
- 特別是個人電腦不需要任何特殊設定。他們只需要擁有伺服器作為預設網關。
- OP原理圖中的所有位址都使用/24CIDR/網路遮罩。
- 伺服器用途:
- 乙太網路0地址為 192.168.1.1/24
- 乙太網路1地址為 192.168.0.100/24
- 伺服器可能有也可能沒有預設網關,這並不重要。策略路由將使用其自己的單獨設定來轉送流量,因此不依賴主路由表的預設閘道(如果有)。
如果尚未完成,這 3 個路由器將需要額外的路由才能到達 192.168.1.0/24伺服器作為網關。系統需要同樣的方式才能到達 LAN 192.168.0.0/24。如果他們運行 Linux,這將在 3 個路由器或任何其他系統上完成:
ip route add 192.168.1.0/24 via 192.168.0.100
編輯: 作為後來問,如果不允許重新配置192.168.0.0/24 LAN中的其他系統,伺服器可以在伺服器上使用 NAT 來隱藏 192.168.1.0/24 對這些系統(包括 3 個路由器)的存在。由於這是在路由階段之外完成的,因此這將獨立於下面路由配置的其餘部分。
因此,除了在路由器(或任何其他系統)上完成上述操作之外,還可以使用iptables MASQUERADE
瞄準伺服器:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
從今起伺服器,建立 3 個備用規則群組以到達三個附加路由表:每個選定的路由器一個,將此路由器作為預設閘道。只能有一個預設閘道是正確的,但每個路由表只有一個。
由於 PC 的 IP 位址不是按區塊排序的,因此使用 3x3 規則(如果 IP 區塊正確對齊,則 3 條規則就足夠了,並且有足夠的 CIDR/網路遮罩)。
描述於ip rule(8)
:
在某些情況下,我們希望不僅根據目標位址,而且根據其他資料包欄位來對資料包進行不同的路由:來源位址、IP 協定、傳輸協定連接埠甚至資料包有效負載。此任務稱為「策略路由」。
[...]
每個策略路由規則由選擇器和操作謂詞組成。
在這種情況下,選擇器將選擇 PC 的來源位址,並且操作將查找附加路由表,從而覆寫通常的查找主要的表來選擇專用網關。
路由規則(如果 PC 的 IP 位址在足夠的區塊中對齊,則最多可以簡化為 3 條規則):
ip rule add from 192.168.1.11 lookup 10
ip rule add from 192.168.1.12 lookup 10
ip rule add from 192.168.1.13 lookup 10
ip rule add from 192.168.1.21 lookup 20
ip rule add from 192.168.1.22 lookup 20
ip rule add from 192.168.1.23 lookup 20
ip rule add from 192.168.1.31 lookup 30
ip rule add from 192.168.1.32 lookup 30
ip rule add from 192.168.1.33 lookup 30
描述於ip route(8)
:
路由表:Linux-2.x 可以將路由打包到多個路由表中,這些路由表由1 到2^32-1 範圍內的數字或檔案/etc/iproute2/rt_tables 中的名稱來識別。所有正常路由都插入主路由。 [...]
使用任意值 10、20 和 30 填入其他路由表。這裡是關於選擇不同的網關。
ip route add default via 192.168.0.1 dev eth1 table 10
ip route add default via 192.168.0.2 dev eth1 table 20
ip route add default via 192.168.0.3 dev eth1 table 30
如果 PC 需要存取 192.168.0.0/24 中的其他系統,則應新增這些 LAN 路由(以避免透過路由器出現部分髮夾,這絕不是一個好主意):
ip route add 192.168.0.0/24 dev eth1 table 10
ip route add 192.168.0.0/24 dev eth1 table 20
ip route add 192.168.0.0/24 dev eth1 table 30
結果貓待檢查伺服器和ip route get
:
root@server:~# ip route get from 192.168.1.11 iif eth0 to 8.8.8.8
8.8.8.8 from 192.168.1.11 via 192.168.0.1 dev eth1 table 10
cache iif eth0
root@server:~# ip route get from 192.168.1.21 iif eth0 to 8.8.8.8
8.8.8.8 from 192.168.1.21 via 192.168.0.2 dev eth1 table 20
cache iif eth0
root@server:~# ip route get from 192.168.1.31 iif eth0 to 8.8.8.8
8.8.8.8 from 192.168.1.31 via 192.168.0.3 dev eth1 table 30
cache iif eth0
192.168.1.0/24區域網路中的其他系統遵循主要的沒有基於策略的路由的路由表。例如如果伺服器沒有預設路由主要的表,但只有其兩個 LAN 路由,則不會路由到 192.168.0.0/24 LAN 以外的任何其他內容:
root@server:~# ip route get from 192.168.1.41 iif eth0 to 8.8.8.8
RTNETLINK answers: Network is unreachable
筆記
例如,這3 個路由器可以是執行NAT 的互聯網網關,並使用每個不同的公共IP 位址(可能使用不同的ISP)以廉價的設定訪問互聯網,從而使3 組PC 在互聯網上看到具有3 個不同的公共IP 位址。
上述設定必須與配置網路的工具集成伺服器。根據發行版的不同,這類工具有很多,例如如果向上向下,網路管理器,systemd-networkd,網路計劃可能還有很多其他的,每個都有其特定的配置方法。當然也可以使用帶有上面給定命令的腳本來代替。