OpenVPN

出自 Arch Linux 中文维基

本文內容或本節內容已經過期。

原因: 請提供模板的第一個位置參數以概括原因。 (在Talk:OpenVPN討論)

這篇文章或章節的翻譯不反映原文。

原因:Still out of date, even after the 2021-12-01 update, e.g. this page still references rc.conf(在 Talk:OpenVPN# 中討論)

本文介紹了 OpenVPN 的基本的安裝與配置過程,適用於個人使用與小型商業使用。要了解更多信息,請訪問官方網站 HOWTOOpenVPN 2.4 手冊頁 以及 Manual。OpenVPN 是一個健壯的、高度靈活的 VPN 守護進程。它支持 SSL/TLS 安全、以太網橋接、經由代理TCPUDP 隧道NAT。另外,它也支持動態 IP 地址以及 DHCP,可伸縮性足以支持數百或數千用戶的使用場景,同時可移植至大多數主流作業系統平台上。

OpenVPN 與 OpenSSL 庫緊密相關,並由此獲得許多加密功能。它除了支持使用預共享密鑰(靜態密鑰模式)或使用非對稱加密的公鑰SSL/TLS 模式)這兩種傳統加密方式之外。還支持不加密的 TCP/UDP 隧道。

OpenVPN 配合大多數平台上都有的 TUN/TAP 虛擬網絡接口一起使用。總體而言,它旨在提供 IPSec 的許多關鍵功能,但佔用空間相對較小。OpenVPN 由 James Yonan 編寫,並在 GNU 通用公共許可證 (GPL) 下發佈。


安裝[編輯 | 編輯原始碼]

安裝 openvpn,它同時支持伺服器和客戶端模式。

可用的前端:

  • NetworkManager OpenVPN — OpenVPN 的 NetworkManager VPN 插件。
https://wiki.gnome.org/Projects/NetworkManager/VPN || networkmanager-openvpn
  • QOpenVPN — 用 PyQt 為基於 systemd 的發行版編寫的簡單 OpenVPN GUI。
https://github.com/xmikos/qopenvpn || qopenvpn
  • eOVPN — 用於連接、管理和更新 OpenVPN 配置的應用程式。
https://github.com/jkotra/eOVPN || eovpnAUR

內核配置[編輯 | 編輯原始碼]

OpenVPN 需要 TUN/TAP 的支持,默認內核已經進行了正確的配置。自定義的內核需要啟用 tun 模塊。

Kernel config file
 Device Drivers
  --> Network device support
    [M] Universal TUN/TAP device driver support

詳情參閱 Kernel modules

連接到第三方提供的 VPN[編輯 | 編輯原始碼]

要連接到第三方提供的 VPN 服務,可以忽略以下大部分內容,尤其是在伺服器設置方面。 從 #客戶端配置文件 開始,然後跳到 #啟動 OpenVPN。 應使用提供商證書和說明,請參閱 Category:VPN providers 以獲取可適用於其他提供商的示例。 Linux Containers 中的 OpenVPN 客戶端 也有一般適用的說明,同時它更進一步,將 OpenVPN 客戶端進程隔離到容器中。

注意: 大多數免費的 VPN 提供商會(通常只)提供 PPTP, 它更容易設置和配置,但 不安全

從頭開始創建公鑰基礎設施 (PKI)[編輯 | 編輯原始碼]

在設置 OpenVPN 伺服器時,用戶需要創建一個公開密鑰基礎建設 (PKI),這在 Easy-RSA 文章中有詳細說明。 按照單獨文章中的步驟創建所需的證書、私鑰和相關文件後,此時 /etc/openvpn/server 中應該有 5 個文件:

ca.crt
dh.pem
servername.crt
servername.key
ta.key

或者,從 OpenVPN 2.4 開始,可以使用 Easy-RSA 使用橢圓曲線生成證書和密鑰。 有關詳細信息,請參閱 OpenVPN 文檔。

一個基本的三層 IP 路由配置[編輯 | 編輯原始碼]

注意: 除非另有明確說明,本文的其餘部分均假設基本的第 3 層 IP 路由配置。

OpenVPN 是一個非常通用的軟件,可以進行多種配置,實際上機器既可以是伺服器,也可以是客戶端。

隨着 v2.4 的發佈,伺服器配置存儲在 /etc/openvpn/server 中,客戶端配置存儲在 /etc/openvpn/client 中,每種模式都有自己的systemd 單元,即 openvpn-client@.serviceopenvpn-server@.service

示例配置[編輯 | 編輯原始碼]

OpenVPN 軟件包附帶了一系列用於不同目的的示例配置文件。示例伺服器和客戶端配置文件是基本 OpenVPN 設置的理想起點,具有以下功能:

  • 使用 Public Key Infrastructure (PKI) 進行身份驗證。
  • 使用虛擬 TUN 網絡接口(OSI 第 3 層 IP 路由)創建 VPN。
  • 監聽 UDP 端口 1194 上的客戶端連接(OpenVPN 的官方 IANA 端口號[1] )。
  • 將虛擬地址分配給來自 10.8.0.0/24 子網的連接客戶端。

有關更高級的配置,請參閱 openvpn(8) 手冊頁和 OpenVPN 文檔

伺服器配置文件[編輯 | 編輯原始碼]

注意: 請注意,如果伺服器位於防火牆或 NAT 轉換路由器後面,則必須將 OpenVPN 端口轉發到伺服器。

將示例伺服器配置文件 /usr/share/openvpn/examples/server.conf 複製到 /etc/openvpn/server/server.conf

編輯文件,至少進行以下更改:

/etc/openvpn/server/server.conf
ca ca.crt
cert servername.crt
key servername.key
dh dh.pem

tls-crypt ta.key # Replaces tls-auth ta.key 0

user nobody
group nobody

如果使用帶有橢圓曲線的 TLS,請指定 dh noneecdh-curve secp521r1。使用橢圓曲線時不使用 DH 參數文件。從 OpenVPN 2.4.8 開始,需要在伺服器配置中指定橢圓曲線的類型。否則伺服器將無法識別曲線類型並可能使用不兼容的曲線類型,從而導致身份驗證錯誤。

強化伺服器[編輯 | 編輯原始碼]

如果優先考慮安全性,則建議進行其他配置,包括:限制伺服器使用強密碼/身份驗證方法和(可選)將啟用的 TLS 密碼集限制為較新的密碼。從 OpenVPN 2.4 開始,伺服器和客戶端將在 TLS 模式下自動協商 AES-256-GCM。

將以下內容添加到 /etc/openvpn/server/server.conf

本文或本章節的語言、語法或風格需要改進。參考:Help:Style

原因:使用說明屬於維基文本,不屬於代碼塊。避免諸如「邊緣安全性」之類的主觀術語。(在Talk:OpenVPN討論)

最安全

/etc/openvpn/server/server.conf
cipher AES-256-GCM
auth SHA512
tls-version-min 1.3
#Uncomment  tls-cipher to limit possible negotiation options to the strongest ciphers, doing so it's no longer possible to generate certs with current easyrsa, more information
#tls-cipher TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

本文或本章節的語言、語法或風格需要改進。參考:Help:Style

原因:兼容性選項不適合強化部分。(在Talk:OpenVPN討論)

與大多數設備的兼容性

/etc/openvpn/server/server.conf
cipher AES-256-GCM
auth SHA512
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
注意:
  • .ovpn 客戶端配置文件「必須」包含匹配的密碼和身份驗證行才能正常工作(至少對於 iOS 和 Android 客戶端)。
  • 錯誤地使用 tls-cipher 可能會導致調試連接困難,並且可能沒有必要。有關更多信息,請參閱 OpenVPN 的社區維基

啟用壓縮[編輯 | 編輯原始碼]

上游不建議啟用壓縮;這樣做會向伺服器打開所謂的 VORACLE 攻擊向量。請參閱 這篇文章。

非標準端口和/或協議[編輯 | 編輯原始碼]

一般建議使用 OpenVPN over UDP,因為 TCP over TCP 不是一個好主意[2]

某些網絡可能不允許默認端口和/或協議上的 OpenVPN 連接。規避這一點的一種策略是模擬 HTTPS 流量,這很可能是暢通無阻的。

為此,請將 /etc/openvpn/server/server.conf 配置為:

/etc/openvpn/server/server.conf
port 443
proto tcp
注意: .ovpn 客戶端配置文件 必須包含匹配的端口和原型線才能正常工作!

在物理機的不同端口上運行多個 OpenVPN 實例[編輯 | 編輯原始碼]

可以在同一台機器上運行多個並發的 OpenVPN 實例。每個伺服器都需要在 /etc/openvpn/server/ 中定義為單獨的 .conf 文件。至少,並行伺服器需要在不同的端口上運行。一個簡單的設置將流量連接到一個單獨的 IP 池。更高級的設置超出了本指南的範圍。

考慮這個例子,運行 2 個並發伺服器,一個端口 443/udp,另一個端口 80/tcp。

首先修改創建的 /etc/openvpn/server/server.conf 如下:

/etc/openvpn/server/server.conf
port 443
proto udp
server 10.8.0.0 255.255.255.0

現在複製它並修改副本以在 80/tcp 上運行:

/etc/openvpn/server/server2.conf
port 80
proto tcp
server 10.8.1.0 255.255.255.0

請務必在防火牆中設置相應的條目,請參閱#防火牆配置 中的相關部分。

客戶端配置文件[編輯 | 編輯原始碼]

將示例客戶端配置文件 /usr/share/openvpn/examples/client.conf 複製到 /etc/openvpn/client/

編輯以下內容:

  • remote 指令反映伺服器的 Fully Qualified Domain Name、主機名(客戶端已知)或其 IP 地址。
  • 取消註釋 usergroup 指令以刪除權限。
  • cacertkey 參數反映密鑰和證書的路徑和名稱。
  • 啟用 TLS HMAC 握手保護(--tls-crypt--tls-auth)。
/etc/openvpn/client/client.conf
client
remote elmer.acmecorp.org 1194

user nobody
group nobody
ca ca.crt
cert client.crt
key client.key

tls-crypt ta.key # Replaces tls-auth ta.key 1

以非特權用戶身份運行[編輯 | 編輯原始碼]

在配置文件中使用選項 user nobodygroup nobody 會使OpenVPN在建立連接後放棄其 root 權限。缺點是在 VPN 斷開連接後,守護進程無法再次刪除其設置的網絡路由。如果想要在沒有 VPN 連接的情況下限制傳輸流量,那麼延遲路由可能被認為是有益的。但是,也可能發生 OpenVPN 伺服器在隧道運行時向路由推送更新的情況。具有刪除權限的客戶端將無法執行更新並退出並出現錯誤。

由於似乎需要手動操作來管理路由,因此選項 user nobodygroup nobody 可能看起來不受歡迎。然而,根據設置,有不同的方法來處理這些情況:

  • 對於單元的錯誤,一個簡單的方法是edit它並在[Service]部分添加一個Restart=on-failure。但是,僅此一項不會刪除任何過時的路由,因此可能會發生重新啟動的隧道未正確路由的情況。
  • 包中包含/usr/lib/openvpn/plugins/openvpn-plugin-down-root.so,可以用來讓openvpnfork一個只有root權限的進程從主進程接收到關閉信號時執行自定義腳本的任務,該進程正在處理具有刪除權限的隧道(另請參閱其 README)。

下面連結的 OpenVPN HowTo 更進一步,創建了一個專用的非特權用戶/組,而不是現有的 nobody。這樣做的好處是避免了在守護進程之間共享用戶時的潛在風險:

  • OpenVPN HowTo 解釋了如何創建非特權用戶模式和包裝腳本以自動恢復路由的另一種方法。
  • 可以讓 OpenVPN 首先以非特權用戶身份啟動,而無需以 root 身份運行,請參閱 這個 OpenVPN wiki(howto)。 howto 假設存在 System V init,而不是 Systemd 並且不包括 --up/--down 腳本的處理 - 那些應該被處理與 ip 命令相同的方式,額外注意訪問權限。
  • 也可以從無特權的 podman 容器中運行 OpenVPN,請參閱 這部分 OpenVPN HowTo
提示:#openvpn-unroot 描述了一種自動化上述設置的工具。

將證書轉換為加密的 .p12 格式[編輯 | 編輯原始碼]

某些軟件只會讀取存儲在密碼加密的 .p12 文件中的 VPN 證書。這些可以使用以下命令生成:

# openssl pkcs12 -export -inkey keys/bugs.key -in keys/bugs.crt -certfile keys/ca.crt -out keys/bugs.p12


測試 OpenVPN 配置[編輯 | 編輯原始碼]

在伺服器上(以 root 用戶)運行 openvpn /etc/openvpn/server/server.conf,在客戶端(以 root 用戶)運行 openvpn /etc/openvpn/client/client.conf。示例輸出應類似於以下內容:

# openvpn /etc/openvpn/server/server.conf
Wed Dec 28 14:41:26 2011 OpenVPN 2.2.1 x86_64-unknown-linux-gnu [SSL] [LZO2] [EPOLL] [eurephia] built on Aug 13 2011
Wed Dec 28 14:41:26 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Wed Dec 28 14:41:26 2011 Diffie-Hellman initialized with 2048 bit key
...
Wed Dec 28 14:41:54 2011 bugs/95.126.136.73:48904 MULTI: primary virtual IP for bugs/95.126.136.73:48904: 10.8.0.6
Wed Dec 28 14:41:57 2011 bugs/95.126.136.73:48904 PUSH: Received control message: 'PUSH_REQUEST'
Wed Dec 28 14:41:57 2011 bugs/95.126.136.73:48904 SENT CONTROL [bugs]: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5' (status=1)
# openvpn /etc/openvpn/client/client.conf
Wed Dec 28 14:41:50 2011 OpenVPN 2.2.1 i686-pc-linux-gnu [SSL] [LZO2] [EPOLL] [eurephia] built on Aug 13 2011
Wed Dec 28 14:41:50 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
...
Wed Dec 28 14:41:57 2011 GID set to nobody
Wed Dec 28 14:41:57 2011 UID set to nobody
Wed Dec 28 14:41:57 2011 Initialization Sequence Completed

查找IP位址分配給伺服器上的tunX接口,從客戶端ping

查找IP位址分配給客戶端的tunX接口,從伺服器ping

注意: 如果使用防火牆,請確保 TUN 設備上的 IP 數據包沒有被阻止。

使用 Fragment 和 MSS 配置 MTU[編輯 | 編輯原始碼]

如果在通過 OpenVPN 使用(遠程)服務時遇到問題(例如網頁瀏覽、DNSNFS),則可能需要手動設置 MTU 值。

以下消息可能指示應調整 MTU 值:

read UDPv4 [EMSGSIZE Path-MTU=1407]: Message too long (code=90)

為了獲得最大段大小 (MSS),客戶端需要沿着到伺服器的路徑發現最小的 MTU。為了做到這一點 ping 伺服器並禁用碎片,然後指定最大數據包大小 [3]

# ping -M do -s 1500 -c 1 example.com

每次將 1500 值減 10,直到 ping 成功。

注意: 不支持「片段」指令的客戶端(例如 OpenELEC,應用程式) 無法連接到使用 fragment 指令的伺服器。請參閱 mtu-test 作為替代解決方案。

更新客戶端配置以使用成功的 MTU 值,例如:

/etc/openvpn/client/client.conf
remote example.com 1194

tun-mtu 1400 
mssfix 1360

可能會指示 OpenVPN 每次在客戶端連接時測試 MTU。請耐心等待,因為客戶端可能不會通知正在運行的測試,並且連接在完成之前可能會顯示為無效。以下將增加大約 3 分鐘的 OpenVPN 啟動時間。建議配置片段大小,除非客戶端將通過許多不同的網絡進行連接並且瓶頸不在伺服器端:

/etc/openvpn/client/client.conf
remote example.com 1194

mtu-test

IPv6[編輯 | 編輯原始碼]

通過 IPv6 連接到伺服器[編輯 | 編輯原始碼]

從 OpenVPN 2.4 開始,當僅使用 proto udpproto tcp 時,OpenVPN 將使用作業系統定義的 AF_INET,在大多數情況下,這將僅是 IPv4。要同時使用 IPv4 和 IPv6,請使用 proto udp6proto tcp6。要僅強制執行 IPv4,請使用 proto udp4proto tcp4。在較舊的 OpenVPN 版本上,一個伺服器實例只能支持 IPv4 或 IPv6。

在隧道內提供 IPv6[編輯 | 編輯原始碼]

為了在隧道內提供 IPv6,請將 IPv6 前綴路由到 OpenVPN 伺服器。要麼在網關上設置靜態路由(如果分配了靜態塊),要麼使用 DHCPv6 客戶端通過 DHCPv6 前綴委派獲取前綴(詳情請參閱IPv6 Prefix delegation)。還可以考慮使用來自地址塊 fc00::/7 的唯一本地地址。這兩種方法各有優缺點:

  • 許多 ISP 僅提供動態更改的 IPv6 前綴。 OpenVPN 不支持前綴更改,因此每次更改前綴時都要更改 server.conf(也許可以通過腳本自動實現)。
  • ULA 地址不會路由到 Internet,並且設置 NAT 不像使用 IPv4 那樣簡單。這意味着不能通過隧道路由整個流量。那些希望通過 IPv6 連接兩個站點而不需要通過隧道連接到 Internet 的人可能希望使用 ULA 地址來輕鬆。

或者,NDP 代理應該可以工作。請參閱 這個 StackExchange 帖子

收到前綴(建議使用 /64)後,將以下內容附加到 server.conf:

server-ipv6 2001:db8:0:123::/64

這是相當於 OpenVPN 的默認 10.8.0.0/24 網絡的 IPv6,需要從 DHCPv6 客戶端獲取。或者使用例如 fd00:1234::/64。

那些想要將路由推送到家庭網絡(192.168.1.0/24 等效)的人,還需要附加:

push "route-ipv6 2001:db8:0:abc::/64"

OpenVPN 尚不包括 DHCPv6,因此沒有方法例如通過 IPv6 推送 DNS 伺服器。這需要通過 IPv4 來完成。 OpenVPN Wiki 提供了一些其他配置選項。

啟動 OpenVPN[編輯 | 編輯原始碼]

手動啟動[編輯 | 編輯原始碼]

systemd 服務配置[編輯 | 編輯原始碼]

讓 NetworkManager 開始連接[編輯 | 編輯原始碼]

NetworkManager-native VPN 配置[編輯 | 編輯原始碼]

圖形界面配置[編輯 | 編輯原始碼]

CLI 配置[編輯 | 編輯原始碼]

與連接同步狀態[編輯 | 編輯原始碼]

故障排除[編輯 | 編輯原始碼]

沒有證書密碼[編輯 | 編輯原始碼]

通過伺服器路由客戶端流量[編輯 | 編輯原始碼]

防火牆配置[編輯 | 編輯原始碼]

防火牆[編輯 | 編輯原始碼]

ufw[編輯 | 編輯原始碼]

iptables[編輯 | 編輯原始碼]

如果 VPN 出現故障,防止泄漏[編輯 | 編輯原始碼]

ufw[編輯 | 編輯原始碼]

vpnfailsafe[編輯 | 編輯原始碼]

第 3 層 IPv4 路由[編輯 | 編輯原始碼]

路由 LAN 的先決條件[編輯 | 編輯原始碼]

路由表[編輯 | 編輯原始碼]

將伺服器 LAN 連接到客戶端[編輯 | 編輯原始碼]

將客戶端 LAN 連接到伺服器[編輯 | 編輯原始碼]

連接客戶端和伺服器 LANs[編輯 | 編輯原始碼]

連接客戶端和客戶端局域網[編輯 | 編輯原始碼]

域名解析[編輯 | 編輯原始碼]

pull-resolv-conf 自定義腳本[編輯 | 編輯原始碼]

update-resolv-conf 自定義腳本[編輯 | 編輯原始碼]

update-systemd-resolved 自定義腳本[編輯 | 編輯原始碼]

使用 NetworkManager 覆蓋 DNS 伺服器[編輯 | 編輯原始碼]

第 2 層以太網橋接[編輯 | 編輯原始碼]

配置生成器[編輯 | 編輯原始碼]

ovpngen[編輯 | 編輯原始碼]

openvpn-unroot[編輯 | 編輯原始碼]

故障排除[編輯 | 編輯原始碼]

客戶端守護進程在掛起後沒有重新連接[編輯 | 編輯原始碼]

一段時間不活動後連接斷開[編輯 | 編輯原始碼]

PID 文件不存在[編輯 | 編輯原始碼]

路由配置失敗, systemd-networkd[編輯 | 編輯原始碼]

tls-crypt 解包錯誤:數據包太短[編輯 | 編輯原始碼]

另見[編輯 | 編輯原始碼]

準備證書和密鑰數據[編輯 | 編輯原始碼]

現在要創建所需的證書和密鑰,可以在任何機器上完成,即使沒有聯網也可以進行。 設置證書和密鑰生成腳本的默認值。編輯 /etc/openvpn/easy-rsa/vars,設置 KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG 和 KEY_EMAIL 參數(不要留空任何參數),然後導出環境變量。

# source ./vars

清理之前的密鑰:

# ./clean-all

build-ca 腳本創建了 certificate authority (CA) ca.key,密鑰認證機器需要這個密鑰。伺服器和客戶端需要 ca.crt 證書。

# ./build-ca

build-key-server 為伺服器創建一個證書和密鑰對。使用中不要輸入簡單的密碼或公司名。

# ./build-key-server <server-name>

build-dh 腳本創建伺服器需要的 Diffie-Hellman pem 文件。

# ./build-dh

build-key 腳本創建客戶端證書和密鑰對。可以生成任意多個以給不同的客戶端使用。只要保證客戶端名 <client> 是唯一的。如果要用密碼認證客戶端,請使用 build-key-pass 腳本。

# ./build-key <client1>
# ./build-key <client2>

生成的文件都保存在 /etc/openvpn/easy-rsa/keys。如果有錯誤,可以通過運行 clean-all 腳本,然後從頭開始。注意這將刪除之前生成的證書和密鑰。

# ./clean-all

最後一步是將所有需要的文件通過安全通道放到正確的機器上。ca.crt 需要放到所有伺服器和客戶端。server.crt, server.keydh{n}.pem 文件放到伺服器, client.crtclient.key 文件放到客戶端。


配置伺服器[編輯 | 編輯原始碼]

複製默認伺服器配置文件[編輯 | 編輯原始碼]

# cp /usr/share/openvpn/examples/server.conf /etc/openvpn/openvpn.conf

使用 PAM 和密碼認證[編輯 | 編輯原始碼]

port 1194
proto udp
dev tap
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/<MYSERVER>.crt
key /etc/openvpn/easy-rsa/keys/<MYSERVER>.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
server 192.168.56.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;learn-address ./script
client-to-client
;duplicate-cn
keepalive 10 120
;tls-auth ta.key 0
comp-lzo
;max-clients 100
;user nobody
;group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
client-cert-not-required
username-as-common-name
plugin /usr/lib/openvpn/openvpn-auth-pam.so login

使用證書認證[編輯 | 編輯原始碼]

port 1194
proto tcp
dev tun0

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/<MYSERVER>.crt
key /etc/openvpn/easy-rsa/keys/<MYSERVER>.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3

log-append /var/log/openvpn
status /tmp/vpn.status 10

通過伺服器路由[編輯 | 編輯原始碼]

將下面內容寫入伺服器的 openvpn.conf 配置文件,"192.168.1.1" 修改為外部 DNS IP 地址。

push "dhcp-option DNS 192.168.1.1"
push "redirect-gateway def1"

使用 iptable 進行 NAT 轉發:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

如果運行在 OpenVZ VPS 環境,參見 [4]:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to (venet0 ip)

如果一切正常,保存修改,編輯 /etc/conf.d/iptables 設置 IPTABLES_FORWARD=1

/etc/rc.d/iptables save

客戶端配置[編輯 | 編輯原始碼]

配置客戶端的 .conf 文件

使用密碼認證[編輯 | 編輯原始碼]

client
dev tap
proto udp
remote <address> 1194
resolv-retry infinite
nobind
persist-tun
comp-lzo
verb 3
auth-user-pass passwd
ca ca.crt

auth-user-pass 引用的 passwd 文件必須包含如下兩行:

  • 第一行 - username
  • 第二行 - password

證書驗證[編輯 | 編輯原始碼]

client
remote <MYSERVER> 1194
dev tun0
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
verb 2
ca ca.crt
cert client1.crt
key client1.key
comp-lzo

ca.crt, client1.crtclient1.key複製到遠程計算機:

安裝隧道模塊:

 # sudo modprobe tun

要讓 tun 模塊自動啟動,請將其加入 /etc/rc.conf 的 Modules 行。

DNS[編輯 | 編輯原始碼]

系統使用的 DNS 伺服器定義在/etc/resolv.conf。通常此文件由控制系統網絡的模塊(Wicd, NetworkManager 等)維護。然而,如果希望通過遠程伺服器解析地址,OpenVPN 需要修改這個文件。

安裝 openresolv軟件包,它可以實現多個程序互不影響的修改 resolv.conf。安裝後通過重啟網絡連接,保證 resolv.conf 是由 "resolvconf" 創建而且 DNS 解析工作正常。openresolv 不需要配置,它會自動檢測和使用網絡系統。

然後將如下腳本保存到/usr/share/openvpn/update-resolv-conf:

#!/bin/bash
#
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood <jdthood@yahoo.co.uk>
# and Chris Hanson
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.
#
# 05/2006 chlauber@bnc.ch
#
# Example envs set from openvpn:
# foreign_option_1='dhcp-option DNS 193.43.27.132'
# foreign_option_2='dhcp-option DNS 193.43.27.133'
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'

[ -x /usr/sbin/resolvconf ] || exit 0

case $script_type in

up)
   for optionname in ${!foreign_option_*} ; do
      option="${!optionname}"
      echo $option
      part1=$(echo "$option" | cut -d " " -f 1)
      if [ "$part1" == "dhcp-option" ] ; then
         part2=$(echo "$option" | cut -d " " -f 2)
         part3=$(echo "$option" | cut -d " " -f 3)
         if [ "$part2" == "DNS" ] ; then
            IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
         fi
         if [ "$part2" == "DOMAIN" ] ; then
            IF_DNS_SEARCH="$part3"
         fi
      fi
   done
   R=""
   if [ "$IF_DNS_SEARCH" ] ; then
           R="${R}search $IF_DNS_SEARCH
"
   fi
   for NS in $IF_DNS_NAMESERVERS ; do
           R="${R}nameserver $NS
"
   done
   echo -n "$R" | /usr/sbin/resolvconf -a "${dev}.inet"
   ;;
down)
   /usr/sbin/resolvconf -d "${dev}.inet"
   ;;
esac

設置腳本可執行屬性:

$ chmod +x /usr/share/openvpn/update-resolv-conf

然後將下面內容加入 OpenVPN 客戶端的配置文件:

script-security 2
up /usr/share/openvpn/update-resolv-conf
down /usr/share/openvpn/update-resolv-conf

現在再啟動 OpenVPN 連接,就能發現 resolv.conf 文件已經更新,關閉連接後恢復正常。

啟動 OpenVPN[編輯 | 編輯原始碼]

手動啟動[編輯 | 編輯原始碼]

如需對 VPN 連接進行調試,可以以 root 身份手動運行 openvpn /etc/openvpn/client.conf 以啟動客戶端守護程序。伺服器端同樣可以如此啟動,只需替換為伺服器端的配置文件(例,openvpn /etc/openvpn/server.conf)。

systemd 服務配置[編輯 | 編輯原始碼]

若需在系統啟動時自動啟動 OpenVPN,對伺服器端與客戶端,都可以採用在對應機器上 啟用 openvpn@<configuration>.service 的方式配置。

例如,如果客戶端配置文件是 /etc/openvpn/client.conf,則服務名稱應為 openvpn@client.service。或者,如果伺服器端配置文件是 /etc/openvpn/server.conf,則服務名稱應為 openvpn@server.service

讓 NetworkManager 啟動連接[編輯 | 編輯原始碼]

在客戶端,您可能並不需要一直運行 VPN 隧道,或者您僅僅想要為特定的 NetworkManager 連接建立隧道。要實現這一點,您可以向 /etc/NetworkManager/dispatcher.d/ 添加腳本。在下列示例中,"Provider" 是 NetworkManager 連接的名稱:

/etc/NetworkManager/dispatcher.d/10-openvpn
#!/bin/sh
case "$2" in
  up)
    if [ "$CONNECTION_ID" = "Provider" ]; then
      systemctl start openvpn@client
    fi
  ;;
  down)
    systemctl stop openvpn@client
  ;;
esac

請查看 NetworkManager#Network services with NetworkManager dispatcher 以了解詳情。

Gnome 配置[編輯 | 編輯原始碼]

如果您想要經由 Gnome 內置的網絡配置來連接到一個 OpenVPN 伺服器,請按照如下步驟進行配置: 首先,安裝 networkmanager-openvpn。 然後,在設置菜單選中網絡設置,在VPN點擊+新建連接。從這裏你可以選擇OpenVPN並手動輸入設置,或者您也可以選擇導入配置文件 ,如果您已經有一個的話。如果您按照上述說明,配置文件會在/etc/openvpn/client.conf。打開開關就可以連接VPN。


參見[編輯 | 編輯原始碼]