service - 通过服务启动 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 中启动服务时,它才能工作。
解决方案
之后订购您的服务network.target
不足以确保互联网连接。您需要在之后订购您的服务network-online.target
并使其依赖它:
After=network-online.target
Wants=network-online.target
有关详细信息,请参阅fd.o 上的 NetworkTarget 。
推荐阅读
- html - 有没有办法增加标题标签之间的间距?
- ajax - Ajax 不适用于 Apache,但相同的代码可用于 Django 开发服务器
- git - 如何第二次还原/变基?
- mysql - mysql + node.js - 如何执行每一个或不执行任何查询?
- angular - 当 Angular 应用程序仍然使用指向不同页面的超链接时,为什么它们被称为单页应用程序?
- java - Hazelcast 用户代码部署与动态生成的类
- java - Apache CXF 3.2 如何读取 SOAP 错误消息
- node.js - 平均堆栈中的 API
- c# - 将 HTML 转换为 PDF 时出现 CSS 转换和写入模式属性的问题
- python - 在 Numpy 中查找非零值/索引