網關上基於客戶端的路由
我有一個帶有兩個介面的網路網關(Debian):eth0 和 tun0。一般來說,來自所有客戶端的所有流量都通過 tun0 路由。
我想通過以下方式改變它:
- 客戶端 a 的流量僅通過 eth0 路由
- 客戶端 b 的流量僅通過 tun0 路由
- 如果存在,所有其他客戶端都通過 tun0 路由,並且通過 eth0 是 tun0 不可用
我目前正在使用 iptables 路由源自網關本身的特定流量,但不知道如何將其更改為“基於客戶端”的路由。
- 更新 - -
- 客戶端 A 將有一個靜態 IP 地址
- 客戶端 B 將有一個靜態 IP 地址
- eth0 有一個動態 IP 地址
- tun0 有一個動態 IP 地址
正如使用者 Ferenc 已經提到的,策略路由可能是最好的解決方案。
看一下
ip rule
,它通常看起來像這樣:# ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
這是規則優先級的排序列表,後跟規則規範。
local
,main
並且default
是要查看的路由表。要查看特定的路由表執行ip route show table <table>
或簡而言之ip r s t <table>
。為了將不同的源 IP 路由到不同的目標或通過不同的設備,我們需要單獨的路由表和路由規則來跳轉到這些表。
假設我們想要為 IP 10.0.0.42 設置一個特殊路由,為網路 10.0.0.128/25 設置一個特殊路由。我們必須創建兩個附加規則和兩個附加表,順序無關緊要。讓我們創建規則。例子:
# ip rule add from 10.0.0.42 lookup 300 prio 5 # ip rule add from 10.0.0.128/25 lookup 301 prio 6
讓我們來看看它們:
# ip rule 0: from all lookup local 5: from 10.0.0.42 lookup 300 6: from 10.0.0.128/25 lookup 301 32766: from all lookup main 32767: from all lookup default
300
和301
是我們的表名(表通常只是數字,但也可以通過將它們添加到 來命名/etc/iproute2/rt_tables
)。其餘的應該是不言自明的。現在我們需要填寫這些表格。例子:
# ip route add default via 10.0.0.1 dev eth1 table 300 # ip route add 192.168.178.0/24 dev eth2 table 301
讓我們來看看它們:
# ip route show table 300 default via 10.0.0.1 dev eth1 scope link # ip route show table 301 192.168.178.0/24 dev eth2 scope link
如您所見,可以添加您喜歡的任何路線。來自地址 10.0.0.42 的系統現在將通過 eth1 上的 10.0.0.1 進行路由。如果目標地址在網路 192.168.178.0/24 內,來自網路 10.0.0.128/25 的系統現在將通過 eth2 路由。
如果您的特殊路由表中沒有匹配的路由,則評估下一個路由規則。例如,如果來自網路 10.0.0.128/25 的系統不想路由到 192.168.178.0/24,那麼它們會退回到主表。
如果要刪除任何規則,只需替換
add
為del
. 路由表將一直存在,直到您刪除所有路由,例如通過執行ip route flush table <table>
. 如果您想查看所有路由規則,只需執行ip route show table all
.路由規則非常靈活,您可以使用各種其他選擇器,例如傳入/傳出介面、源/目標埠和協議。詳情請參閱
man ip rule
。通過 SSH 編輯路由和規則時,請注意不要將自己鎖定。