iptables 透過 VPN 引導流量

iptables 透過 VPN 引導流量

網路新手。我的主機上有兩個介面: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.170VPN 的網關位址在哪裡(使用 找到ip route)。

  1. 上面的範例-N為 nat 表 ( -t) 建立了一個 NEW ( ) 鏈。
  2. 到 VPN 鏈的跳轉來自OUT(直接在本機應用程式之後)。使用 insert( -I) 取代 OUT 中的其他規則。
  3. 這表示來自任何來源的流量都會將目的地變更為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)

為了確定來源位址和目標位址,我發現LOGTRACE函數非常有用:

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

由於兩個介面(eth0tun0)位於同一主機上,從下面的資料包過濾器圖中您可以看到出站流量它們在同一點開始。封包採用的路由由預設閘道及其關聯的介面決定,可以iproute2透過執行以下命令來決定:

ip route

這將顯示預設網關,哪些介面用於哪些位址範圍。

資料包流程圖

iptables資料包流程圖

答案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.1Linux:traceroute 1.1.1.1

你完成了!

相關內容