我最近用 OpenVPN 设置了一个 Debian Wheezy 服务器,以帮助一些在互联网审查存在问题(包括 VPN 流量普遍被阻止)的地区的朋友。为了解决这个问题,客户端首先创建到服务器的 SSH 隧道,然后通过该隧道连接到 VPN。
该服务器开放了 SSH 端口 40001,并为使用 TCP 协议的 OpenVPN 服务器开放了端口 40002。这两个端口似乎都在路由器上正确配置。
我向我的客户提供一个脚本,该脚本将他们的 localhost:8080 隧道传输到 myserver:40001,然后连接到 VPN。他们的客户端 OpenVPN 配置将“remote”设置为“localhost 8080”,这样 VPN 连接就通过这个 SSH 隧道进行。
我的问题是,这个隧道有时似乎能工作(似乎是在随机时间),但经常无法保持连接。我还看到它同时在某些计算机(主要是我自己的)上工作,但在其他计算机上不工作。当它失败时,客户端将连接到 VPN,但无法访问互联网,大约 30-40 秒后,SSH 隧道进程将结束(手动打开隧道时,它只会在隧道死机时产生“写入错误:管道损坏”)。我在服务器或客户端日志中找不到任何信息来表明为什么会发生这种情况或是什么导致隧道中断。
我知道这不是 VPN 连接本身的错误,因为如果我将远程 IP 从 localhost:8080 更改为我的服务器的真实公共地址和 OpenVPN 端口,它将始终正常工作。
我怀疑我的 iptables 规则允许直接传入 VPN 的连接,但对来自服务器内部(由于 SSH 隧道)的 VPN 连接进行不同的处理。但是,如果是这样的话,我不明白为什么它只能偶尔工作。还有什么可能导致这些连接中断?我在 /var/log/auth.log、/etc/openvpn/openvpn.log 或任何客户端日志中都找不到任何相关信息。
我的 /etc/iptables/rules.v4 如下:
*nat
:PREROUTING ACCEPT [211:13875]
:INPUT ACCEPT [3:371]
:OUTPUT ACCEPT [5:348]
:POSTROUTING ACCEPT [5:348]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [7937:9042429]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [10987:15593548]
:fail2ban-ssh - [0:0]
-A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT
-A INPUT -p tcp -d localhost --destination-port 40001 -j ACCEPT
COMMIT
编辑:我找到了导致问题的原因,但我不知道如何修复它。当客户端运行 VPN 时,所有流量(包括 SSH 隧道本身的流量)都会通过它进行路由。当然,这是循环的,会导致隧道崩溃。我只需要以某种方式将 SSH 隧道从 OpenVPN 的路由中排除...