Linux

基於埠的特定介面上的路由

  • November 7, 2015

我在一台 Linux 機器上有一個 php / bash 應用程序,它有 1 個物理介面連接到例如出站網路伺服器 123.123.123.123 :80。我通過幾個 openvpn 提供商來做到這一點。我有 tun 和 tap 提供程序,但我最喜歡的提供程序使用 tun。

實際上我完全能夠連續:

  1. 打開VPN
  2. sudo route add 123.123.123.123 tun0
  3. 將流量發送到 123.123.123.123 :80
  4. 關閉VPN
  5. sudo route del 123.123.123.123

我在 .ovpn 配置文件中使用“route-nopull”選項,以保持 Linux 機器可訪問並允許同時進行 openvpn 連接。

現在我需要打開幾個獨立的請求,總是到出站網路伺服器 123.123.123.123:80。但我的實際流程是串列的,我需要等待第一個連接關閉並自行清除,然後再嘗試第二個連接。

我很確定我可以通過“假埠”來實現它。例如:

  • 介面 tun0、tun1、tun2
  • 假埠 9000、9001、9002
  • 多個路由表 rt0, rt1, rt2

所以從概念上講:

  • 123.123.123.123:9000 -> 標記為 rt0(tun0 是預設網關)-> 重寫為 123.123.123.123:80 -> rt0
  • 123.123.123.123:9001 -> 標記為 rt1(tun1 是預設網關)-> 重寫為 123.123.123.123:80 -> rt1
  • 123.123.123.123:9002 -> 標記為 rt2(tun2 是預設網關)-> 重寫為 123.123.123.123:80 -> rt2

我只能代表概念,因為我幾乎沒有 iptables 的技能。如果您有不同的方法來實現結果,歡迎他們。感謝您的閱讀和幫助。

我在這裡解決並記錄了它:http: //aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html

這將使核心永久路由數據包,啟用多個路由,甚至對於未在機器上證明的網路:

nano /etc/sysctl.conf

net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done

這將初始化 iptables,尤其是 mangle 和 nat,它們是標記流量所必需的:

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

添加替代路線編輯:

nano /etc/iproute2/rt_tables

添加(名稱是您的參考):

1 tunnel0
2 tunnel1

添加路由和規則,我們使用表 ID 而不是更直接的名稱。如您所見,網關無關緊要,尤其是對於可以具有動態網關的隧道:

ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2

添加規則以標記流量並綁定到相應的表:

ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache

檢查你是否喜歡:

ip route show table 1
ip route show table 2
ip rule show

如果你錯過了什麼,你可以這樣刪除:

ip rule del table 1
ip route flush table 1

現在缺少的部分:這行不通:

iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1

這會:

iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save

您是否需要選擇流量並將其同時推送到設備/隧道中?沒問題,我也解決了這個問題:

iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80

NAT 強制回复

iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE

iptables-save

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