在不影響主機的情況下使用 iptables + OpenVPN 進行 NAT
我希望利用 Linux 設備作為預設網關,通過 OpenVPN 連接路由主機外流量,而不影響主機路由網際網路。我不希望主機的流量通過 VPN 流出,只希望來自其他設備的流量。
我已經成功配置了 NAT,使用主機上的任何預設路由,讓來自使用我的主機作為預設網關出口的設備的流量(例如,如果 VPN 已打開,則通過 VPN,如果未打開,則通過主機正常的 Internet 連接,主機作為 traceroute 中的附加躍點)
但是,我無法成功配置此項,以便 OpenVPN 連接不會影響主機網路*,並且*主機通過 OpenVPN 介面路由網關流量
我所做的事情: - 配置了 IP 轉發並驗證了它的工作原理 - 能夠停止 OpenVPN 更新主機上的預設路由,
route-nopull
並且pull-filter ignore redirect-gateway
我猜這其中有一個動態部分(從打開的 vpn 配置中提取路由資訊),或者希望是“不,真的,只是將這些路由應用於 NAT 流量”標誌/設置。
網路配置:
- 網際網路訪問是通過一個沒有花哨功能的無聊路由器
- 連接到網路的 Linux 設備 (Raspberry Pi),執行 ufw、iptables、openvpn
- 其他有線設備,其中一些我想手動將其預設網關設置為 Linux 設備
- 子網是
192.168.0.0/24
現在不坐在電腦前,但這是我的總體想法:
首先:
讓 Raspberry 擁有一個靜態 IP 地址,其預設網關是無聊的路由器。
如果無聊的路由器充當 DHCP 伺服器,請**停用它!**讓 Raspberry 成為 DHCP 伺服器(或網路上的另一台主機)。
讓 DHCP 伺服器將 Raspberry 設備廣播為網路的預設路由器,而不是無聊的路由器。
Traceroute 將是:
主機 -> 樹莓 -> 無聊的路由器 -> 網際網路
現在魔法來了。
如果您想將流量轉移到 VPN 上而不是預設的出門方式,那麼您應該
source based routing
在 Raspberry 上使用。那些通過 VPN 的特定主機的 Traceroute 將是:
主機 -> Raspberry -> Openvpn 隧道 -> 網際網路。
為此
ip forwarding
,必須在 Raspberry 和 VPN 伺服器上啟用此功能。當我下班回家時,我會擴展答案。:-)
編輯
關於基於源的路由的快速回顧:
我將此頁面用作我的解決方案的基礎。
這個想法是,您可以根據流量的來源來確定流量的轉發方式。
Linux 中的預設路由表稱為
main
. 您可以使用命令查看所有路由表的名稱ip rule show
。它應該將此輸出作為預設值:
0: from all lookup local 32766: from all lookup main 32767: from all lookup default
Raspberry 將遍歷所有匹配規則並使用第一個匹配的規則轉發包。
由於該表
main
包含一條規則,如下所示:default via <boring routers ip address> dev eth0
然後它將所有流量轉發到無聊的路由器以訪問網際網路。
但問題來了:您可以為要通過 VPN 連接發送的所有主機製作單獨的路由表。為簡單起見,我們稱之為路由表
openvpn
。您必須進行更改
/etc/iproute2/rt_tables
,使其看起來像這樣:# # reserved values # 255 local 254 main 253 default 200 openvpn # <-- Note THIS line! 0 unspec # # local # #1 inr.ruhep
假設您想通過 VPN 轉移另一台 IP 地址為 192.168.0.100 的機器,然後您會制定一條規則,如下所示:
ip rule add from 192.168.0.100 table openvpn
如果我們假設隧道內 VPN 網關的 IP 地址是 10.0.0.1,那麼您可以使用以下命令設置預設路由:
ip route add default via 10.0.0.1 table openvpn dev tun0
如果您網路上的所有主機都使用 Raspberry 作為其網關,那麼它們的所有流量都將轉發到路由器,除非流量來自 192.168.0.100。在這種情況下,它將通過 VPN 連結轉發。
這是你要找的嗎?:-)