![无法连接到 LAN 外的 OpenVPN](https://linux22.com/image/1447711/%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%20LAN%20%E5%A4%96%E7%9A%84%20OpenVPN.png)
我在路由器后面设置了 OpenVPN,并进行了端口转发1194
。VPN 使用子网10.3.15.0/24
,并且位于192.168.1.14
LAN 上。
当我在本地连接或从家庭网络连接到公共 IP 时,它可以正常工作。但在我尝试过的其他网络上则不行。
我无法与 VPN 建立连接,在客户端上我得到:
Mon Apr 20 13:50:42 2015 UDPv4 link local: [undef]
Mon Apr 20 13:50:42 2015 UDPv4 link remote: [AF_INET]83.***.***.***:1194
Mon Apr 20 13:51:42 2015 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Mon Apr 20 13:51:42 2015 TLS Error: TLS handshake failed
Mon Apr 20 13:51:42 2015 SIGUSR1[soft,tls-error] received, process restarting
Mon Apr 20 13:51:42 2015 Restart pause, 2 second(s)
我认为这可能是防火墙问题,这是我的 iptables 的问题:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- 10.3.15.0/24 anywhere ctstate NEW
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
但我尝试过刷新表格,但没有成功。运行时tcpdump -qni any port 1194
会有一些通信(在两种情况下):
13:44:35.936684 IP 194.***.***.****.53929 > 192.168.1.14.1194: UDP, length 14
13:44:41.043704 IP 194.***.***.****.22955 > 192.168.1.14.1194: UDP, length 14
13:44:43.063426 IP 194.***.***.****.22955 > 192.168.1.14.1194: UDP, length 14
13:44:43.544690 IP 194.***.***.****.53929 > 192.168.1.14.1194: UDP, length 14
我还注意到了一些关于的事情destination port unreachable
,但那些错误消失了。
这是我的服务器配置:
port 1194
proto udp
dev tun
ca openvpn_certs/host-ca.pem
cert openvpn_certs/host-cert.pem
key openvpn_certs/host-key.pem
dh openvpn_certs/dh1024.pem
server 10.3.15.0 255.255.255.0
route 10.3.15.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "redirect-gateway def1 bypass-dhcp"
push "remote-gateway 10.3.15.1"
client-to-client
max-clients 20
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 11
这是我的客户端配置:
client
dev vpn
dev-type tun
proto udp
remote server.remote 1194
resolv-retry infinite
nobind
ns-cert-type server
persist-key
persist-tun
pull
ca certs/ca-host.pem
cert certs/cert-local.pem
key certs/key-local.pem
comp-lzo
verb 11
服务器运行 Alpine Linux,而客户端运行 Gentoo。
我陷入困境,不知道该去哪里找,有什么想法或指导吗?
谢谢!
答案1
首先,我不确定您使用的是哪个版本的 OpenVPN,但“remote-gateway”在 v2.3.2 中不是有效选项。如果您使用的是旧版本,请检查本地手册页并在必要时删除该指令。
根据OpenVPN 维基百科,错误“TLS 密钥协商失败...”几乎总是由于以下原因造成的:
服务器网络上的外围防火墙正在过滤传入的 OpenVPN 数据包(默认情况下,OpenVPN 使用 UDP 或 TCP 端口号 1194)。
- 在您的情况下这似乎不太可能,但为了确保万无一失,请检查路由器的防火墙。
OpenVPN 服务器机器本身上运行的软件防火墙正在过滤端口 1194 上的传入连接。
您提供的过滤表看起来不错,假设您通常将默认 INPUT 策略设置为接受。否则,您需要允许 UDP 端口 1194:
iptables -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
服务器网络上的 NAT 网关没有针对 TCP/UDP 1194 到 OpenVPN 服务器计算机内部地址的端口转发规则。
OpenVPN 客户端配置在其配置文件中没有正确的服务器地址。客户端配置文件中的远程指令必须指向服务器本身或服务器网络网关的公共 IP 地址。
Windows 防火墙阻止了对 openvpn.exe 二进制文件的访问。您可能需要将其列入白名单(将其添加到“例外”列表)以使 OpenVPN 正常运行。
如果仍然有问题,则可能是您的公钥基础设施存在问题。我不熟悉 Alpine Linux,也不知道他们的 OpenVPN 软件包是否附带 easy-rsa,所以请继续下载最新版本并将其解压到服务器和(最好是)非网络连接机器(您的证书颁发机构)上的适当位置。为简单起见,我假设您的服务器正在为客户端生成请求。在两个系统上,切换到您解压 EasyRSA 的目录并...
cp vars.example vars
editor ./vars
在 CA 系统上,取消注释并相应编辑组织字段(EASYRSA_REQ_COUNTRY 等)。在服务器上,可选择更改“set_var EASYRSA_PKI”,使其指向适当的位置(例如 /etc/openvpn/pki)。
在服务器上生成证书请求:
./easyrsa init-pki
./easyrsa gen-req <your_server_name> nopass
./easyrsa gen-req <some_client_name> nopass
在非服务器上,创建一个新的CA:
./easyrsa init-pki
./easyrsa build-ca
将 .req 文件复制到您的 CA 系统,然后导入并签名:
./easyrsa import-req server /tmp/<your_server_name>.req
./easyrsa import-req client /tmp/<some_client_name>.req
./easyrsa sign-req server <your_server_name>
./easyrsa sign-req client <some_client_name>
将新签名的证书以及 CA 证书复制到服务器和客户端上的适当位置。然后在服务器上生成 dh 参数:
./easyrsa gen-dh
最后,将客户端密钥复制到客户端机器(如果尚未存在),并使用新的密钥和证书位置更新您的配置。
答案2
确保您的服务器证书已使用 nsCertType=server 标识进行签名(如果您使用的是 easyrsa3,则该标识已弃用,并且不是默认标识)。否则,客户端配置中的“ns-cert-type server”指令将导致 tls 握手失败。请改用“remote-cert-tls server”。