Debian

雙跳 VPN - 只能看到 LAN 流量,沒有網際網路

  • August 23, 2020

TLDR: 樹莓派上的雙跳 VPN。可以通過 VPN SSH 到本地設備並查看 samba 共享。無法通過 VPN 獲得網際網路流量。不知道如何進行。

我的設置是一個執行的 Raspberry piopenvpnpi-hole. 我有兩個 openvpn 實例:

  • server.conf- VPN主機結束tun-incoming。這是有效的,我可以看到 VPN DNS 請求pi-hole
  • outgoing.conf- 連接到 VPN 供應商tun-outgoing。在當地工作。我可以看到一個新的IP。

我主要遵循本指南:https ://www.comparitech.com/blog/vpn-privacy/raspberry-pi-vpn/ 這個想法是我應該能夠(1)ssh,查看共享文件等我在本地網路上位於 192.168.. 的所有設備和 (2) 都通過 VPN 供應商建立了網際網路隧道。第一個案例執行良好。

我已經按照指南嘗試過:

ip rule add from 192.168.1.166 lookup 101
ip route add default via 192.168.1.1 table 101

之後,我失去了通過ipv4.

以下是一些相關的輸出:

ip路由列表

pi@raspberrypi2:~ $ ip route list
0.0.0.0/1 via 10.1.11.5 dev tun-outgoing
default via 192.168.1.1 dev eth0 src 192.168.1.166 metric 202
10.1.11.1 via 10.1.11.5 dev tun-outgoing
10.1.11.5 dev tun-outgoing proto kernel scope link src 10.1.11.6
10.8.0.0/24 dev tun-incoming proto kernel scope link src 10.8.0.1
128.0.0.0/1 via 10.1.11.5 dev tun-outgoing
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.166 metric 202
199.229.249.184 via 192.168.1.1 dev eth0

ip規則列表

pi@raspberrypi2:~ $ ip rule list
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

iptables -t nat -S

pi@raspberrypi2:~ $ sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -m comment --comment openvpn-nat-rule -j MASQUERADE

如果配置

pi@raspberrypi2:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.1.166  netmask 255.255.255.0  broadcast 192.168.1.255
       inet6 2604:2000:6aa0:c0d0::307  prefixlen 128  scopeid 0x0<global>
       inet6 fe80::7a09:12ee:27ff:f6fc  prefixlen 64  scopeid 0x20<link>
       inet6 fd38:2d6b:a55b::111  prefixlen 128  scopeid 0x0<global>
       inet6 fd38:2d6b:a55b::307  prefixlen 128  scopeid 0x0<global>
       inet6 fd38:2d6b:a55b:0:3ed3:ce3b:88db:5070  prefixlen 64  scopeid 0x0<global>
       inet6 2604:2000:6aa0:c0d0:70cf:5710:52e:373e  prefixlen 64  scopeid 0x0<global>
       ether dc:a6:32:65:73:5d  txqueuelen 1000  (Ethernet)
       RX packets 48570  bytes 8636380 (8.2 MiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 55906  bytes 34181320 (32.5 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       loop  txqueuelen 1000  (Local Loopback)
       RX packets 331  bytes 27074 (26.4 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 331  bytes 27074 (26.4 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun-incoming: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
       inet 10.8.0.1  netmask 255.255.255.0  destination 10.8.0.1
       inet6 fe80::a8c2:d1fa:b798:f945  prefixlen 64  scopeid 0x20<link>
       unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 9  bytes 432 (432.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun-outgoing: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
       inet 10.1.11.6  netmask 255.255.255.255  destination 10.1.11.5
       inet6 fe80::9fe5:8e1:b1c0:86c5  prefixlen 64  scopeid 0x20<link>
       unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
       RX packets 24200  bytes 3403386 (3.2 MiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 30214  bytes 29464427 (28.0 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
       ether dc:a6:32:65:73:5e  txqueuelen 1000  (Ethernet)
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

TL;DR您不需要 IP 規則。你需要的只是另一個用於數據包傳出tun-outgoing介面的 NAT 規則。

解釋: 正在發生的事情是 VPN 提供商路由器(例如10.1.11.5 dev tun-outgoing)不知道如何返回10.8.0.0/24,因此數據包被丟棄/失去。

這是因為網路10.8.0.0/24是路由器已知的(意味著它在路由表中)raspberrypi2,但不在同一 VPN 中的任何其他主機(例如 LAN 主機和外部 VPN 提供商)都不知道。

僅查看您提到的第二個案例(使用 VPN 提供商上網),理論上您有兩種方法可以解決此問題:

  1. 通過在您需要從 VPN 內部訪問的每個主機中配置(靜態/自動)路由 ( tun-incoming)
  2. 或者,通過使用 NAT 屏蔽 IP

第一種方法在存在外部參與者(VPN 提供商)的情況下顯然不可行,因此您只能通過創建這樣的 NAT 規則來解決此問題:

-A POSTROUTING -s 10.8.0.0/24 -o tun-outgoing -j MASQUERADE

此規則將使用VPN 提供商已知10.8.0.0/24的(源)IP 地址屏蔽從您的 VPN 通過 VPN 到 Internet 的所有連接。raspberrypi2

第一個案例(LAN 訪問): 對於第一個案例,您可以(實際上是)仍然使用 NAT 方法,但方法 2 也可以適用。要應用它,如果raspberrypi2是 LAN 的預設網關,您可以簡單地刪除 NAT 規則,一切都會正常工作。

如果rasperrypi2不是LAN預設網關,您仍然可以通過以下方式應用方法 2:

  • 在目前區域網路預設網關中配置靜態路由
  • 或者,在區域網路的每台主機上配置一條靜態路由

raspberrypi2(顯然,兩者都指向10.8.0.0/24子網)。

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