將 OpenVPN 與 systemd 一起使用
好的,所以我一直在網上搜尋這個問題的解決方案,但似乎沒有對我有用的答案。希望有人可以幫助我。我只是想配置 OpenVPN 客戶端。
我正在跑步
CrunchBang Linux 3.2.0-4-amd64 Debian 3.2.60-1+deb7u1 x86_64 GNU/Linux
,我剛剛切換到使用systemd
. 轉換很順利,但現在我無法使用 systemd 啟動我的 OpenVPN 客戶端,我嘗試按照這些配置教程進行操作,但沒有任何效果。
- http://fedoraproject.org/wiki/Openvpn
- http://d.stavrovski.net/blog/how-to-install-and-set-up-openvpn-in-debian-7-wheezy
- 並查看了一堆其他不同的指南。
我可以從命令行使用
openvpn /etc/openvpn/vpn.conf
. 所以我知道配置文件很好,它與 sysvinit 一起工作得很好,所以我並不感到驚訝。然後我嘗試只做一個狀態,systemctl status openvpn@vpn.service
結果是:$ sudo systemctl status openvpn@vpn.service openvpn@vpn.service Loaded: error (Reason: No such file or directory) Active: inactive (dead)
我意識到我需要為服務做一些設置。我想被提示輸入密碼,所以我按照本指南創建了一個
openvpn@.service
in/etc/systemd/system/
. 但是重啟 OpenVPN 服務仍然不會提示輸入密碼。$ sudo service openvpn restart [ ok ] Restarting openvpn (via systemctl): openvpn.service.
Fedora 教程介紹了創建符號連結的步驟,但沒有在演練中創建任何 .service 文件。
我錯過了什麼?我需要創建一個 openvpn@vpn.service 嗎?如果是這樣,我到底應該把它放在哪裡?我覺得這不應該這麼難,但我似乎找不到任何適合我的解決方案。我很樂意提供更多需要的資訊。
解決方案
-rw-r--r-- 1 root root 319 Aug 7 10:42 openvpn@.service [Unit] Description=OpenVPN connection to %i After=network.target [Service] Type=forking ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf ExecReload=/bin/kill -HUP $MAINPID WorkingDirectory=/etc/openvpn [Install] WantedBy=multi-user.target openvpn@.service (END)
符號連結:
lrwxrwxrwx 1 root root 36 Aug 7 10:47 openvpn@vpn.service -> /lib/systemd/system/openvpn@.service
提示輸入密碼
現在一切正常,除了提示輸入密碼連接。我已經嘗試過這個解決方案。我從上面稍微調整了文件,並添加了一個像範例中一樣的Expect 腳本。像魅力一樣工作!我的文件在下面。
從上面修改的行
/lib/systemd/system/openvpn@.service
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --management localhost 5559 --management-query-passwords --management-forget-disconnect --config /etc/openvpn/%i.conf ExecStartPost=/usr/bin/expect /lib/systemd/system/openvpn_pw.exp
期待腳本
/lib/systemd/system/openvpn_pw.exp
。確保執行以下操作:
chmod +x
劇本上。- 已
telnet
安裝期望腳本的程式碼:
#!/usr/bin/expect set pass [exec /bin/systemd-ask-password "Please insert Private Key password: "] spawn telnet 127.0.0.1 5559 expect "Enter Private Key Password:" send "password 'Private Key' $pass\r" expect "SUCCESS: 'Private Key' password entered, but not yet verified" send "exit\r" expect eof
需要注意的是,上述解決方案確實會在以下登錄中記錄您以明文形式輸入的密碼
/var/log/syslog
和/var/log/daemon.log
我認為帶有 systemd 的 Debian OpenVPN 設置目前有點損壞。為了讓它在我的機器上工作,我必須:
- 創建
/etc/systemd/system/openvpn@.service.d
(目錄),並在其中放置一個新文件:[單元] 需要=networking.service 之後=networking.service
我打電話給我的文件
local-after-ifup.conf
。它需要以.conf
. (這是目前有點損壞的位。) 2./etc/tmpfiles.d
在(我稱為 mine )中創建一個文件,local-openvpn.conf
其內容為:# 類型路徑模式 UID GID 年齡參數 d /run/openvpn 0755 root root - -
這是Debian 錯誤 741938(在 2.3.3-1 中修復)。 3. 創建一個符號連結到
multi-user.target.wants
(最簡單的方法是systemctl enable openvpn@CONF_NAME.service
)例如,如果你有/etc/openvpn/foo.conf
,你會使用openvpn@foo.service
. 4. 如果您還在 systemd 中顯示了 SysV 初始化腳本,請將其禁用。這是Debian 錯誤 700888(在 2.3.3-1 中修復)。注意:2.3.3-1 或更高版本尚未在 testing 中,儘管它處於不穩定狀態。