Debian

Debian 上的 OpenVPN 拒絕連接,systemd 只執行 /bin/true?

  • June 30, 2019

我對此感到非常困惑,這似乎完全錯誤,但我不知道如何從頭開始。

我使用本指南在我的 Debian 伺服器上配置了 openvpn 。在我將必要的文件複製到我的 archlinux 桌面並嘗試執行腳本後,我注意到連接剛剛超時:

$ openvpn server.ovpn
Thu Aug  2 18:50:29 2018 OpenVPN 2.4.6 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2018
Thu Aug  2 18:50:29 2018 library versions: OpenSSL 1.1.0h  27 Mar 2018, LZO 2.10
Thu Aug  2 18:50:29 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]<server-ip>:1194
Thu Aug  2 18:50:29 2018 Socket Buffers: R=[212992->212992] S=[212992->212992]
Thu Aug  2 18:50:29 2018 UDP link local: (not bound)
Thu Aug  2 18:50:29 2018 UDP link remote: [AF_INET]<server-ip>:1194
Thu Aug  2 18:50:29 2018 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
Thu Aug  2 18:51:29 2018 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Thu Aug  2 18:51:29 2018 TLS Error: TLS handshake failed
Thu Aug  2 18:51:29 2018 SIGUSR1[soft,tls-error] received, process restarting
Thu Aug  2 18:51:29 2018 Restart pause, 5 second(s)
^CThu Aug  2 18:51:32 2018 SIGINT[hard,init_instance] received, process exiting

我認為這可能是防火牆問題,所以我決定在測試時暫時放棄我的防火牆,但沒有運氣(我在客戶端和伺服器上都這樣做了):

$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 15 packets, 1056 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 8 packets, 768 bytes)
pkts bytes target     prot opt in     out     source               destination

我決定確定我實際上是在嘗試建立連接,所以我打開了 wireshark 並看到了這個:

1   <my-ip>         <server-ip> OpenVPN 56  MessageType: P_CONTROL_HARD_RESET_CLIENT_V2
2   <server-ip>     <my-ip>     ICMP    84  Destination unreachable (Port unreachable)
3   <my-ip>         <server-ip> OpenVPN 56  MessageType: P_CONTROL_HARD_RESET_CLIENT_V2
4   <server-ip>     <my-ip>     ICMP    84  Destination unreachable (Port unreachable)
15  <my-ip>         <server-ip> OpenVPN 56  MessageType: P_CONTROL_HARD_RESET_CLIENT_V2
16  <server-ip>     <my-ip>     ICMP    84  Destination unreachable (Port unreachable)
29  <my-ip>         <server-ip> OpenVPN 56  MessageType: P_CONTROL_HARD_RESET_CLIENT_V2
32  <server-ip>     <my-ip>     ICMP    84  Destination unreachable (Port unreachable)
51  <my-ip>         <server-ip> OpenVPN 56  MessageType: P_CONTROL_HARD_RESET_CLIENT_V2
52  <server-ip>     <my-ip>     ICMP    84  Destination unreachable (Port unreachable)

因為我知道沒有防火牆規則阻止它,所以我去看看 open vpn 是否均勻,執行:

$ sudo lsof -i | grep -i vpn
$ sudo ps ax | grep -i vpn
19969 pts/0    S+     0:00 grep -i vpn

什麼都沒有回來。我檢查了 systemd 以確保它沒有崩潰:

$ systemctl status openvpn
● openvpn.service - OpenVPN service
  Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
  Active: active (exited) since Thu 2018-08-02 09:37:24 CDT; 11h ago
 Process: 12769 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 12769 (code=exited, status=0/SUCCESS)
   Tasks: 0 (limit: 4915)
  CGroup: /system.slice/openvpn.service

它說它退出了成功,但後來我注意到“ ExecStart=/bin/true ”。有沒有搞錯?我打開服務文件,看到這個:

$ cat /lib/systemd/system/openvpn.service
# This service is actually a systemd target,
# but we are using a service since targets cannot be reloaded.

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

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/etc/openvpn

[Install]
WantedBy=multi-user.target

我承認,openvpn 是一個我不完全理解的複雜軟體,但如何ExecStart=/bin/true正確呢?我很難相信這只是一個佔位符,以某種方式將其投入生產,因為比我現在更聰明的人已經抓住了它,但我就是不明白。這有什麼意義?如何讓 openvpn 等待握手?

我承認,openvpn 是一個我不完全理解的複雜軟體,但是 ExecStart=/bin/true 是如何正確的呢?

這實際上不是 OpenVPN 的功能,而是 systemd 的功能。在大多數帶有 systemd 的系統上,OpenVPN 都會附帶一個模板單元和一個生成器。這允許您的系統支持多個 OpenVPN 實例,並允許 systemd 分別監控和控制每個 VPN

在 Debian 系統上,您想要查看的模板單元在這裡。/lib/systemd/system/openvpn@.service, 生成器就在這裡/lib/systemd/system-generators/openvpn-generator

該模板單元有一個像這樣的 ExecStart。

ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid

例如,在我的系統上,我執行了幾個 VPN 配置

# systemctl list-units | grep openvpn
openvpn.service                 loaded active exited    OpenVPN service                                                              
openvpn@zoredachesrv.service    loaded active running   OpenVPN connection to zoredachesrv                                              
openvpn@p2p-to-valiant.service  loaded active running   OpenVPN connection to p2p-to-valiant   

您可以使用類似的命令查詢單個 openvpn 實例systemctl status openvpn@zoredachesrv.service

如果您剛剛添加了此配置,您可能必須使用systemctl daemon-reloadfor systemd 來辨識新單位。

如果您的配置字面上命名為“server.conf”並且沒有被混淆,那麼您將使用systemctl status openvpn@server.service

至於解決您的問題,我建議您檢查一下 openvpn 是否正在執行並打開一個套接字lsof -ni | grep openvpn。然後還要檢查 OpenVPN 向您的系統日誌報告了哪些錯誤或任何內容grep openvpn /var/log/syslog | tail -50。這兩件事中的一件應該給你一個關於正在發生的事情的提示。

引用自:https://serverfault.com/questions/924727