首页 > 解决方案 > 通过服务启动 OpenVPN 客户端 - TLS 错误

问题描述

我想通过服务启动 OpenVPN 客户端。所以我写了这个服务(位于/etc/systemd/system/):

[Unit]
Description=...
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client.conf
ExecPreStart=/usr/sbin/rngd /dev/urandom
ExecPreStart=/etc/openvpn/update-resolv-conf

[Install]
WantedBy=multi-user.target

我的client.conf样子是这样的:

client
dev-tun
remote ...
proto udp
resolv-retry infinite
persist-tun
persist-key

# Cert files config...
# Cypher and auth config ...

现在我遇到了服务启动 OpenVPN 时出现错误的问题:

TLS Error: TLS key negotiation failed to oocur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed
SIGUSR1[soft,tls-error] received, process restarting

有趣的事实是,在我重新启动服务后(系统启动后也立即)不会发生错误。该错误仅在首次启动服务时发生。因此,我尝试了sleep(最多 1 分钟)ExecPreStart或创建更多的熵/dev/urandom并执行/etc/openvpn/update-resolv-conf(如您在服务中看到的那样)。没有什么帮助。

这是什么原因,我该如何解决这个问题?我不想编写一个仅在启动后重新启动服务一次的脚本。

编辑/更新:

我发现只有当 OpenVPN 客户端是由系统本身“启动”时才会发生错误。我的意思是服务或 crontab。只有当我自己(作为root用户)在 bash 中启动服务时,它才能工作。

标签: servicevpnsystemdopenvpn

解决方案


之后订购您的服务network.target不足以确保互联网连接。您需要在之后订购您的服务network-online.target并使其依赖它:

After=network-online.target
Wants=network-online.target

有关详细信息,请参阅fd.o 上的 NetworkTarget 。


推荐阅读