Iptables

同一台機器上的 OpenVPN 客戶端和伺服器 - 連接客戶端時伺服器不允許連接

  • February 12, 2020

我是這個社區的新手,希望有人可以幫助我。如果我沒有發布所有必需的資訊,請告訴我。

情況:

  • 我有一個 linux 伺服器(樹莓派,192.168.1.2),作為付費 VPN 提供商的 OpenVPN 客戶端(tun1)。我通過使用 linux 伺服器作為預設網關 (192.168.1.2) 在本地與 LAN 客戶端共享此 VPN 連接。這工作沒有任何問題。
  • 在同一台 linux 伺服器上,我正在執行一個單獨的 openVPN 實例(VPN 伺服器,tun0)以允許 WAN 客戶端連接。只要未建立與付費 VPN 提供商的 VPN 客戶端連接,這也可以正常工作。
  • 我的最終目標是與通過單獨的 openVPN 伺服器 (tun0) 實例連接的 WAN 客戶端共享付費 VPN 連接 (tun1)。

我的本地網路設置方案:

在此處輸入圖像描述

問題:

  • 只要我不同時執行它們,openVPN 客戶端和 openVPN 伺服器實例就可以正常工作。一旦他們的 openVPN 客戶端連接到付費 VPN 提供商,WAN 客戶端就無法連接到 openVPN 伺服器。
  • 通過查看日誌文件,我發現只要建立付費 VPN 連接,WAN 客戶端握手就會失敗。我認為這是因為一旦建立了這個付費 VPN 連接,所有傳出的網際網路流量都會通過隧道 (tun1) 路由,因此客戶端的握手請求仍然沒有得到答复。我不知道如何解決這個問題。

如果配置

pi@server:~ $ ifconfig -a
eth0      Link encap:Ethernet  HWaddr b8:27:eb:f2:c1:98
         BROADCAST MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 58:82:a8:8d:9a:fa
         inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:203 errors:0 dropped:0 overruns:0 frame:0
         TX packets:165 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:22948 (22.4 KiB)  TX bytes:24938 (24.3 KiB)

lo        Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:65536  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
         inet addr:10.77.0.1  P-t-P:10.77.0.2  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
         inet addr:10.130.1.70  P-t-P:10.130.1.69  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

iptables

pi@server:~ $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             anywhere             udp dpt:1199

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  10.77.0.0/24         anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Route -n(當 tun0/tun1執行且未連接時)

pi@server:~ $ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1

Route -n(當 tun0 正在執行和連接時)

pi@server:~ $ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1
10.77.0.0       10.77.0.2       255.255.255.0   UG    0      0        0 tun0
10.77.0.2       0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1

Route -n(當 tun1 正在執行和連接時)

pi@raspi-cyberghost:~ $ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.130.0.133    128.0.0.0       UG    0      0        0 tun1
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1
10.77.0.0       10.77.0.2       255.255.255.0   UG    0      0        0 tun0
10.77.0.2       0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.130.0.1      10.130.0.133    255.255.255.255 UGH   0      0        0 tun1
10.130.0.133    0.0.0.0         255.255.255.255 UH    0      0        0 tun1
107.183.241.2   192.168.1.1     255.255.255.255 UGH   0      0        0 eth1
128.0.0.0       10.130.0.133    128.0.0.0       UG    0      0        0 tun1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1

在連接 OpenVPN 客戶端 (tun1) 時嘗試連接時的 OpenVPN 伺服器 (tun0) 錯誤日誌

Tue Mar 21 08:06:19 2017 us=593849 172.56.28.50:24844 TLS: Initial packet from [AF_INET]172.56.28.50:24844, sid=d25df6fb 2136a7cc
Tue Mar 21 08:07:19 2017 us=128339 172.56.28.50:24844 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Tue Mar 21 08:07:19 2017 us=128603 172.56.28.50:24844 TLS Error: TLS handshake failed
Tue Mar 21 08:07:19 2017 us=129254 172.56.28.50:24844 SIGUSR1[soft,tls-error] received, client-instance restarting

找到了我的解決方案。問題是有必要建立兩個路由表:一個處理到 Pi 的傳入流量(及其相應的回复),另一個處理來自 Pi 的傳出流量(及其回复)。

第二個路由表為我解決了這個問題:

ip rule add from 192.168.1.2 lookup 10           # Pi server
ip route add default via 192.168.1.1 table 10    # LAN router

引用自:https://unix.stackexchange.com/questions/352841