網路新手。我的主機上有兩個介面:eth0
一個tun0
來自我的 OpenVPN 用戶端。 IP 位址是:
eth0 192.168.1.22
tun0 10.1.0.8
問題1
為了外向的將目標位址變更為 的流量tun0
會強制其使用 VPN 嗎?
不可以,但使用 tun0 的網關位址可以。 使用以下內容進行測試:
iptables -t nat -N VPN
iptables -t nat -I OUTPUT -j VPN
iptables -t nat -A VPN -p tcp -j DNAT --to-destination 10.1.0.170
10.1.0.170
VPN 的網關位址在哪裡(使用 找到ip route
)。
- 上面的範例
-N
為 nat 表 (-t
) 建立了一個 NEW ( ) 鏈。 - 到 VPN 鏈的跳轉來自
OUT
(直接在本機應用程式之後)。使用 insert(-I
) 取代 OUT 中的其他規則。 - 這表示來自任何來源的流量都會將目的地變更為
tun0
裝置的網關。
問題2(一)
對於出站流量,目標位址是介面的 IP 位址eth0
還是網關位址?假設eth0
是預設介面/網關。
問題2(b)
對於本地應用程式產生的流量,來源位址是什麼?
問題3
這個問題可以純粹透過 iptables 解決還是需要修改路由表?因為兩個介面都在同一主機上(即同一個 debian 盒子)。
附加資訊
我試著理解其中的原理,以便將其應用到我的案例中。總共有三個 I 位址子網,第三個位於與另一個虛擬介面關聯的 172.17.42.1/16 範圍內docker0
。
本質上我想引導流量只是172.17.42.8 透過 VPN。
答案1
首先也是最重要的是,ArchLinux wiki iptables 頁面連結的優秀圖表對於識別通過各個iptables
鏈的資料包流非常有用(在答案的底部)。
備份
iptables-save > back.up.file
檢查你的 Linux 發行版風格,我需要添加,sudo
因為我不是 root。
問題 2(a), 2(b)
為了確定來源位址和目標位址,我發現LOG
和TRACE
函數非常有用:
iptables -t filter -I OUTPUT -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "ABC-LOG-PREFIX "
預設表是,但我已經明確說明了它,filter
以便您可以看到語法,特別是如果您想探索其他表等mangle
。新增了速率限制,因此日誌檔案不會變得飽和。最後添加了一個前綴,以便可以輕鬆搜尋日誌檔案。例如,在 Linux Mint 上:nat
-I
-m limit --limit 5/m --limit-burst 10
--log-prefix
cat /var/log/kern.log | grep "ABC-LOG-PREFIX"
其次,為了調試,該TRACE
命令將追蹤資料包的整個過程:
IPTABLES -t raw -A PREROUTING -p tcp -j TRACE
警告,這將跟踪全部tcp 資料包,更多資訊請參見行政柏林
問題3
由於兩個介面(eth0
和tun0
)位於同一主機上,從下面的資料包過濾器圖中您可以看到出站流量它們在同一點開始。封包採用的路由由預設閘道及其關聯的介面決定,可以iproute2
透過執行以下命令來決定:
ip route
這將顯示預設網關,哪些介面用於哪些位址範圍。
資料包流程圖
答案2
據我所知,您正在談論分割隧道(或者更確切地說,試圖停用它)。
看一下 OpenVPN 中的重定向網關指令:https://openvpn.net/index.php/open-source/documentation/howto.html#redirect
答案3
在下列範例中,VPN 裝置名稱為 tun0 (OpenVPN),VPN 閘道為 172.21.23.172
#1 - 在 Linux 路由器上安裝 VPN(我使用的是 ipvanish w. openvpn)
#2 - 使用 iptables 路由流量
sudo iptables -t nat -A POSTROUTING -o [VPN dev] -j MASQUERADE
例子:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#3 - 設定路由表(以確保所有流量都透過 VPN 路由)
sudo ip route add default via [VPN ipv4 address] dev [VPN dev]
例子:
sudo ip route add default via 172.21.23.172 dev tun0
#4 - 透過執行以下命令檢查網路上的設備是否確實透過 VPN 路由:
Windows:tracert 1.1.1.1
Linux:traceroute 1.1.1.1
你完成了!