Networking

通過特定介面路由特定埠上的流量?

  • July 18, 2018

我目前正在執行一個系統,在該系統中我需要能夠直接發送和接收 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 層,因此僅路由不足以處理此問題。

簡而言之:必須用標記iptablesip 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 服務可能無法按預期工作。

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