VPN(Virtual Private Network),虛擬私有網(wǎng)絡,又名虛擬專用網(wǎng)絡,是一種常用于大中型企業(yè)或團體之間的私有網(wǎng)絡通信方法。VPN 透過公用的網(wǎng)絡架構(例如:互聯(lián)網(wǎng))來傳送內(nèi)聯(lián)網(wǎng)的網(wǎng)絡信息,利用加密隧道協(xié)議(Tunneling Protocol)來達到保密、認證、準確等私有信息的安全要求。如果使用得法,這種技術可用不安全的網(wǎng)絡(例如:互聯(lián)網(wǎng))來傳送可靠、安全的信息,但需要注意的是,信息的加密與否是可以控制的,沒有加密的虛擬私有網(wǎng)絡信息依然有被竊取的危險。1
VPN 有多種實現(xiàn)方式,比較常見的有 PPTP 、L2TP、IPSec VPN 和 SSL VPN 這幾種。PPTP 和 L2TP 都是基于 PPP 協(xié)議的虛擬隧道實現(xiàn),L2TP 可以認為是 PPTP 的升級版。由于設計上的缺陷,使得 PPTP 和 L2TP 無法正常通過 NAT 設備,并且數(shù)據(jù)傳輸存在安全隱患,一般是結(jié)合 IPSec 來實現(xiàn)完整的安全傳輸保障。IPSec 也可以完全獨立實現(xiàn) VPN,但因為配置繁瑣而為人詬病。SSL VPN 是近年興起的一種新的 VPN 實現(xiàn),構建于完全開放的 SSL/TLS 協(xié)議,但由于缺乏統(tǒng)一的標準,不同的廠商實現(xiàn)不同,有種 SSL Web VPN,相比于其他 VPN 實現(xiàn),其優(yōu)點在于客戶端只需有支持 SSL 的網(wǎng)絡瀏覽器即可,無需額外的客戶端。當然,大部分 SSL VPN 需要客戶端支持,比如本文的主角 OpenVPN。2
OpenVPN 服務器可以架設在多種操作系統(tǒng)平臺上(Linux、Windows NT 系列、OpenBSD、FreeBSD、NetBSD、Mac OS X、Solaris)。
OpenVPN 可以使用 TUN 或者 TAP 接口建立隧道,配置略有不同。TUN 接口創(chuàng)建的是三層路由隧道,建立方便;TAP 是二層網(wǎng)卡橋接隧道,即創(chuàng)建一個以太網(wǎng)橋接,相對復雜。TUN 接口下所有的客戶端處于一個完全獨立的子網(wǎng)內(nèi),與 VPN 服務器所在的子網(wǎng)沒有關系;TAP 接口的好處相較之下則相當明顯,客戶端可以獲得 VPN 服務器所處子網(wǎng)的 IP(即,忽略物理上的區(qū)別,可以完全將客戶端看做是于 VPN 服務器處于同一子網(wǎng)的另一臺機器)。
我們選定 OpenVPN 子網(wǎng)的網(wǎng)段為 10.8.0.0/24。
Linux 下可以選則 TUN 或 TAP 作為接口,但均需要內(nèi)核支持。TUN接口下,如果需要訪問 Internet,還需要配置 IP 轉(zhuǎn)發(fā),以及建立 DNS 服務。
首先需要檢查內(nèi)核是否支持 TUN/TAP 設備驅(qū)動,運行 modinfo tun
,如果輸出 ERROR: modinfo: could not find module tun
則說明內(nèi)核不支持 TUN/TAP 設備,若輸出為如下類似則成功。
filename: /lib/modules/2.6.34-ARCH/kernel/drivers/net/tun.koalias: char-major-10-200license: GPLauthor: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>description: Universal TUN/TAP device driverdepends:vermagic: 2.6.34-ARCH SMP preempt mod_unload 686
確認內(nèi)核支持 TUN/TAP 模塊之后,運行 lsmod tun
無輸出則說明 TUN 模塊沒有加載,運行 modprobe tun
加載之(也可以運行 ls /dev/net/tun
通過檢查 /dev/net/tun 文件是否存在來判斷 TUN 模塊是否加載)。
確認加載內(nèi)核 TUN/TAP 模塊之后,安裝 OpenVPN 程序,不同的 Linux 發(fā)行版有其相應的包管理工具可以完成,或者也可以下載源碼編譯安裝,缺點是依賴關系處理比較麻煩(openssl、lzo)。
如果使用 TUN 接口,不需要額外的操作,配置好 OpenVPN 服務器模式即可。鑒于目前國內(nèi)的網(wǎng)絡現(xiàn)狀,大部分朋友購買了國外的 VPS 架設 VPN 并不僅僅是為了建立一個虛擬專用網(wǎng)絡,最重要的是需要有 Internet 訪問。因此,我們還需要額外的一些步驟來使的我們可以通過 VPN 訪問 Internet。
首先,我們需要開啟系統(tǒng)的 IP 轉(zhuǎn)發(fā)功能,運行命令 sysctl -w net.ipv4.ip_forward=1
(也可以編輯 vim /etc/sysctl.conf
文件,修改配置為 net.ipv4.ip_forward = 1
),可以使用 sysctl -a | grep forward
來檢查 IP 轉(zhuǎn)發(fā)功能是否打開,輸出結(jié)果應類似如下,所有含有 forward
字段的值應該為 1。
net.ipv4.conf.all.forwarding = 1net.ipv4.conf.all.mc_forwarding = 0net.ipv4.conf.default.forwarding = 1net.ipv4.conf.default.mc_forwarding = 0net.ipv4.conf.lo.forwarding = 1net.ipv4.conf.lo.mc_forwarding = 0net.ipv4.conf.eth0.forwarding = 1net.ipv4.conf.eth0.mc_forwarding = 0
接著,使用 iptables 建立路由轉(zhuǎn)發(fā)規(guī)則,
Bash:
# DEVICE 應該為 OpenVPN 監(jiān)聽的本地地址 LOCAL_IP_ADDRESS 所屬的網(wǎng)卡,一般為 eth0(在 OpenVZ 的 VPS,一般為 venet0)。iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o DEVICE -j SNAT --to-source LOCAL_IP_ADDRESS
或者,使用如下命令,不需要配置關注本地 IP 地址,
Bash:
# DEVICE 應該為 OpenVPN 監(jiān)聽的本地地址所屬的網(wǎng)卡,一般為 eth0(在 OpenVZ 的 VPS,一般為 venet0)。iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o DEVICE -j MASQUERADE
最后,使用 /etc/init.d/iptables save
保存當前規(guī)則。
提示:Linux 下可以使用 ifconfig -a 查看本地的網(wǎng)絡信息。
如果使用 TAP 接口,需要首先建立相應橋接界面。在建立橋接界面之前,先確保系統(tǒng)有 bridge-tuils 安裝。
(假設 tap0 為 tap 設備,br0 為橋接設備,eth0 為當前以太網(wǎng)卡)。
Bash:
openvpn --mktun --dev tap0 #為 tap 設備建立路由隧道brctl addbr br0 #建立橋接設備brctl addif br0 eth0 #添加 eth 設備到網(wǎng)橋brctl addif br0 tap0 #添加 tap 設備到網(wǎng)橋ifconfig tap0 0.0.0.0 promisc up #設置 tap 設備為混雜模式ifconfig eth0 0.0.0.0 promisc up #設置 eth 設備為混雜模式ifconfig br0 ETH_IP netmask ETH_NETMASK broadcast ETH_BROADCAST #為 br0 設置原來以太網(wǎng)卡的網(wǎng)絡參數(shù)
Bash:
ifconfig br0 downbrctl delbr br0openvpn --rmtun --dev tap0
每次系統(tǒng)重新啟動,都需要重新建立相關設備,最好以 shell 腳本形式開機自動建立。另外,如果有多個 tap 設備,也可以考慮用 shell 腳本來簡化這一工作。4
為了避免出現(xiàn)應為 DNS 污染而導致域名解析失敗的問題,除了在 OpenVPN 服務端配置文件添加 “push dhcp-option DNS nameserver” 指令外,還可以考慮在服務器上建立自己的域名服務。這需要安裝 bind 軟件包,并運行 /etc/init.d/named start
,同時,我們同樣需要在 OpenVPN 服務端配置文件添加 “push dhcp-option DNS 10.8.0.1″ 指令。
OpenVPN 在 Windows 下的安裝比較簡單,有安裝程序可以下載。在 Windows 下不存在像 Linux 那么多的隧道接口選擇,只能使用 tap 橋接方式。另外,Windows 2000 及之前的版本均不支持 tap 設備,所以只能在 Windows XP 及其后續(xù)版本上安裝和配置 OpenVPN 服務器,但不影響客戶端的使用。
Windows 下的 tap 設備有兩種方式實現(xiàn)互聯(lián)網(wǎng)訪問,一種是以太網(wǎng)卡橋接,另外一種是以太網(wǎng)卡共享 tap 設備上網(wǎng)。
選擇右鍵菜單“屬性”命令,高級選項卡,啟用 “Internet 共享連接”特性并選擇需要共享的設備為 OpenVPN 建立的 tap 設備。
OpenVPN 支持多種認證方式,常用的有基于共享密鑰的證書認證和用戶名密碼認證。
首先,需要設置 CA 證書所需要的一些基本信息,這些信息會被包含在生成的證書文件中。您需要編輯 OpenVPN 安裝路徑下的 easy-rsa 目錄里的 vars(Linux 下) 或 vars.bat.sample(Windows 下) 文件,根據(jù)實際情況修改如下字段的值。
KEY_ORG="Fort-Funston" # 組織KEY_CITY="SanFrancisco" # 城市KEY_COUNTRY="US" # 國家KEY_PROVINCE="CA" # 省份KEY_EMAIL="me@myhost.mydomain" # 郵件地址
接著,開始生成相應的 ca 證書、服務器證書以及 dh1024.pem 文件。在生成 CA 和客戶端證書的過程中,基本保持默認的設置即可, Common Name 可以設置為當前的主機名或者域名,也可以是 OpenVPN-CA。
Bash:
cd /usr/share/openvpn/easy-rsasource varschmod +x clean-all./clean-allchmod +x build-ca./build-cachmod +x build-dh./build-dh
Bash:
cd "C:\Program Files\OpenVPN\easy-rsa"init-configvarsclean-allbuild-cabuild-dh
命令完成后,我們會得到 ca.crt、ca.key、dh1024.pem 等文件。其中,ca.key 的安全非常重要,OpenVPN 并不需要這個文件,所以可以存放在其他比較安全的地方,否則,OpenVPN 的通信將不再安全。
Common Name 必須被設置為 server。
Bash:
chmod +x build-key-server./build-key-server server
Bash:
build-key-server server
命令完成后,我們會得到 server.crt、server.csr、server.key 等文件。
我們需要把所有生成的這些文件(ca.crt、ca.key、dh1024.pem、server.crt、server.csr、 server.key)放置到 OpenVPN 的配置目錄中,或者修改配置文件中相應路徑,使 OpenVPN 能夠找到它們。ca.key 可以不放在配置文件目錄中而單獨存放在安全的地方,OpenVPN 程序運行并不需要它。
接下來,我們需要為客戶端頒發(fā)證書,這樣他們就能通過認證而使用 OpenVPN。為客戶端生成證書時,我們只需要使用相同的 vas 配置即可。切記,不要再使用 clean-all
命令,否則,所有之前生成的 CA 證書和服務器證書都會隨這 keys 目錄一并刪除。一般來說,每個客戶端其基本信息均不相同,所以在生成客戶端證書時應該根據(jù)實際情況填寫相應的證書屬性,除了 Common Name 必須唯一之外其他的屬性可以相同。
Bash:
cd /usr/share/openvpn/easy-rsasource varschmod +x build-key./build-key client
Bash:
cd "C:\Program Files\OpenVPN\easy-rsa"varsbuild-key client
命令完成后,會生成 cleint.crt、client.csr、client.key 等文件,我們需要將它們連同 CA 證書 ca.crt 一起交給客戶端。
當我們需要取消某個客戶端的 OpenVPN 使用權限時,我們只需要吊銷該客戶端的證書即可。
切記,"Common Name" 是 OpenVPN 用來區(qū)別不同客戶端的關鍵,所以在建立證書時,必須使用有意義其唯一的字串。
Bash:
cd /usr/share/openvpn/easy-rsasource varschmod +x revoke-full./revoke-full client
Bash:
cd "C:\Program Files\OpenVPN\easy-rsa"varsrevoke-full client
這條命令執(zhí)行完成之后, 會在 keys 目錄下面, 生成一個 crl.pem 文件,這個文件中包含了吊銷證書的名單。成功注銷某個證書之后,可以打開 keys/index.txt 文件,可以看到被注銷的證書前面,已標記為R.
最后,我們需要修改服務端的配置文件,使被吊銷的證書失效。
在服務端的配置文件 server.conf 中,加入這樣一行:
crl-verify crl.pem
如果 server.conf 文件和 crl.pem 沒有在同一目錄下面,則 crl.pem 應該寫絕對路徑,例如:
crl-verify /usr/share/openvpn/easy-rsa/keys/crl.pem
除此之外,還會生成 01.pem 02.pem 之類的文件以及 index.txt,它記錄了當前 RSA 工具所生成的證書的歷史信息。
OpenVPN 也支持使用用戶名/密碼進行認證。雖然證書認證相對安全,但為每個客戶端生成證書比較麻煩,同時客戶端的配置和很不方便,不符合用戶的使用習慣,相比之 下,用戶名/密碼的方式更符合目前用戶的使用習慣,并且可以將客戶端和 CA 證書綁定打包,省去客戶端用戶的配置麻煩,確實有不小吸引力。OpenVPN 支持這些額外的認證方式的關鍵在于配置文件中 auth-user-pass-verify
、client-cert-not-required
、username-as-common-name
、auth-user-pass
這些指令以及 OpenVPN 的 plugin 機制。
首先,下載 http://www.openvpn.se/files/other/checkpsw.sh,然后修改服務端配置文件,添加如下指令:
auth-user-pass-verify /etc/openvpn/scripts/checkpsw.sh via-envclient-cert-not-requiredusername-as-common-name
接著,建立 /etc/openvpn/psw-file
文件,作為用戶名密碼的儲存文件,每行一個 OpenVPN 賬戶(首先是用戶名,然后是空格或者 TAB,最后是明文的密碼)。
最后,在客戶端配置文件中添加一行 auth-user-pass
,并刪除和客戶端證書相關的指令。
這樣,雖然可以實現(xiàn)用戶名和密碼的訪問,并且存儲數(shù)據(jù)到文本文件,但所用 checkpsw.sh 畢竟是一個樣例,很多安全性的問題并沒有考慮,比如密碼明文存貯等。如果熟悉 shell、perl、python 任何一種腳本語言的話,完全可以完善相關認證存儲的細節(jié),增強安全性。
OpenVPN 服務器需要安裝 pam 程序和 pam_mysql 庫。
保存以下代碼為 openvpn.mysql 文件
SQL:
# 創(chuàng)建 openvpn 用戶,對 openvpn 這個 database 有所有操作權限,密碼為 openvpn# 若 active 不為 1,無權使用 VPNCREATE DATABASE openvpn;GRANT ALL ON vpn.* TO openvpn@localhost IDENTIFIED BY 'openvpn';FLUSH PRIVILEGES;USE openvpn;CREATE TABLE user ( name char(20) NOT NULL, password char(128) default NULL, active int(10) NOT NULL DEFAULT 1, PRIMARY KEY (name));
接著,運行命令 mysql -uroot -pPASSWORD < openvpn.mysql
完成 MySQL 相關配置。
最后,使用命令 mysql -uroot -pPASSWORD
登錄 MySQL 數(shù)據(jù)庫,運行 INSERT INTO user (name,password) VALUES (‘test’,password(‘test’)) 增加一個 OpenVPN 用戶,用戶名為 test,密碼 test,用于測試。
創(chuàng)建/etc/pam.d/openvpn文件,文件內(nèi)容如下:
auth sufficient pam_mysql.so user=openvpn passwd=openvpn host=localhost db=openvpn table=user usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=2account required pam_mysql.so user=openvpn passwd=openvpn host=localhost db=openvpn table=user usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=2
關于 crypt 參數(shù)的意義如下:
crypt(0) -- Used to decide to use MySQL's PASSWORD() function or crypt()0 = No encryption. Passwords in database in plaintext. NOT recommended!1 = Use crypt2 = Use MySQL PASSWORD() function3 = Use MySQL PASSWORD() function with MD5
plugin ./openvpn-auth-pam.so openvpn # 說明使用的插件,openvpn 為插件的參數(shù),使用 pam 的 servicesnameclient-cert-not-required # 不請求客戶的 CA 證書,使用 User/Pass 驗證username-as-common-name # 使用客戶提供的 UserName 作為 Common Name
LDAP 認證實際上也有二種,一種用 openvpn-auth-ldap 即直接通過 LDAP 驗證,另一種與 pam-mysql 認證相似,使用 pam-ldap ,通過 PAM ,然后再找 LDAP 驗證。
關于這部分,以后再補充,目前沒有實際經(jīng)驗。
由于使用的網(wǎng)絡接口不同,服務器端的配置文件也不盡相同,首先給出一份比較詳細的配置文件說明。11
################################################# ################################################ Sample OpenVPN 2.0 config file for # # OpenVPN 2.0 多客戶端服務器配置文件樣例# multi-client server. # ## # ## This file is for the server side # # 這個文件是 多客戶端 <--> 單服務器 的 OpenVPN# of a many-clients <-> one-server # # 服務器配置文件。# OpenVPN configuration. # ## # ## OpenVPN also supports # # OpenVPN 也支持 單客戶端 <--> 單服務器 的配置(# single-machine <-> single-machine # # 查看 OpenVPN 網(wǎng)站上的配置文件樣例頁面獲取更多# configurations (See the Examples page # # 信息)。# on the web site for more info). # ## # ## This config should work on Windows # # 這個配置文件可工作于 Windows 或者 Linux/BSD 系# or Linux/BSD systems. Remember on # # 統(tǒng)之上。注意,Windows 系統(tǒng)上需要用引號包裹路徑# Windows to quote pathnames and use # # 名并且使用雙反斜杠。比如:# double backslashes, e.g.: # ## "C:\\Program Files\\OpenVPN\\config\\foo.key" # # "C:\\Program Files\\OpenVPN\\config\\foo.key"# # ## Comments are preceded with '#' or ';' # # 注釋使用 '#' 或者 ';' 開頭。################################################# ################################################ Which TCP/UDP port should OpenVPN listen on? # OpenVPN 應該監(jiān)聽哪個 TCP/UDP 端口?# If you want to run multiple OpenVPN instances # 如果需要在同一機器上運行# on the same machine, use a different port # 多個 OpenVPN 進程,為每# number for each one. You will need to # 個進程使用不同的端口。# open up this port on your firewall. # 你需要在防火墻上打開這些端口。port 1194# "dev tun" will create a routed IP tunnel, # "dev tun" 將會建立一個路由 IP 隧道,# "dev tap" will create an ethernet tunnel. # "dev tap" 將會建立一個以太網(wǎng)卡隧道。# Use "dev tap0" if you are ethernet bridging # 如果已有一個預先建立的 tap0 虛擬網(wǎng)卡,且# and have precreated a tap0 virtual interface # 已橋接到以太網(wǎng)卡,請使用 "dev tap0"。# and bridged it with your ethernet interface. ## If you want to control access policies # 如果你想控制 VPN 的訪問策略,你需要# over the VPN, you must create firewall # 為 TUN/TAP 接口建立相應的防火墻規(guī)則。# rules for the the TUN/TAP interface. ## On non-Windows systems, you can give # 在非 Windows 系統(tǒng)上,你可以附加# an explicit unit number, such as tun0. # 一個單一的號碼,比如 tun0。# On Windows, use "dev-node" for this. # 在 Windows 系統(tǒng)上,使用 "dev-node"。# On most systems, the VPN will not function # 在大多數(shù)系統(tǒng)上,VPN 將不會工作# unless you partially or fully disable # 直到你完全或者部分地為 TUN/TAP# the firewall for the TUN/TAP interface. # 接口的關閉了防火墻。;dev tapdev tun# Windows needs the TAP-Win32 adapter name # 在 Windows 上如果存在多個 TAP 適配器# from the Network Connections panel if you # ,需要指明所用網(wǎng)絡連接控制面板上的# have more than one. On XP SP2 or higher, # TAP-Win32 適配器名。# you may need to selectively disable the # 在 Windows XP SP2 或更高系統(tǒng)上,需要為該# Windows firewall for the TAP adapter. # TAP 適配器選擇性的關閉 Windows 防火墻。# Non-Windows systems usually don't need this. # 非 Windows 系統(tǒng)通常不需要此設置。;dev-node MyTap# TCP or UDP server? # TCP 還是 UDP 服務器?;proto tcpproto udp# Which local IP address should OpenVPN # OpenVPN 應該監(jiān)聽哪個本地 IP 地址?# listen on? (optional) # (可選);local a.b.c.d# SSL/TLS root certificate (ca), certificate # SSL/TLS 根證書 (ca), 證書 (cert)# (cert), and private key (key). Each client # 和私鑰 (key) 每個客戶端和服務器必# and the server must have their own cert and # 須有他們自己的 cert 和 key。服務器# key file. The server and all clients will # 和所有的客戶端使用相同的 ca 文件。# use the same ca file. ## ## See the "easy-rsa" directory for a series # 查看 "easy-rsa" 目錄可以獲得一系# of scripts for generating RSA certificates # 列的用來生成 RSA 證書和私鑰的腳本。# and private keys. Remember to use # 切記為服務器和每個客戶端生成唯一# a unique Common Name for the server # 的 Common Name。# and each of the client certificates. ## ## Any X509 key management system can be used. # 可以使用任何 X509 私鑰管理系統(tǒng)。# OpenVPN can also use a PKCS #12 formatted key file # OpenVPN 同樣可以使用一個 PKCS #12 格式的私鑰文件# (see "pkcs12" directive in man page). # (查看 MAN 也的 "pkcs12" 配置段)。ca ca.crtkey server.key # This file should be kept secret # 這個文件需要保密cert server.crt# Diffie hellman parameters. # Diffie hellman 參數(shù)。# Generate your own with: # 使用如下命令生成:# openssl dhparam -out dh1024.pem 1024 # openssl dhparam -out dh1024.pem 1024# Substitute 2048 for 1024 if you are using # 如果你使用 2048 bit 的私鑰,用 2048# 2048 bit keys. # 替換 1024dh dh1024.pem# Configure server mode and supply a VPN subnet # 配置服務器模式并且為 OpenVPN 提供一個# for OpenVPN to draw client addresses from. # VPN 子網(wǎng)來從中獲取客戶端的地址。# The server will take 10.8.0.1 for itself, # 服務器自己使用 10.8.0.1,其余則分配給# the rest will be made available to clients. # 客戶端。# Each client will be able to reach the server # 每個客戶端都可以用 10.8.0.1 訪問服務器。# on 10.8.0.1. Comment this line out if you are # 如果你使用以太網(wǎng)卡橋接,注釋此行。查看 MAN# ethernet bridging. See the man page for more info. # 手冊頁獲取更多信息。server 10.8.0.0 255.255.255.0# Maintain a record of client <-> virtual IP address # 維護一個客戶端 <--> 虛擬 IP 地址之間關聯(lián)# associations in this file. If OpenVPN goes down or # 的記錄文件。# is restarted, reconnecting clients can be assigned ## the same virtual IP address from the pool that was # 如果 OpenVPN 關閉或者重啟,重新連接的客戶# previously assigned. # 端能夠從地址池獲取與以前一樣的虛擬 IP。ifconfig-pool-persist ipp.txt# Configure server mode for ethernet bridging. # 配置服務器的以太網(wǎng)卡橋接模式。# You must first use your OS's bridging capability # 你必須首先使用你的系統(tǒng)的橋接特性為 TAP 接口# to bridge the TAP interface with the ethernet # 建立起到以太網(wǎng)卡 NIC 接口的橋接界面。# NIC interface. Then you must manually set the # 接著,你必須手動為橋接界面配置 IP/netmask,# IP/netmask on the bridge interface, here we # 這里假定為 10.8.0.4/255.255.255.0。# assume 10.8.0.4/255.255.255.0. Finally we # 最后,我們必須在這個子網(wǎng)中為連接的# must set aside an IP range in this subnet # 客戶端設置一個可分配的 IP 段# (start=10.8.0.50 end=10.8.0.100) to allocate # (開始 = 10.8.0.50 結(jié)束 = 10.8.0.100)# to connecting clients. Leave this line commented ## out unless you are ethernet bridging. # 保持這行注釋,除非你使用以太網(wǎng)卡橋接。;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100# Push routes to the client to allow it # 推送路由到客戶端來允許它訪問服# to reach other private subnets behind # 務器之后的其他私有子網(wǎng)。# the server. Remember that these # 切記這些私有子網(wǎng)也需要知道到# private subnets will also need # OpenVPN 客戶端的地址池的路# to know to route the OpenVPN client # 由(10.8.0.0/255.255.255.0)# address pool (10.8.0.0/255.255.255.0) # 來回訪 OpenVPN# back to the OpenVPN server. # 服務器。;push "route 192.168.10.0 255.255.255.0";push "route 192.168.20.0 255.255.255.0"# To assign specific IP addresses to specific # 要為特定的客戶端分配特定的 IP 地址# clients or if a connecting client has a private # 或者如果一個連接中的客戶端其后的私# subnet behind it that should also have VPN access, # 有子網(wǎng)也要有 VPN 訪問權,可使用子目# use the subdirectory "ccd" for client-specific # 錄 ccd 來存放客戶端的特別配置文件# configuration files (see man page for more info). # (查看 MAN 也來獲取更多信息)。# EXAMPLE: Suppose the client # 示例:# having the certificate common name "Thelonious" # 假設客戶端的認證名稱為 "Thelonious",# also has a small subnet behind his connecting # 并且有一個小的子網(wǎng)位于他的連接機器之后,# machine, such as 192.168.40.128/255.255.255.248. # 比如 192.168.40.128/255.255.255.248。# First, uncomment out these lines: # 首先,取消下面幾行的注釋;client-config-dir ccd;route 192.168.40.128 255.255.255.248# Then create a file ccd/Thelonious with this line: # 接著,建立一個文件 ccd/Thelonious,添加這行:# iroute 192.168.40.128 255.255.255.248 # iroute 192.168.40.128 255.255.255.248# This will allow Thelonious' private subnet to # 這會允許 Thelonious' 的私有子網(wǎng)訪問VPN。# access the VPN. This example will only work # 這個示例僅僅在使用路由隧道而不是網(wǎng)卡橋接時起# if you are routing, not bridging, i.e. you are # 作用。# using "dev tun" and "server" directives. # 比如,你使用的是 "dev tun" 和 "server" 指令。# EXAMPLE: Suppose you want to give # 示例:假如你想給 Thelonious 一個固定的 VPN# Thelonious a fixed VPN IP address of 10.9.0.1. # IP 地址 10.9.0.1。# First uncomment out these lines: # 首先,取消下面幾行的注釋;client-config-dir ccd;route 10.9.0.0 255.255.255.252# Then add this line to ccd/Thelonious: # 接著,添加如下行到 ccd/THelonious:# ifconfig-push 10.9.0.1 10.9.0.2 # ifconfig-push 10.9.0.1 10.9.0.2# Suppose that you want to enable different # 假如你想為不同的客戶端組啟用不同的防火# firewall access policies for different groups # 墻訪問控制策略,有兩種方式:# of clients. There are two methods: ## (1) Run multiple OpenVPN daemons, one for each # (1) 運行多個OpenVPN守護進程, 每個對應# group, and firewall the TUN/TAP interface # 不同的組,對每個組的 TUN/TAP 接口應用# for each group/daemon appropriately. # 防火墻。# (2) (Advanced) Create a script to dynamically # (2) (高級)創(chuàng)建一個動態(tài)腳本使防火墻對# modify the firewall in response to access # 接入的不同客戶端執(zhí)行不同的策略。查看# from different clients. See man # MAN 手冊頁獲取更多關于 learn-address# page for more info on learn-address script. # 腳本的信息。;learn-address ./script# If enabled, this directive will configure # 如果開啟,這個指令會配置所有的客戶端將# all clients to redirect their default # 它們的默認網(wǎng)關指向 VPN,導致所有的 IP# network gateway through the VPN, causing # 流量比如網(wǎng)絡瀏覽和 DNS 查詢等全部通過# all IP traffic such as web browsing and # VPN。# and DNS lookups to go through the VPN ## (The OpenVPN server machine may need to NAT # (OpenVPN 服務器需要 NAT 它的 TUN/TAP# the TUN/TAP interface to the internet in # 接口到互聯(lián)網(wǎng)以使其正常工作)# order for this to work properly). ## CAVEAT: May break client's network config if # 警告:如果客戶端的本地 DHCP 服務器數(shù)據(jù)# client's local DHCP server packets get routed # 通過隧道路由,可能破壞客戶端的網(wǎng)絡配置。# through the tunnel. Solution: make sure ## client's local DHCP server is reachable via # 解決:確??蛻舳说谋镜?DNCP 服務器# a more specific route than the default route # 可以通過一個更特殊的路由而不是默認# of 0.0.0.0/0.0.0.0. # 的路由 0.0.0.0/0.0.0.0 來訪問。;push "redirect-gateway"# Certain Windows-specific network settings # 確定的 Windows 專用網(wǎng)絡配置可以被推送到客# can be pushed to clients, such as DNS # 戶端,比如 DNS 或者 WINS 服務器地址。# or WINS server addresses. CAVEAT: # 警告:# http://openvpn.net/faq.html#dhcpcaveats # http://openvpn.net/faq.html#dhcpcaveats;push "dhcp-option DNS 10.8.0.1";push "dhcp-option WINS 10.8.0.1"# Uncomment this directive to allow different # 取消對這個指令的注釋來允許不同的客戶端可以# clients to be able to "see" each other. # “看到”對方。# By default, clients will only see the server. # 默認地,客戶端只能 “看到” 服務器。# To force clients to only see the server, you # 為了強制客戶端只能看到服務器,你需要一# will also need to appropriate firewall the # 個適當?shù)姆阑饓肀Wo服務器的 TUN/TAP# server's TUN/TAP interface. # 接口。client-to-client# Uncomment this directive if multiple clients # 如果多個客戶端以相同的證書/私鑰或者# might connect with the same certificate/key # Common Name 連接,取消對這個指令的# files or common names. This is recommended # 注釋。推薦用作測試目的。# only for testing purposes. For production use, # 對于正式應用,每個客戶端應該擁有自己# each client should have its own certificate/key # 的證書和/私鑰對。# pair. ## IF YOU HAVE NOT GENERATED INDIVIDUAL # 如果你沒有為每個客戶端生成各自的# CERTIFICATE/KEY PAIRS FOR EACH CLIENT, # 證書/私鑰對,每對擁有自己的的# EACH HAVING ITS OWN UNIQUE "COMMON NAME", # “Common Name”時,取消注釋# UNCOMMENT THIS LINE OUT. # 該行。;duplicate-cn# The keepalive directive causes ping-like # keepalive 指令可以使類似 ping 的# messages to be sent back and forth over # 信息被發(fā)送并保持連接以便每端知道什# the link so that each side knows when # 么時候另一端的連接丟失。# the other side has gone down. ## Ping every 10 seconds, assume that remote ## peer is down if no ping received during # 每 10 秒 ping 一次,假如遠端在# a 120 second time period. # 120 秒內(nèi)沒有回應則認為連接丟失。keepalive 10 120# For extra security beyond that provided # 如果需要除 SSL/TLS 提供之外的額外安全,# by SSL/TLS, create an "HMAC firewall" # 建立一個 “HMAC 防火墻” 來幫助屏蔽 DoS# to help block DoS attacks and UDP port flooding. # 攻擊和 UDP 端口洪水。# ## Generate with: # 用如下命令生成:# openvpn --genkey --secret ta.key # openvpn --genkey --secret ta.key# ## The server and each client must have # 服務器和每個客戶端必須有一# a copy of this key. # 份該密鑰的拷貝。# The second parameter should be '0' # 第二個參數(shù)服務器應該為 0,# on the server and '1' on the clients. # 而客戶端應該為 1。;tls-auth ta.key 0 # This file is secret# Select a cryptographic cipher. # 選擇一種加密算法。# This config item must be copied to # 這個配置條目同樣必須被復制到客# the client config file as well. # 戶端的配置文件中。;cipher BF-CBC # Blowfish (default);cipher AES-128-CBC # AES;cipher DES-EDE3-CBC # Triple-DES# Enable compression on the VPN link. # 對 VPN 連接啟用數(shù)據(jù)壓縮。如果你在# If you enable it here, you must also # 這里啟用 ,你也必須在客戶端的配置文# enable it in the client config file. # 件中啟用。comp-lzo# The maximum number of concurrently connected # 我們所允許的最大同時連接的客戶端# clients we want to allow. # 數(shù)目。;max-clients 100# It's a good idea to reduce the OpenVPN # 初始化后降級 OpenVPN 進程的權限# daemon's privileges after initialization. # 是個不錯的主意。# ## You can uncomment this out on # 你可以在非 Windows 系統(tǒng)上取消該行# non-Windows systems. # 注釋。user nobodygroup nobody# The persist options will try to avoid # 這個 persisit 選項可以避免在重啟# accessing certain resources on restart # 時訪問那些由于權限降級而不再可用# that may no longer be accessible because # 的資源。# of the privilege downgrade.persist-keypersist-tun# Output a short status file showing # 輸出簡短的文件來顯示當前的連接狀態(tài)# current connections, truncated # ,每一分鐘重寫或刪節(jié)一次。# and rewritten every minute. #status openvpn-status.log# By default, log messages will go to the syslog (or # 默認的,日志信息會輸出到 syslog (或者在# on Windows, if running as a service, they will go to # Windows 上,如果運行一個服務,它們會輸出# the "\Program Files\OpenVPN\log" directory). # 到 "\Program Files\OpenVPN\log" 目錄)。# Use log or log-append to override this default. # 使用 log 或者 log-append 來覆寫這個默認設置。# "log" will truncate the log file on OpenVPN startup, # "log" 會在每次 OpenVPN 啟動時刪節(jié)日志文件,# while "log-append" will append to it. Use one # 而 "log-append" 則會附加在其后。使用其一即可。;log /var/log/openvpn.log;log-append openvpn.log# Set the appropriate level of log # 設置適當?shù)娜罩疚募敿毤墑e。# file verbosity. ## ## 0 is silent, except for fatal errors # 0 是靜默的,嚴重錯誤除外# 4 is reasonable for general usage # 4 是合理的,通常使用即可# 5 and 6 can help to debug connection problems # 5 和 6 可以幫助調(diào)試連接問題# 9 is extremely verbose # 9 是極端詳細的verb 3# Silence repeating messages. At most 20 # 靜默重復消息。相同消息# sequential messages of the same message # 策略的 20 個連續(xù)消息# category will be output to the log. # 會被輸出到日志。;mute 20
關于服務器配置文件說明,還有以下版本可以參考:
最新 OpenVPN 2.1.1 版本服務器配置文件與以上版本的差異如下,可以看出,新的版本已經(jīng)部分的解決了推送客戶端配置參數(shù)可能導致的破壞客戶端網(wǎng)絡配置的問題。
diff server.conf server-2.1.1.conf
,server.conf 為 OpenVPN Howto 上的配置文件樣例,server-2.1.1.conf 為 OpenVPN 最新版本提供的配置文件樣例。
116a117,128> # Configure server mode for ethernet bridging # 為使用 DHCP-proxy 的以太網(wǎng)卡橋接配置服務> # using a DHCP-proxy, where clients talk # 器模式,客戶端可以同服務器端的 DHCP 服務> # to the OpenVPN server-side DHCP server # 器交流獲取 IP 地址和 DNS 服務器的地址。> # to receive their IP address allocation #> # and DNS server addresses. You must first use # 你必須首先使用系統(tǒng)的橋接功能來橋接 TAP 設> # your OS's bridging capability to bridge the TAP # 備到以太網(wǎng)卡 NIC 設備上。> # interface with the ethernet NIC interface. #> # Note: this mode only works on clients (such as # 注意:這個模式僅僅工作與那些客戶端(比如> # Windows), where the client-side TAP adapter is # Winodws)的 TAP 適配器被連接到一個 DHCP> # bound to a DHCP client. # 客戶端的情況。> ;server-bridge>173,181c185,187< # the TUN/TAP interface to the internet in # TUN/TAP 界面到互聯(lián)網(wǎng)以使其正常工作。< # order for this to work properly). #< # CAVEAT: May break client's network config if # 警告:如果客戶端的本地 DHCP 服務器數(shù)據(jù)< # client's local DHCP server packets get routed # 包經(jīng)過隧道路由,可能會波壞客戶端的的網(wǎng)< # through the tunnel. Solution: make sure # 絡配置。< # client's local DHCP server is reachable via # 解決:確??蛻舳说谋镜?DHCP 服務器通過< # a more specific route than the default route # 一個更特殊的路由而不是默認的 0.0.0.0/0.0.0.0< # of 0.0.0.0/0.0.0.0. # 是可達的。< ;push "redirect-gateway"---> # or bridge the TUN/TAP interface to the internet # 或者橋接 TUN/TAP 設備到互聯(lián)網(wǎng)以使其正常> # in order for this to work properly). # 工作。> ;push "redirect-gateway def1 bypass-dhcp"187,188c193,196< ;push "dhcp-option DNS 10.8.0.1"< ;push "dhcp-option WINS 10.8.0.1"---> # The addresses below refer to the public # 下面的地址指向由 opendns.com 提供的> # DNS servers provided by opendns.com. # 公共 DNS 服務器。> ;push "dhcp-option DNS 208.67.222.222"> ;push "dhcp-option DNS 208.67.220.220"
服務器采用不同的網(wǎng)絡接口,其配置文件也不盡相同,下面給出不同環(huán)境下的配置文件區(qū)別:
Bash:
dev tun # 還可以使用具體的 tun 設備的名字,如 tun0port 1194proto udp # 如果需要經(jīng)過 HTTP proxy 代理 VPN 連接,則必須使用 TCP 協(xié)議local OPENVPN_SERVER_IPserver 10.8.0.0 255.255.255.0
Bash:
dev tap # 還可以使用具體的 tap 設備的名字,如 tap0port 1194proto udp #如果需要經(jīng)過 HTTP proxy 代理 VPN 連接,則必須使用 TCP 協(xié)議local OPENVPN_SERVER_IPserver 10.8.0.0 255.255.255.0
Bash:
dev tap;dev-node OpenVPN-Tap # Windows 系統(tǒng)下如果有多個 TAP 設備,必須配置這個字段,提供所用 tap 設備的名字port 1194proto udp #如果需要經(jīng)過 HTTP proxy 代理 VPN 連接,則必須使用 TCP 協(xié)議local OPENVPN_SERVER_IPserver 10.8.0.0 255.255.255.0
Bash:
dev tap;dev-node OpenVPN-Tap # Windows 系統(tǒng)下如果有多個 TAP 設備,必須配置這個字段,提供所用 tap 設備的名字port 1194proto udp #如果需要經(jīng)過 HTTP proxy 代理 VPN 連接,則必須使用 TCP 協(xié)議local OPENVPN_SERVER_IP;serve-bridge # 如果服務器直接通過 DHCP 獲得地址,那么這里直接使用 server-bridge 即可server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 # 服務器所在子網(wǎng)可供提供給客戶端的 IP 地址范圍
服務器配置文件的其余部分基本不變,只是注意日志文件路徑在 Linux 和 Winodws 下的區(qū)別。
# 安全認證參數(shù) #dh dh1024.pemca ca.crtkey server.key # 需要注意這個文件的安全cert server.crt# 網(wǎng)絡配置參數(shù) #push "dhcp-option DNS 208.67.222.222"push "dhcp-option DNS 208.67.220.220"push "redirect-gateway def1 bypass-dhcp"# 其他配置參數(shù) #comp-lzopersist-keypersist-tunkeepalive 10 120# 日志配置參數(shù) #verb 3status /var/log/openvpn/status.log # Windows 下應該為 "C:\\Program Files\\OPENVPN\\log\\status.log"log-append /var/log/openvpn/openvpn.log # Windows 下應該我 "C:\\Program Files\\OPENVPN\\log\\openvpn.log"
OpenVPN 是點對點的隧道協(xié)議實現(xiàn),在網(wǎng)絡中,服務端和客戶端的地位是對等的,軟件自身不分服務端還是客戶端,關鍵取決于配置文件。如果配置文件是客戶端的配置文 件,則以客戶端模式運行,反之亦然。因此,不論什么系統(tǒng)平臺,安裝好 OpenVPN 之后,均可以使其已客戶端的模式運行,只需要準備好 ca.crt、client.crt、client.key 等證書和密鑰以及相應的客戶端配置文件 client.conf(client.ovpn # Winodws下),并將配置文件放在相應的配置文件目錄內(nèi),并確保配置文件中相應證書密鑰的路徑正確(注意區(qū)分 Unix-like 系統(tǒng)和 Windows 系統(tǒng)在路徑上的區(qū)別),即可啟動 OpenVPN 作為客戶端。
下面簡要介紹下相應平臺其他的 OpenVPN 客戶端實現(xiàn),這些實現(xiàn)的共同特點是擁有比較直觀的圖形配置界面。
Apple 的 Mac 電腦上可以使用 Tunnelblick 作為 OpenVPN 的客戶端。安裝完成后,放入當前客戶端的 ca.crt,client.crt,client.key 到配置文件夾(\Users\你登陸的用戶名\Library\Application Support\Tunnelblick\Configurations)。首次運行需要編輯配置文件,作相應的修改后,點擊右上角狀態(tài)欄隧道圖標即可連 接。12
Linux 的 Gnome 桌面下的 NetworkManager 網(wǎng)絡管理套件提供了一個 OpenVPN 的插件,以直觀方便的界面提供對 OpenVPN 管理配置,一般的發(fā)行版都有提供這個軟件包,請使用相應的包管理工具進行安裝。
Winodws 下可以使用 OpenVPN GUI for Windows 作為客戶端,在 http://openvpn.se/ 下載并安裝 OpenVPN GUI for Windows 后,放入當前客戶端的 ca.crt,client.crt,client.key 到其安裝目錄下的 config 文件夾,并編輯或生成配置文件 client.ovpn,做相應的修改,點擊狀態(tài)欄圖標連接即可。14需要注意的是,OpenVPN GUI for Windows 是對應于相應的 OpenVPN 版本的,http://openvpn.se/ 目前只提供對 2.0.9 的支持,如果你要連接的 OpenVPN 服務器使用的是其后的版本(比如 2010-8-15 發(fā)布的 2.1.2),可能有些新的配置參數(shù)無法支持(比如 dhcp-bypass 參數(shù)),會出現(xiàn)連接失敗或者連接后無法訪問網(wǎng)絡的問題。不過,OpenVPN 在 2.1.2 的 Windows 安裝程序中已經(jīng)集成了 OpenVPN GUI for Windows ,直接在 http://openvpn.net/ 下載即可。
############################################## ############################################ Sample client-side OpenVPN 2.0 config file # # OpenVPN 2.0 連接多客戶端服務器的客戶端配置# for connecting to multi-client server. # # 文件樣例。# # ## This configuration can be used by multiple # # 這個配置文件可以被多個客戶端使用,但是每個# clients, however each client should have # # 客戶端應該有自己的證書和私鑰文件。# its own cert and key files. # ## # ## On Windows, you might want to rename this # # 在 Windows 上,你可能需要重命名這個文件使它# file so it has a .ovpn extension # # 以 .ovpn 后綴。############################################## ############################################ Specify that we are a client and that we # 指明我們是客戶端,我們需要# will be pulling certain config file directives # 從服務器拉取特定的配置文件# from the server. # 指令。client# Use the same setting as you are using on # 使用和你服務器相同的設置。# the server. ## On most systems, the VPN will not function # 在大多數(shù)系統(tǒng)上,VPN 將不會工# unless you partially or fully disable # 作,直到你完全或者部分地為# the firewall for the TUN/TAP interface. # TUN/TAP 接口的關閉了防火墻。;dev tapdev tun# Windows needs the TAP-Win32 adapter name # 如果你有不止一個 TAP-Win32# from the Network Connections panel # 適配器, Windwos 需要指明它在# if you have more than one. On XP SP2, # 網(wǎng)絡連接控制面板中的名字。# you may need to disable the firewall # 在 XP SP2 上,你需要為 TAP 適# for the TAP adapter. # 配器關閉防火墻。;dev-node MyTap# Are we connecting to a TCP or # 我們使用的是一個 TCP 或者# UDP server? Use the same setting as # UCP 服務器?使用和服務器相# on the server. # 同的設置。;proto tcpproto udp# The hostname/IP and port of the server. # 服務器的主機名或者 IP 以及端口。# You can have multiple remote entries # 你可以有多個遠端入口來平衡服務# to load balance between the servers. # 器之間的負載。remote my-server-1 1194;remote my-server-2 1194# Choose a random host from the remote # 從遠端服務器負載平衡列表中隨機# list for load-balancing. Otherwise # 選擇一個主機。# try hosts in the order specified. # 否則,按照順序嘗試主機。;remote-random# Keep trying indefinitely to resolve the # 不停的嘗試解析 OpenVPN 服務器的主# host name of the OpenVPN server. Very useful # 機名。對于那些不是永久連接到互聯(lián)網(wǎng)# on machines which are not permanently connected # 的機器比較有用,比如筆記本電腦。# to the internet such as laptops.resolv-retry infinite# Most clients don't need to bind to # 大多數(shù)客戶端不需要綁定一個特# a specific local port number. # 定的本地端口號。nobind# Downgrade privileges after initialization (non-Windows only) # 初始化后降級權限(僅支持非 Windows 系統(tǒng));user nobody;group nobody# Try to preserve some state across restarts. # 嘗試保持一些狀態(tài)通過重新啟動。persist-keypersist-tun# If you are connecting through an # 如果你是通過一個 HTTP 代理來連接# HTTP proxy to reach the actual OpenVPN # 實際的 OpenVPN 服務器,在這里添# server, put the proxy server/IP and # 加代理服務器的 IP 和端口號。# port number here. See the man page ## if your proxy server requires # 如果你需要驗證,請查看 MAN 手冊# authentication. # 頁。;http-proxy-retry # retry on connection failures # 連接失敗后重新嘗試;http-proxy [proxy server] [proxy port #]# Wireless networks often produce a lot # 無線網(wǎng)絡總是產(chǎn)生很多重復的數(shù)# of duplicate packets. Set this flag # 據(jù)包。設置這個標記來忽略重復# to silence duplicate packet warnings. # 數(shù)據(jù)包警告。;mute-replay-warnings# SSL/TLS parms. # SSL/TLS 參數(shù)。# See the server config file for more # 查看服務器的配置文件獲取更多的描述。# description. It's best to use # 最好為每個客戶端使用獨立的 .crt/.key# a separate .crt/.key file pair # 文件對。# for each client. A single ca # 一個單獨的 ca 文件可以用于所有的# file can be used for all clients. # 客戶端。ca ca.crtkey client.keycert client.crt# Verify server certificate by checking # 通過檢查證書有無值為 "server" 的# that the certicate has the nsCertType # nsCertType 字段來確認服務器證書。# field set to "server". This is an # 這是一個非常重要的預防措施來防止在# important precaution to protect against # http://openvpn.net/howto.html#mitm# a potential attack discussed here: # 討論過的潛在的攻擊。# http://openvpn.net/howto.html#mitm ## # 要使用這個特性,你必須通過設定# To use this feature, you will need to generate # nsCertType 字段為 "server" 來# your server certificates with the nsCertType # 生成你服務器的證書。# field set to "server". The build-key-server # 可以使用 easy-rsa 目錄下的# script in the easy-rsa folder will do this. # build-key-server 腳本來完成。;ns-cert-type server# If a tls-auth key is used on the server # 如果服務器使用 tls-auth 密鑰,請選擇# Select a cryptographic cipher. # 一個加密密碼。# If the cipher option is used on the server # 如果服務器使用了密碼選項,你也必須在# then you must also specify it here. # 這里指定。;cipher x# Enable compression on the VPN link. # 對 VPN 連接啟用壓縮。# Don't enable this unless it is also # 除非服務器配置文件也啟用了這個指令,# enabled in the server config file. # 否則不要啟用。comp-lzo# Set log file verbosity. # 設置日志文件詳盡級別。verb 3# Silence repeating messages # 靜默重復信息。;mute 20
關于客戶端配置文件,還有以下版本可以參考:
下面是一份與前面的服務器配置文件相對應的客戶端配置文件,客戶端的配置文件比較簡單,只需要根據(jù)服務器的配置調(diào)整 dev、proto 等參數(shù)即可。
clientdev tun # 根據(jù)服務器配置決定,如果服務器采用 tap 設備,則為 tap;dev-node OpenVPN-Tap # Windows 系統(tǒng)下如果有多個 TAP 設備,必須配置這個字段,提供所用 TAP 設備的名字proto udp # 與服務器保持一致remote OPENVPN_SERVER_IP 1194ca ca.crtkey client.keycert client.crtcomp-lzopersist-keypersist-tun
如果需要除 SSL/TLS 提供之外的額外安全,建立一個 “HMAC 防火墻” 來幫助屏蔽 DoS 攻擊和 UDP 端口洪水,使用 openvpn --genkey --secret keys/ta.key
來生成 ta.key 文件,服務器和每個客戶端必須有一份該密鑰的拷貝。
同時,修改服務器配置文件,添加 tls-auth ta.key 0
;修改客戶端配置文件,添加 tls-auth ta.key 1
。注意,第二個參數(shù)服務端和客戶端應該不同,比如服務器若為 0,則客戶端應該為 1。
若果我們需要隊 OpenVPN 客戶端的的流量控制,我們可以使用 TC 這個程序。
這是一個示例,假如 OpenVPN 客戶端通過 OpenVPN GUI 軟件連接到服務器,然后通過 NAT 連接到外網(wǎng)。其中,eth0 為服務器以太網(wǎng)卡接口 (66.77.88.99),tap0 為服務器虛擬網(wǎng)卡接口 (10.8.0.1),VPN 客戶端 IP 為10.8.0.2。
Bash:
iptables -t nat -A PREROUTING -d 66.77.88.99 -j DNAT --to 10.8.0.2iptables -t nat -A POSTROUTING -s 10.8.0.2 -o eth0 -j SNAT --to-source 66.77.88.99
Bash:
tc qdisc add dev tap0 root handle 1: htb default 10tc class add dev tap0 parent 1: classid 1:1 htb rate 256kbit burst 10ktc filter add dev tap0 parent 1: protocol ip prio 16 u32 match ip dst 10.8.0.2 flowid 1:1
Bash:
tc qdisc add dev eth0 root handle 2: htb default 10tc class add dev eth0 parent 2: classid 2:1 htb rate 128kbit burst 10ktc filter add dev eth0 parent 2: protocol ip prio 16 handle 1 fw flowid 2:1iptables -t mangle -A PREROUTING -i tap0 -s 10.8.0.2 -j MARK --set-mark 1iptables -t mangle -A PREROUTING -i tap0 -s 10.8.0.2 -j RETURN
OpenVPN 提供跟進一步的插件機制來滿足不同用戶的需求。通過插件機制,可以在程序邏輯的一些關鍵點調(diào)用腳本或者插件來完成不同的任務。關于這部分,目前我了解也不是很多,下面是兩篇比較深刻的相關的源代碼分析,可能會有所幫助。
聯(lián)系客服