| 
 | 
 
Server使用的配置文件server.conf 
! r6 O6 U' q& }0 B. z. ^—————————–$ c5 H  R" w- i4 O 
#申明本机使用的IP地址,也可以不说明3 W" e8 Z' [' \* y 
;local a.b.c.d: J0 I! x. _# y 
#申明使用的端口,默认1194 
+ h* \+ p* W9 `- K" D- xport 1194$ q* Q6 m- z4 } 
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议9 j! U, `) B# } 
#如果使用ipv6应改为proto tcp6或proto udp6 
" U. T1 {& f4 v. I5 `- M;proto tcp , M/ E& m- S- X# H# e) @ 
proto udp" D6 [0 I& h' Q. B. t9 R' W 
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。; o9 Y8 y7 Q% D7 C3 q* \ 
#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备+ U% L6 K' S- `% r9 V 
dev tap 
5 L: N+ o3 y: g% @8 n# u;dev tun2 h1 X; l3 P1 n' |; b2 a 
#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法6 ]7 p$ s  `, E5 Q 
ca ca.crt 
; r( X  `) i! y& F2 B#Server使用的证书文件 
- X( ~: I8 D: g# Jcert server.crt( @+ `: l' [+ { 
#Server使用的证书对应的key,注意文件的权限,防止被盗 
# ^/ [9 w( o$ l8 _1 O; }key server.key # This file should be kept secret 
2 z7 n- t* A9 {8 ]1 |% S#CRL文件的申明,被吊销的证书链,这些证书将无法登录9 o  R, O/ r, O 
crl-verify vpncrl.pem 
% f, X2 }, w. p. K/ n* M#上面提到的生成的Diffie-Hellman文件 
9 w0 ^* x6 z! {6 {8 B- k& Q' P0 d( bdh dh1024.pem. f& W3 o: R, a, f+ c 
#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由 
& B$ f& n- R) y#这条命令等效于:* T+ Y" X! L( `6 G+ k- W) I 
# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入 
) v* t- {/ C" T, \# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client 
$ ^1 e- F" I0 f! b& E, j#' P0 C4 G  @/ x, N 
# if dev tun: #如果使用tun设备,等效于以下配置 
# I- p/ B: |: d* |7 \# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址6 U$ L# a, X2 a# d5 | 
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址 
; B) d7 G6 v% p: s# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2 
2 P% L9 x; n8 U. V* F# if client-to-client: #如果使用client-to-client这个选项 
1 z8 K& h" c. I" I# K- Y0 A6 ^# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.1 
" u6 s% Q& G0 [6 E; B8 J4 L# else, k9 u2 b+ O4 y$ H; V' i2 e 
# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1 
# V: \# G9 }4 B0 j: i* L# 
; u' [% N1 e  |% ?  G# if dev tap: #如果使用tap设备,则等效于以下命令 
8 [' y0 q. `+ d+ }# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址. E, G3 c7 |# A) q% E( u 
# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码 
8 i, c8 N0 L! F) _* T# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机* |4 Y2 `' v1 s( l 
#8 Z  F2 h' E2 w' h  P/ \9 P 
server 10.8.0.0 255.255.255.0 #等效于以上命令 
: D  F/ `& B/ k0 ^- g& _! p) A+ B#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件, 
6 ?; S8 }9 O6 m4 N/ Z! e#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址 
1 w- }+ d5 ~8 U; |1 N4 cifconfig-pool-persist ipp.txt- N6 a9 s' Q* F2 S 
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用: {1 h7 q- n7 \7 X 
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100& W  D7 z, j* _' B$ q 
#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用 
. O( v% L, v  c7 v, P7 C9 F! y+ c;push “route 192.168.10.0 255.255.255.0″ 
7 s  {; a" M* |/ k;push “route 192.168.20.0 255.255.255.0″- U! m* a# e1 W/ O! ~- a; p! a; s 
#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除 
& a% C# K/ ]: `/ }8 m2 t;route 10.9.0.0 255.255.255.252 
9 W2 k" y4 e7 K3 R' S#Run script or shell command cmd to validate client 
' a% D! q1 k  p" n1 M9 w, W- z#virtual addresses or routes. 具体查看manual 
: B% F2 s4 J% a6 V;learn-address ./script 
) X3 z8 \" y  H# v5 S1 }#其他的一些需要PUSH给Client的选项 
5 c3 H' @9 d3 `4 L, u0 W" [8 w# 
& t9 o: l  \/ N/ I; g#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走 
, K% ]( g# k" p; E* J8 X, L4 U: k, \;push “redirect-gateway” 
3 A! j1 y0 ?5 h& X#DHCP的一些选项,具体查看Manual 
9 X/ y2 G& W, ^' J" g3 k+ q$ v;push “dhcp-option DNS 10.8.0.1″ 
. D; i: _6 J- }: U;push “dhcp-option WINS 10.8.0.1″4 w- E  V1 f0 r6 c" c( U 
#如果可以让VPN Client之间相互访问直接通过openvpn程序转发, 
' o' L0 V7 ?, ?$ S, g#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率 
8 m$ h+ ~) t) B- sclient-to-client 
7 H  I6 ~4 d/ s# g. A0 K  ?, h5 a#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA 
9 t, B( D: ]2 `# v( [! W#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN 
4 g; ?: v9 r1 U0 ]3 i+ B3 R7 w$ ?7 g) K;duplicate-cn 
5 k3 ], s/ A' e& S# @#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效, 
# q- X4 H. A0 j9 q% R, N: I% e3 h#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制, 
) U" y: d! [# t1 Q3 Y#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,/ r( e; C" v; P0 { 
#认为连接丢失,并重新启动VPN,重新连接 
' q0 q' K' a* y* W, M+ U0 P#(对于mode server模式下的openvpn不会重新连接)。5 N) X& u- G! z3 S* N8 n+ e 
keepalive 10 120 
1 T  X& e# \! ^* L* ^; J; ^#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,$ I" y. B2 o- i) X- g+ ]7 ^ 
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1 
9 d. S' }+ {+ k) B. o/ Qtls-auth ta.key 0 # This file is secret 
" F; F; N  ?7 X& Y/ ?( y& Q) W#对数据进行压缩,注意Server和Client一致# H+ V6 H' y3 I" Z4 U! N1 @/ g 
comp-lzo 
0 r) s6 V  w. s% N  m#定义最大连接数 
) I! X5 F8 J& j5 H: ?' {1 C;max-clients 100 
( p, y: \2 l6 x' u4 ]% X. g  z#定义运行openvpn的用户 
( ]; u& W+ W& p/ J9 nuser nobody" |# S- O' c9 i: n* v2 U* H 
group nobody 
/ w1 R% {& I$ _# |3 w4 b#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys* ~2 ?  Y4 F2 j, Z/ M8 f 
persist-key0 s7 U3 N2 J% T, I9 K5 p2 d 
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,7 L3 F! W4 N3 u5 s2 f0 H4 v. f/ h 
#否则网络连接会先linkdown然后linkup 
/ E* m) ?  t8 E8 Ipersist-tun3 V! }& n( u$ k3 R5 m% r5 D2 l 
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作- @% O6 M7 q. _$ L2 } 
status openvpn-status.log 
. W4 @7 I3 c9 b3 g#记录日志,每次重新启动openvpn后删除原有的log信息 
+ `( L$ X6 S- V1 T) i# L" ~log /var/log/openvpn.log 
5 @4 b/ J, V9 M# H#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后 
: a/ Y- H" `  ]. q+ A8 f  w;log-append openvpn.log 
4 n( \2 T7 |+ W; n, y' G#相当于debug level,具体查看manual+ N5 w% W: l8 |% u, w4 c1 N& ]6 \) q% x. Z 
verb 3 
2 j7 @% h1 b" [——————————-# O1 B0 _8 _1 m* ~$ ]6 e 
把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下: 
0 D' H/ S. O9 w. M5 V" |7 {#cd /etc/openvpn 
& @+ c( E4 g2 I! Y4 ]#cp easy-rsa/keys/ca.crt . 
: N8 G2 U; [/ d1 d#cp easy-rsa/keys/server.crt .) u$ e1 Y% d$ C+ E! l+ R  b 
#cp easy-rsa/keys/server.key .8 E% e: u  _( R 
#cp easy-rsa/keys/dh1024.pem .. d: u5 L/ ^; H) r 
#cp easy-rsa/keys/ta.key .4 |$ G1 A7 k/ L5 [/ @: p. o 
#cp easy-rsa/keys/vpncrl.pem .2 D! f5 i0 I  y  T 
创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn 
! E0 B6 _$ U& r- A+ ^然后运行:0 j! ^0 m$ c* R1 r! |; k: h 
#chkconfig –add openvpn 
9 D% k3 n' k% b: K#chkconfig openvpn on" V2 U- ~3 b, x% R( ^+ O. i 
立即启动openenvpn 
3 ~( {7 y0 L6 q3 q# u#/etc/init.d/openvpn start 
$ \, e& S: X7 D, }5 { 
) \% o$ v8 U' ^8 M) V) R接下来配置客户端的配置文件client.conf: 
( O; ?7 H7 w* P" Y1 W, \& CLinux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key/ |0 r& q; }  v3 x2 V7 k 
———————————-! M. D- f: ^, | 
# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的” 
9 B- R+ f, h  ~$ nclient 
/ {' U+ L# f9 n$ s. g# X 
  }, x  ?" x5 r#指定接口的类型,严格和Server端一致 
8 H* ~* L8 r) [9 l* {5 J4 ldev tap# n$ g1 x8 L2 r# N 
;dev tun! k& R* H' O8 K2 p# } 
 
; |/ n5 u4 J6 @; M( a/ x+ T9 g# Windows needs the TAP-Win32 adapter name' n9 `% t/ i% ~* e 
# from the Network Connections panel 
( h+ u' \- ?) `1 X2 e6 s- v# if you have more than one. On XP SP2,; Z/ E' Q0 I& {! a 
# you may need to disable the firewall 
  n7 w' B- ]; x: r2 s# for the TAP adapter.) n9 C8 ?  y1 m! f) ?* G3 Z 
;dev-node MyTap 
; {4 Y- w6 A7 u" c# U- J3 L9 Y. p/ U# @4 i( u 
# 使用的协议,与Server严格一致5 ?) Y" Q2 L% H, t 
;proto tcp- _  I* Y$ Y5 w 
proto udp* n: Q8 \1 j  d2 k 
 
" _7 X. k# O# u- d2 x; m% l, F9 }#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字" R4 U- e0 q# [" v$ @ 
 
, R1 G. K& A. F; ~# `2 f% O1 `remote 61.1.1.2 1194 
% Z2 ^/ j7 F- H9 u;remote my-server-2 1194 
* f& ?; b. e/ D% G! J7 j) j4 F2 W, S. }7 Q9 n 
# 随机选择一个Server连接,否则按照顺序从上到下依次连接 
2 O+ ^/ K: n, G+ _% j;remote-random 
: H) \( Z8 l1 w5 x, T 
0 j* e% z5 v" U6 t7 }# 始终重新解析Server的IP地址(如果remote后面跟的是域名), 
% \, a. {: i6 f0 b* Z, }, P' j& S$ E# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址9 e1 A8 Z( v' {: V+ h5 N: e" x 
# 这样无需人为重新启动,即可重新接入VPN6 B9 u) T$ A3 R$ l3 ~* {; _ 
resolv-retry infinite 
4 l) c1 h3 {& I4 Z% e6 Y- T' n' K+ z) z) T6 V! b 
# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要8 T  \7 v! n5 N; V4 i6 c3 h( T 
nobind3 F  D9 Z: q3 a( h0 T7 I 
0 t; B' a$ D; x( \: v( D% N 
# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作7 r* [- w7 N+ t1 c 
user nobody 
2 B8 w3 W2 ?) ]! n' H, zgroup nobody 
& b, B$ V8 u3 M& H% b0 _! M$ t. i. l4 A1 y 
#在Client端增加路由,使得所有访问内网的流量都经过VPN出去5 I) E1 b' W1 r' D 
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是 
/ y9 w( z8 Y* P. z+ m# push “route 192.168.0.0 255.255.255.0″ 
9 {: O+ [7 ^2 M& g1 `8 J( t, [route 192.168.0.0 255.255.0.0# E- _- g+ Z0 o  e5 p$ {: @7 m 
 
' Q0 j3 h6 G2 |* l4 i, ^# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备 
! Z" W( V7 G  G5 Q2 I/ Z' ipersist-key  H" \+ [; q8 H1 u% C6 R# e 
persist-tun 
$ C. x: G% S  J) d1 K% n1 n 
) A0 r6 a, q4 N7 {& ]- h! m# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面 
. _8 U9 R) ?: F, V; ~# B# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method] 
; l' V. L% O2 Y8 O' a# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual 
7 k$ I/ b# x. N# q& y;http-proxy-retry # retry on connection failures 
. x7 j' T9 @9 R" J9 J;http-proxy [proxy server] [proxy port #]( ^$ n5 z. s2 t$ X+ C* [+ H  ~ 
 
; u, s  {3 b! M7 a# 对于无线设备使用VPN的配置,看看就明白了 
; }1 g3 [, I; {8 k  l. p/ k# Wireless networks often produce a lot! L4 }, l0 O7 o* a( b; M% A) z 
# of duplicate packets. Set this flag: y  S2 N" N9 ~) ?" H 
# to silence duplicate packet warnings.0 c2 |2 C- F* L" W% z6 n( n' F 
;mute-replay-warnings: n  S; c' p( ]' N 
 
5 m& P2 E! m) i* u$ u6 K# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件- o, ~2 A! d$ L7 X1 u1 h- l+ d, w 
ca ca.crt 
: k9 A: v5 K: f# J% v& K; N* @# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。 
: Q, N9 [& N3 Mcert elm.crt 
4 v' J" c# P: p0 Rkey elm.key 
; A6 L- D6 m/ f* a7 l7 Y 
* ~! t) t# V$ H! t+ J# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项, a: n6 `, r4 R9 Z/ k: M' {; a 
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server$ _0 W' A2 v0 k2 _ 
# 因为他们的CA里没有这个扩展 
  b: i# O% T7 }6 Z# G3 hns-cert-type server+ W, O+ F  S- U* R 
$ ^8 S8 N; O7 w1 m 
# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1; B# ]5 y& g8 Z 
tls-auth ta.key 1 
! ^7 S4 D1 t  V8 y1 m3 Z 
& A( c$ v& F: H6 p5 ^# 压缩选项,和Server严格一致 
3 f9 Z1 o! M& Acomp-lzo* U( _" K  E! [1 C( ^# W 
 
- e. P) m+ ?) y8 `# Set log file verbosity.6 [/ N3 R: a& W) v9 g 
verb 4  
& w- L7 P5 M# H. x- }' U |   
 
 
 
 |