本文將介紹如何配置OpenVPN服務器端的配置文件。在Windows系統中,該配置文件一般叫做server.ovpn;在Linux/BSD系統中,該配置文件一般叫做server.conf。雖然配置文件名稱不同,但其中的配置內容與配置方法卻是相同的。
本文根據官方提供的server.ovpn示例文件直接翻譯得出。Windows、Linux、BSD等系統的服務器端配置文件均可參考本文。你可以點擊查看OpenVPN客戶端的配置文件說明。
#
針對多客戶端的OpenVPN 2.0 的服務器端配置文件示例
#
本文件用於多客戶端<->單服務器端的OpenVPN服務器端配置
#
OpenVPN也支持單機<->單機的配置(更多信息請查看網站上的示例頁面)
#
該配置支持Windows或者Linux/BSD系統。此外,在Windows上,記得將路徑加上雙引號,
並且使用兩個反斜槓,例如:”C:\Program Files\OpenVPN\config\foo.key”
#
‘#’ or ‘;’開頭的均爲註釋內容
#
OpenVPN應該監聽本機的哪些IP地址?
該命令是可選的,如果不設置,則默認監聽本機的所有IP地址。
;local a.b.c.d
OpenVPN應該監聽哪個TCP/UDP端口?
如果你想在同一臺計算機上運行多個OpenVPN實例,你可以使用不同的端口號來區分它們。
此外,你需要在防火牆上開放這些端口。
port 1194
OpenVPN使用TCP還是UDP協議?
;proto tcp
proto udp
指定OpenVPN創建的通信隧道類型。
“dev tun”將會創建一個路由IP隧道,
“dev tap”將會創建一個以太網隧道。
#
如果你是以太網橋接模式,並且提前創建了一個名爲”tap0”的與以太網接口進行橋接的虛擬接口,則你可以使用”dev tap0”
#
如果你想控制VPN的訪問策略,你必須爲TUN/TAP接口創建防火牆規則。
#
在非Windows系統中,你可以給出明確的單位編號(unit number),例如”tun0”。
在Windows中,你也可以使用”dev-node”。
在多數系統中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火牆,否則VPN將不起作用。
;dev tap
dev tun
如果你想配置多個隧道,你需要用到網絡連接面板中TAP-Win32適配器的名稱(例如”MyTap”)。
在XP SP2或更高版本的系統中,你可能需要有選擇地禁用掉針對TAP適配器的防火牆
通常情況下,非Windows系統則不需要該指令。
;dev-node MyTap
設置SSL/TLS根證書(ca)、證書(cert)和私鑰(key)。
每個客戶端和服務器端都需要它們各自的證書和私鑰文件。
服務器端和所有的客戶端都將使用相同的CA證書文件。
#
通過easy-rsa目錄下的一系列腳本可以生成所需的證書和私鑰。
記住,服務器端和每個客戶端的證書必須使用唯一的Common Name。
#
你也可以使用遵循X509標準的任何密鑰管理系統來生成證書和私鑰。
OpenVPN 也支持使用一個PKCS #12格式的密鑰文件(詳情查看站點手冊頁面的”pkcs12”指令)
ca ca.crt
cert server.crt
key server.key # 該文件應該保密
指定迪菲·赫爾曼參數。
你可以使用如下名稱命令生成你的參數:
openssl dhparam -out dh1024.pem 1024
如果你使用的是2048位密鑰,使用2048替換其中的1024。
dh dh1024.pem
設置服務器端模式,並提供一個VPN子網,以便於從中爲客戶端分配IP地址。
在此處的示例中,服務器端自身將佔用10.8.0.1,其他的將提供客戶端使用。
如果你使用的是以太網橋接模式,請註釋掉該行。更多信息請查看官方手冊頁面。
server 10.8.0.0 255.255.255.0
指定用於記錄客戶端和虛擬IP地址的關聯關係的文件。
當重啓OpenVPN時,再次連接的客戶端將分配到與上一次分配相同的虛擬IP地址
ifconfig-pool-persist ipp.txt
該指令僅針對以太網橋接模式。
首先,你必須使用操作系統的橋接能力將以太網網卡接口和TAP接口進行橋接。
然後,你需要手動設置橋接接口的IP地址、子網掩碼;
在這裏,我們假設爲10.8.0.4和255.255.255.0。
最後,我們必須指定子網的一個IP範圍(例如從10.8.0.50開始,到10.8.0.100結束),以便於分配給連接的客戶端。
如果你不是以太網橋接模式,直接註釋掉這行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
該指令僅針對使用DHCP代理的以太網橋接模式,
此時客戶端將請求服務器端的DHCP服務器,從而獲得分配給它的IP地址和DNS服務器地址。
#
在此之前,你也需要先將以太網網卡接口和TAP接口進行橋接。
注意:該指令僅用於OpenVPN客戶端,並且該客戶端的TAP適配器需要綁定到一個DHCP客戶端上。
;server-bridge
推送路由信息到客戶端,以允許客戶端能夠連接到服務器背後的其他私有子網。
(簡而言之,就是允許客戶端訪問VPN服務器自身所在的其他局域網)
記住,這些私有子網也要將OpenVPN客戶端的地址池(10.8.0.0/255.255.255.0)反饋回OpenVPN服務器。
;push “route 192.168.10.0 255.255.255.0”
;push “route 192.168.20.0 255.255.255.0”
爲指定的客戶端分配指定的IP地址,或者客戶端背後也有一個私有子網想要訪問VPN,
那麼你可以針對該客戶端的配置文件使用ccd子目錄。
(簡而言之,就是允許客戶端所在的局域網成員也能夠訪問VPN)
舉個例子:假設有個Common Name爲”Thelonious”的客戶端背後也有一個小型子網想要連接到VPN,該子網爲192.168.40.128/255.255.255.248。
首先,你需要去掉下面兩行指令的註釋:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
然後創建一個文件ccd/Thelonious,該文件的內容爲:
iroute 192.168.40.128 255.255.255.248
這樣客戶端所在的局域網就可以訪問VPN了。
注意,這個指令只能在你是基於路由、而不是基於橋接的模式下才能生效。
比如,你使用了”dev tun”和”server”指令。
再舉個例子:假設你想給Thelonious分配一個固定的IP地址10.9.0.1。
首先,你需要去掉下面兩行指令的註釋:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
然後在文件ccd/Thelonious中添加如下指令:
ifconfig-push 10.9.0.1 10.9.0.2
如果你想要爲不同羣組的客戶端啓用不同的防火牆訪問策略,你可以使用如下兩種方法:
(1)運行多個OpenVPN守護進程,每個進程對應一個羣組,併爲每個進程(羣組)啓用適當的防火牆規則。
(2) (進階)創建一個腳本來動態地修改響應於來自不同客戶的防火牆規則。
關於learn-address腳本的更多信息請參考官方手冊頁面。
;learn-address ./script
如果啓用該指令,所有客戶端的默認網關都將重定向到VPN,這將導致諸如web瀏覽器、DNS查詢等所有客戶端流量都經過VPN。
(爲確保能正常工作,OpenVPN服務器所在計算機可能需要在TUN/TAP接口與以太網之間使用NAT或橋接技術進行連接)
;push “redirect-gateway def1 bypass-dhcp”
某些具體的Windows網絡設置可以被推送到客戶端,例如DNS或WINS服務器地址。
下列地址來自opendns.com提供的Public DNS 服務器。
;push “dhcp-option DNS 208.67.222.222”
;push “dhcp-option DNS 208.67.220.220”
去掉該指令的註釋將允許不同的客戶端之間相互”可見”(允許客戶端之間互相訪問)。
默認情況下,客戶端只能”看見”服務器。爲了確保客戶端只能看見服務器,你還可以在服務器端的TUN/TAP接口上設置適當的防火牆規則。
;client-to-client
如果多個客戶端可能使用相同的證書/私鑰文件或Common Name進行連接,那麼你可以取消該指令的註釋。
建議該指令僅用於測試目的。對於生產使用環境而言,每個客戶端都應該擁有自己的證書和私鑰。
如果你沒有爲每個客戶端分別生成Common Name唯一的證書/私鑰,你可以取消該行的註釋(但不推薦這樣做)。
;duplicate-cn
keepalive指令將導致類似於ping命令的消息被來回發送,以便於服務器端和客戶端知道對方何時被關閉。
每10秒鐘ping一次,如果120秒內都沒有收到對方的回覆,則表示遠程連接已經關閉。
keepalive 10 120
出於SSL/TLS之外更多的安全考慮,創建一個”HMAC 防火牆”可以幫助抵禦DoS攻擊和UDP端口淹沒攻擊。
你可以使用以下命令來生成:
openvpn –genkey –secret ta.key
#
服務器和每個客戶端都需要擁有該密鑰的一個拷貝。
第二個參數在服務器端應該爲’0’,在客戶端應該爲’1’。
;tls-auth ta.key 0 # 該文件應該保密
選擇一個密碼加密算法。
該配置項也必須複製到每個客戶端配置文件中。
;cipher BF-CBC # Blowfish (默認)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
在VPN連接上啓用壓縮。
如果你在此處啓用了該指令,那麼也應該在每個客戶端配置文件中啓用它。
comp-lzo
允許併發連接的客戶端的最大數量
;max-clients 100
在完成初始化工作之後,降低OpenVPN守護進程的權限是個不錯的主意。
該指令僅限於非Windows系統中使用。
;user nobody
;group nobody
持久化選項可以儘量避免訪問那些在重啓之後由於用戶權限降低而無法訪問的某些資源。
persist-key
persist-tun
輸出一個簡短的狀態文件,用於顯示當前的連接狀態,該文件每分鐘都會清空並重寫一次。
status openvpn-status.log
默認情況下,日誌消息將寫入syslog(在Windows系統中,如果以服務方式運行,日誌消息將寫入OpenVPN安裝目錄的log文件夾中)。
你可以使用log或者log-append來改變這種默認情況。
“log”方式在每次啓動時都會清空之前的日誌文件。
“log-append”這是在之前的日誌內容後進行追加。
你可以使用兩種方式之一(但不要同時使用)。
;log openvpn.log
;log-append openvpn.log
爲日誌文件設置適當的冗餘級別(0~9)。冗餘級別越高,輸出的信息越詳細。
#
0 表示靜默運行,只記錄致命錯誤。
4 表示合理的常規用法。
5 和 6 可以幫助調試連接錯誤。
9 表示極度冗餘,輸出非常詳細的日誌信息。
verb 3
重複信息的沉默度。
相同類別的信息只有前20條會輸出到日誌文件中。
;mute 20