通過特定介面路由特定埠上的流量?
我目前正在執行一個系統,在該系統中我需要能夠直接發送和接收 HTTP 和 HTTPS 流量,但是所有其他流量都必須通過 VPN。
我的設置是:
x2 介面:eth0(本地網路,在路由器後面)和 tun0(openvpn 客戶端)
目前所有流量都通過我的 vpn 路由,我想知道是否可以不通過 VPN 路由 http 和 https 流量(80、443)。
這是系統和openvpn客戶端啟動時的路由表:
0.0.0.0/1 via 10.8.13.5 dev tun0 default via 192.168.1.1 dev eth0 10.8.13.1 via 10.8.13.5 dev tun0 10.8.13.5 dev tun0 proto kernel scope link src 10.8.13.6 128.0.0.0/1 via 10.8.13.5 dev tun0 176.67.168.144 via 192.168.1.1 dev eth0 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.56 192.168.1.1 dev eth0 scope link
我已經閱讀了其他類似的問題,但是答案不會重新路由流量或只是阻止它。
提前致謝 :)
路由位於 IP 第 3 層。 TCP 位於第 4 層,因此僅路由不足以處理此問題。
簡而言之:必須用標記
iptables
ip rule
感興趣的流量,用’s選擇標記的數據包fwmark
以使用單獨的路由表。然後必須對本地發起/接收的流量案例應用另外兩個修復,這比路由案例更難。所有的設置當然都是在本地系統上完成的。路由表
80
(可以添加匹配的符號名稱,/etc/iproute2/rt_tables
但這不是強制性的)和標記0x80
是“任意”選擇的。ip route add table 80 192.168.1.0/24 dev eth0 scope link src 192.168.1.56 ip route add table 80 default dev eth0 via 192.168.1.1
-I
用於確保不會太晚附加 iptables 規則。如果需要,您應該檢查目前規則如何重新排序:iptables -t mangle -N markports iptables -t mangle -I PREROUTING 1 -j CONNMARK --restore-mark iptables -t mangle -I OUTPUT 1 -m mark --mark 0 -j markports iptables -t mangle -I OUTPUT 2 -j CONNMARK --save-mark iptables -t mangle -A markports -p tcp --dport 80 -j MARK --set-mark 0x80 iptables -t mangle -A markports -p tcp --dport 443 -j MARK --set-mark 0x80 ip rule add fwmark 0x80 lookup 80
此部落格:Netfilter Connmark » 到 Linux 及以後!提供了很好的資訊
CONNMARK
。這應該是有效的,但實際上在第一次路由決策時會選擇錯誤的預設傳出 IP,因為路由即將通過
tun0
。在由於mangle/OUTPUT
’ 標記而進行的重新路由檢查(請參閱Netfilter 和通用網路示意圖中的此數據包流以進行說明),此 IP 不會更改。如果處理的流量被路由而不是本地啟動,則不會發生此問題(使用單獨的網路命名空間來確保這是服務的解決方案,可能不是桌面的解決方案)。因此,這還需要在其上添加一層MASQUERADE
(或SNAT
更複雜的情況):iptables -t nat -I POSTROUTING 1 -m mark --mark 0x80 -j MASQUERADE
現在傳出的源 IP 是正確的,它仍然不起作用:反向路徑過濾器在返迴路徑中觸發,原因大致相同:之前做出的路由決策
PREROUTING
暫時不知道fwmark
(儘管之前的示意圖放置mangle/PREROUTING
在路由之前決定,顯然不是這種情況),因此認為返回的流量數據包被欺騙並提前丟棄它們。必須將eth0
介面rp_filter
置於鬆散模式才能允許這樣做。這可能有一些(在 NAT 之後非常輕微)安全問題,但我發現對於這種非路由情況是不可避免的:echo 2 > /proc/sys/net/ipv4/conf/eth0/rp_filter
您必須找到如何永久設置它(例如
echo net.ipv4.conf.eth0.rp_filter=2 > /etc/sysctl.d/90-local-loose-mode.conf
,如果以後沒有其他任何改變)。使用與 OP 具有類似設置的命名空間進行了測試。
注意:DNS 請求仍將通過隧道。某些地理定位的 Web 服務可能無法按預期工作。