OpenVPN - Arch Linux 中文维基

跳至內容

# OpenVPN

出自 Arch Linux 中文维基

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

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

相關文章

- OpenVPN in Linux containers

這篇文章或章節的翻譯質量不佳。

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

本文介紹了 OpenVPN 的基本的安裝與配置過程，適用於個人使用與小型商業使用。要了解更多信息，請訪問官方網站 HOWTO、OpenVPN 2.4 手冊頁以及 Manual。OpenVPN 是一個健壯的、高度靈活的 VPN 守護進程。它支持 SSL/TLS 安全、以太網橋接、經由代理的 TCP 或 UDP 隧道和 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@.service` 和 `openvpn-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 none` 和 `ecdh-curve secp521r1`。使用橢圓曲線時不使用 DH 參數文件。從 OpenVPN 2.4.8 開始，需要在伺服器配置中指定橢圓曲線的類型。否則伺服器將無法識別曲線類型並可能使用不兼容的曲線類型，從而導致身份驗證錯誤。

#### 強化伺服器

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

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

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

原因：使用說明屬於維基文本，不屬於代碼塊。避免諸如「邊緣安全性」之類的主觀術語。（在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

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

原因：兼容性選項不適合強化部分。（在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 地址。
- 取消注釋 `user` 和 `group` 指令以刪除權限。
- `ca`、`cert` 和 `key` 參數反映密鑰和證書的路徑和名稱。
- 啟用 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 nobody` 和 `group nobody` 會使OpenVPN在建立連接後放棄其 `root` 權限。缺點是在 VPN 斷開連接後，守護進程無法再次刪除其設置的網絡路由。如果想要在沒有 VPN 連接的情況下限制傳輸流量，那麼延遲路由可能被認為是有益的。但是，也可能發生 OpenVPN 伺服器在隧道運行時向路由推送更新的情況。具有刪除權限的客戶端將無法執行更新並退出並出現錯誤。

由於似乎需要手動操作來管理路由，因此選項 `user nobody` 和 `group 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 使用（遠程）服務時遇到問題（例如網頁瀏覽、DNS、NFS），則可能需要手動設置 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 udp` 或 `proto tcp` 時，OpenVPN 將使用作業系統定義的 `AF_INET`，在大多數情況下，這將僅是 IPv4。要同時使用 IPv4 和 IPv6，請使用 `proto udp6` 或 `proto tcp6`。要僅強制執行 IPv4，請使用 `proto udp4` 或 `proto 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.key` 和 `dh{n}.pem` 文件放到伺服器， `client.crt` 和 `client.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.crt` 和 `client1.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。

## 參見

- OpenVPN 官方站點

分類：​

- 使用「模板:過時」標記的頁面或章節
- VPN
- 使用「模板:風格」標記的頁面或章節

隱藏分類：​

- 使用「模板:糟糕的翻譯」標記的頁面或章節

OpenVPN
新增話題