我想通过服务启动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
中使用了ExecPreStart
(最长1分钟),或者在/dev/urandom
中创建了更多的熵并执行了/etc/openvpn/update-resolv-conf
(如您在服务中所看到的)。没有任何帮助。
这是什么原因,我该如何解决?我不想编写仅在启动后重新启动服务的脚本。
编辑/更新:
我发现只有在OpenVPN客户端被系统本身“启动”的情况下才会发生错误。我的意思是通过服务或crontab。仅当我以bash身份(以root
用户身份)启动服务时,该服务才有效。
答案 0 :(得分:0)
在network.target
之后订购服务还不足以确保互联网连接。您需要在network-online.target
之后订购服务,并使其依赖于该服务:
After=network-online.target
Wants=network-online.target
有关更多信息,请参见NetworkTarget on fd.o。