Debian

網關上基於客戶端的路由

  • March 9, 2019

我有一個帶有兩個介面的網路網關(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

這是規則優先級的排序列表,後跟規則規範。localmain並且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

300301是我們的表名(表通常只是數字,但也可以通過將它們添加到 來命名/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,那麼它們會退回到主表。

如果要刪除任何規則,只需替換adddel. 路由表將一直存在,直到您刪除所有路由,例如通過執行ip route flush table <table>. 如果您想查看所有路由規則,只需執行ip route show table all.

路由規則非常靈活,您可以使用各種其他選擇器,例如傳入/傳出介面、源/目標埠和協議。詳情請參閱man ip rule

通過 SSH 編輯路由和規則時,請注意不要將自己鎖定。

引用自:https://unix.stackexchange.com/questions/492424