Linux
基於埠的特定介面上的路由
我在一台 Linux 機器上有一個 php / bash 應用程序,它有 1 個物理介面連接到例如出站網路伺服器 123.123.123.123 :80。我通過幾個 openvpn 提供商來做到這一點。我有 tun 和 tap 提供程序,但我最喜歡的提供程序使用 tun。
實際上我完全能夠連續:
- 打開VPN
sudo route add 123.123.123.123 tun0
- 將流量發送到 123.123.123.123 :80
- 關閉VPN
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