Linux

OpenVPN如何通過客戶端路由網際網路流量

  • December 29, 2019

我的案例:我想machine B通過machine A. 但是,我不能簡單地將 OpenVPN 伺服器安裝在machine Amachine A無法控制的 NAT/防火牆層後面。我目前的解決方案是安裝 OpenVPN 伺服器machine C,並擁有兩者machines A並作為客戶端B連接C。我正在嘗試**設置正確的路線,以便B可以路由A**來自的所有流量。下面詳細介紹了每台機器上的設置和我嘗試過的步驟,剩下的問題在倒數第二段。

現在,machine C在 Docker 容器 ( https://github.com/kylemanna/docker-openvpn ) 中執行 Linux 和 OpenVPN 伺服器。使用redirect-gateway def1,兩台客戶端電腦都可以通過伺服器連接和路由流量(https://ipleak.net確認伺服器 IP)。但是,對於以下測試,redirect-gateway def1刪除了,而topology subnet添加了 和client-to-client。伺服器有子網IP192.168.255.1和公網IP AAA.BBB.CCC.DDD

machine A執行 Windows 並已IPEnabledRouter=1設置HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\,服務Routing and Remote Access設置為Automatic並執行,並且具有 Internet 訪問權限的網路適配器設置為允許從 OpenVPN TAP 適配器共享。它被分配192.168.255.2

machine B執行 Windows 並且位於具有 IP 的路由器後面192.168.1.100。它被分配了 OpenVPN 子網 IP 192.168.255.3。除了 OpenVPN 自動設置的路由之外,還添加了以下路由:

Network Destination        Netmask          Gateway       Interface  Metric
         0.0.0.0        128.0.0.0    192.168.255.2    192.168.255.3    259
       128.0.0.0        128.0.0.0    192.168.255.2    192.168.255.3    259
 AAA.BBB.CCC.DDD  255.255.255.255      192.168.1.1    192.168.1.100    291

machine B,我可以 ping通machine A192.168.255.2網際網路流量仍然通過 OpenVPN 伺服器路由(ipleak 顯示AAA.BBB.CCC.DDD)。我嘗試添加一個 route: route add default gw 192.168.255.2 tun0,但這會使客戶端無法訪問 Internet。伺服器路由表通常如下所示:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.19.0.1      0.0.0.0         UG    0      0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
192.168.254.0   192.168.255.2   255.255.255.0   UG    0      0        0 tun0
192.168.255.0   0.0.0.0         255.255.255.0   U     0      0        0 tun0

我怎樣才能使這項工作?

**$$ EDIT $$**關於案例的更多背景資訊:我需要為一個部門設置 VPN,以便他們使用者的家用電腦machine B可以訪問基於 IP 地址限制訪問的第三方資源。訪問machine A未被阻止,但組織中至少有兩層 NAT/防火牆,其管理員不想更改其設置以幫助處理傳入連接。因此,我們想設計一個可行的解決方案,使用machine C可能是 VPS 作為 VPN 伺服器。有一個官方的 VPN 服務,但由於它對某些外部成員開放,第三方供應商不希望允許其 IP 訪問。

網路圖

原則上,設置應該類似於RoutedLans,除了我們不能簡單地設置machine A為 handle 0.0.0.0。這個 SF答案解釋了為什麼不能通過另一個客戶端作為網關使用 TUN 介面發送數據包。但是,根據對此答案的第一條評論有一種解決方法。

machine C

  1. 將以下內容添加到伺服器配置中:
topology subnet
client-to-client

route 1.0.0.0 255.0.0.0
route 2.0.0.0 254.0.0.0
route 4.0.0.0 252.0.0.0
route 8.0.0.0 248.0.0.0
route 16.0.0.0 240.0.0.0
route 32.0.0.0 224.0.0.0
route 64.0.0.0 192.0.0.0
route 128.0.0.0 128.0.0.0

push "route 1.0.0.0 255.0.0.0"
push "route 2.0.0.0 254.0.0.0"
push "route 4.0.0.0 252.0.0.0"
push "route 8.0.0.0 248.0.0.0"
push "route 16.0.0.0 240.0.0.0"
push "route 32.0.0.0 224.0.0.0"
push "route 64.0.0.0 192.0.0.0"
push "route 128.0.0.0 128.0.0.0"
  1. machine A為in設置 iroutes 和靜態 IP client-config-dir
ifconfig-push 192.168.255.2 255.255.255.0
push "route 192.168.255.0 255.255.255.0 192.168.255.1"

iroute 1.0.0.0 255.0.0.0
iroute 2.0.0.0 254.0.0.0
iroute 4.0.0.0 252.0.0.0
iroute 8.0.0.0 248.0.0.0
iroute 16.0.0.0 240.0.0.0
iroute 32.0.0.0 224.0.0.0
iroute 64.0.0.0 192.0.0.0
iroute 128.0.0.0 128.0.0.0

machine A

  1. HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\,設置IPEnableRouter=1
  2. 將服務設置Routing and Remote AccessAutomatic並確保它正在執行。
  3. 將網路適配器設置為具有 Internet 訪問權限,以允許從 OpenVPN TAP 適配器進行共享。似乎每次重新啟動機器時都必須禁用並重新啟用共享。

On machine B:確保redirect-gateway def1在客戶端配置中。

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