Iptables

在不影響主機的情況下使用 iptables + OpenVPN 進行 NAT

  • February 16, 2020

我希望利用 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 連結轉發。

這是你要找的嗎?:-)

引用自:https://serverfault.com/questions/1002430