|
|
Server使用的配置文件server.conf
+ X- b% H! m- @- m% S, `( V/ d+ ^—————————–
, ?& Z. O( z& o( z* v* f o" D% M#申明本机使用的IP地址,也可以不说明3 e2 i1 j* V* L5 _; |+ ]/ v$ Z
;local a.b.c.d
+ }- `/ h( |6 E" N3 o#申明使用的端口,默认1194% z5 f! U; r! C0 i
port 1194
/ [: N1 O- O/ f4 C#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议
# }0 \! r7 v) S6 {# Q- r#如果使用ipv6应改为proto tcp6或proto udp6
9 g3 [) J- Z6 ^, h2 x2 j;proto tcp 2 n, @/ R2 I1 t- ?9 z: _
proto udp
6 s' M9 a$ ?0 u8 K! K( H: g a$ o" |#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。
+ f* r! L( k, H6 F$ N% l#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备. \( ?$ @/ _' Y) ~, [
dev tap4 |- L( ^, i' K" e$ N
;dev tun3 H. O8 P& E, ]- L- N
#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法4 r& [8 r V& Z6 \ L
ca ca.crt: h, ?" k2 Q6 q! m$ @$ A/ ?4 u
#Server使用的证书文件
" }# }( b) A. Ycert server.crt; F7 u: Y* U6 y/ i
#Server使用的证书对应的key,注意文件的权限,防止被盗. ?. g" o0 v* o$ Y
key server.key # This file should be kept secret( f8 P6 m" q1 a6 v4 W
#CRL文件的申明,被吊销的证书链,这些证书将无法登录- b$ \9 N! w, s6 z7 w
crl-verify vpncrl.pem
4 p# ?; D6 _) t b# F- l* e2 c#上面提到的生成的Diffie-Hellman文件# l, ~! U1 `) G A" y
dh dh1024.pem; R. F- g/ d2 X, [& {! V
#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由2 { u2 s4 f7 N, P' T; |8 H* ^
#这条命令等效于:
9 Y: E2 v+ C, E6 q0 W& ~# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入
' U5 V' H0 O& Q: G% Q9 d# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
7 }" q: m g0 ?#
9 V& E7 u0 a$ j3 ?# if dev tun: #如果使用tun设备,等效于以下配置
+ @) g& C0 P" N# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址0 k9 b( Z0 S1 e' |4 r" u9 `$ B
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址* o7 t! F) Y8 y& ^: P8 I* B
# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2
! { |6 F- V, p( b/ f# if client-to-client: #如果使用client-to-client这个选项
4 J3 n. x: _) ^, {( ?- v* V# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.11 B8 U5 j" y+ r: h E
# else
+ i, G& b7 A+ Q6 N# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1 S& x5 X; S) i& }- X/ E
#
. X% I2 A* G5 x- ?2 f7 _/ E# if dev tap: #如果使用tap设备,则等效于以下命令
6 [. o2 ?8 p' h& h/ w: R; @5 p% x# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址
6 n0 a# Q/ Z2 U+ D# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码
y/ K; o' h' I# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机
# y9 t) v3 C" o/ i#' d: L6 ` |9 t6 r ~ b
server 10.8.0.0 255.255.255.0 #等效于以上命令5 D% x$ f3 n9 T
#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,- H% F8 {& k0 v* n8 f7 o" t
#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址
; e" _& p0 p, Oifconfig-pool-persist ipp.txt m1 j5 K+ R4 [- x
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
* b- i: v- R( }0 ~7 D8 x) I;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
& {' i, `. K) f& T0 @2 v: k#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用. _, d+ r2 e. Z8 y% i
;push “route 192.168.10.0 255.255.255.0″
0 d+ V& [! Q% ^# };push “route 192.168.20.0 255.255.255.0″, \. t% D) Y9 H: V1 W
#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
6 ~: r% Z7 h( E' c- e' p9 f5 `* E;route 10.9.0.0 255.255.255.2526 l' e# y+ P/ r, ]
#Run script or shell command cmd to validate client) N) x/ C9 _# u) v+ z+ ]) j: }
#virtual addresses or routes. 具体查看manual4 a/ F/ `+ f$ P4 N7 m
;learn-address ./script
! z7 Y! R& l( c6 t#其他的一些需要PUSH给Client的选项
0 n s ^# v9 B#
# {$ A9 h5 W* a; `" S1 t8 G9 a#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走* V: d3 d" o4 ]; z
;push “redirect-gateway”
' c% B% ?& q* o+ |8 }#DHCP的一些选项,具体查看Manual: w. s0 s; w- w; p' H# S, d, l* M
;push “dhcp-option DNS 10.8.0.1″
' c! s8 {0 }$ U1 L- E6 ~- };push “dhcp-option WINS 10.8.0.1″) l7 I* K/ {- ]/ Q4 s
#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,% V. e/ j* G$ N
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
, d R5 H5 A. ^% S, X; {) E9 N8 @client-to-client; e5 y, A! e4 V+ v$ a% y
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA( _9 V; f1 j. [ X8 {3 e: I
#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN' g# w5 Z p$ Z& ]. a, y% ^
;duplicate-cn
1 J5 l% o4 M- p0 C' P1 s- ^$ {#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,* }! X) t4 Q% s0 ?0 x* U i
#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,1 D6 N p7 \! m! |0 Y
#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,
% ~; @8 ~/ k! X& F9 S2 J0 `; i1 O#认为连接丢失,并重新启动VPN,重新连接
" T, C* b$ ~. J1 f#(对于mode server模式下的openvpn不会重新连接)。; X0 i5 |, b0 x9 b* K4 o
keepalive 10 120
# D7 U/ g, g7 }2 W: P#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,, i' [8 Q6 y4 W2 p
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用17 O( h3 [- u2 m' {
tls-auth ta.key 0 # This file is secret" [# C5 U- t% {/ b
#对数据进行压缩,注意Server和Client一致
6 D7 A# U4 O9 lcomp-lzo7 L$ I, L3 K' \' }3 k2 n6 t" V/ A+ u
#定义最大连接数+ H* { r$ C8 J) M% s( ^' v& p
;max-clients 1001 U4 [- c( S9 K9 C E
#定义运行openvpn的用户
' z, O! w1 Y# O' puser nobody6 W5 M) ~( x* d) w. F
group nobody k( l( B, A& T. g2 X+ E/ b9 I0 K% C
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
/ |. M' Q2 z0 ^0 y2 |0 dpersist-key
& V! p0 x& z1 i$ V( t& ~& b- k. G#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,
% K( ]% q6 L- j9 U#否则网络连接会先linkdown然后linkup
: u( e( F. {) R7 K( K8 ]persist-tun' J: Z3 u. G: ?8 }7 k
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
% `) |; c9 X/ G6 ^5 ~8 N/ [4 f3 T( |status openvpn-status.log
5 c8 D& ]5 s- f6 Y2 C#记录日志,每次重新启动openvpn后删除原有的log信息
* W+ g$ q) q+ p" W4 s3 vlog /var/log/openvpn.log
+ I$ t. F9 ~& h4 d) V/ E#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后) ?; O5 b0 D6 _3 ?0 r
;log-append openvpn.log) L1 h3 _+ i3 M9 h! r- g
#相当于debug level,具体查看manual
7 z8 E, ?1 z) W5 d9 Z4 k- V5 ~$ {; vverb 3 L- V/ ^& \& F! }# O- \
——————————-2 K7 `. G& J' b. d$ ?
把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:
5 M: v1 _7 T9 G1 T. {% Q, k#cd /etc/openvpn$ o9 M$ l9 T1 S/ ` c0 b% g
#cp easy-rsa/keys/ca.crt .2 s/ h4 R. f' c% @
#cp easy-rsa/keys/server.crt .1 A1 Z! O$ R7 f' q
#cp easy-rsa/keys/server.key .
( C1 `3 G C4 {0 L' Z$ B#cp easy-rsa/keys/dh1024.pem .3 S6 f, t: g$ b/ q C
#cp easy-rsa/keys/ta.key .% S4 [% | L- L% I% Q; ?4 j* k
#cp easy-rsa/keys/vpncrl.pem .# b: `% R; G8 `' ?/ M f0 T' }! E7 @
创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn" m6 K: L: \8 ?$ ^# Z1 @# O
然后运行:& O$ X9 ~" j7 N9 R
#chkconfig –add openvpn. S) G# w$ E5 d4 g# A
#chkconfig openvpn on4 I9 y6 U* Q% b
立即启动openenvpn
% a$ @9 w. z+ _9 t5 ^8 T#/etc/init.d/openvpn start
4 u8 L0 h( Q: {" M
2 I- i* s% }$ @5 f" `; O; s接下来配置客户端的配置文件client.conf:2 U, P5 d9 a& X# b: F
Linux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key9 q3 `& I2 r6 u; {# O$ J/ r
———————————-
! G6 p$ H/ ]2 b1 x# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”, N+ r# N+ |0 m% G |' ?. b3 S
client
' }, ^1 I6 |0 z) Z: D [/ T: i1 N8 `9 A* C: n
#指定接口的类型,严格和Server端一致8 F9 g+ J, D7 `, Y% z$ R7 j
dev tap
' f- _ e/ I1 H2 j;dev tun
+ q$ ]+ j4 x5 w0 M2 a) T% j# Y" f7 n* ?, p/ P/ n' U
# Windows needs the TAP-Win32 adapter name
+ }7 t- C& i( ]4 W) s, G# from the Network Connections panel% }5 D' ?9 }2 L2 \
# if you have more than one. On XP SP2,# [9 ~+ _; e! N& d
# you may need to disable the firewall! W* R( j. G$ {. o9 C
# for the TAP adapter.: f7 n W8 [: R" e- X
;dev-node MyTap
8 `; l2 z( ]* d/ r( K& V* M! K% C
# 使用的协议,与Server严格一致
& g! O6 H$ U i! }# i. {6 h;proto tcp
' g7 i* E& k. `proto udp
- V& ?) N7 g$ |5 @# C9 t3 f, h" Q) P+ i6 `
#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
9 O. w) ^6 x$ ?0 ]+ w/ U
, B! ]. I; f% rremote 61.1.1.2 1194
6 |% _& H, i4 `3 j3 g3 F7 t;remote my-server-2 1194& _9 E1 L/ ]; q, O8 H
Y$ t2 ], J6 T8 n# 随机选择一个Server连接,否则按照顺序从上到下依次连接0 K' R, f1 X4 n- L# p4 [0 `; Z
;remote-random
4 i0 b+ }. j* k+ D" @% c
- f" `: v- U8 x+ c& s% Y1 o# 始终重新解析Server的IP地址(如果remote后面跟的是域名),2 q; y; y& B. ^1 N3 W% G& @; U
# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址
/ z) }9 K, }3 I9 e# 这样无需人为重新启动,即可重新接入VPN8 s4 }- t' I# }% P4 N/ B/ F
resolv-retry infinite
( S* D4 e) t( t- O" M0 q: ^" L: |7 r( E( d$ R
# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要
6 F# l- f4 R8 @- G1 s0 fnobind
/ Y; {# h( f* F( s) g
8 J1 |% d- Y! s. f! G# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作" L: P. W( D' f5 a! E& U
user nobody
7 H* e9 u4 D7 n0 xgroup nobody0 }. @% I1 K U+ w% d
+ M0 i) {3 d i4 n5 q4 W# k#在Client端增加路由,使得所有访问内网的流量都经过VPN出去0 M/ g" [# N* _8 D; a- O
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
3 Q. ~# B- J" s7 L; ~; S9 Z# t# push “route 192.168.0.0 255.255.255.0″
0 S' u9 f' ^/ U" b1 Mroute 192.168.0.0 255.255.0.0
/ E3 |4 ~0 Y3 Q; Y9 D# K0 |, r0 L7 T9 W ?+ d9 f# E
# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备: B8 S0 ^+ X9 `* _3 ?/ {6 ]7 x
persist-key2 t2 u7 S) U& K5 z
persist-tun
4 }/ ^6 E/ _' \8 N. {. i
9 W9 j3 d8 X+ Z" l, x' y# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面
8 X, k' o" ? ]/ Y% x. }* g( t" w! X" e# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]& S) R5 j# d" Z% z. H: P
# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual7 j5 b1 D- l- G. p' R
;http-proxy-retry # retry on connection failures
5 }7 v4 _0 r; e8 k# |;http-proxy [proxy server] [proxy port #]
4 N4 i3 b, f3 J/ W+ J( n0 h, K, `" `
. u& u: ]5 Q, {2 d' W, ]- c3 `# 对于无线设备使用VPN的配置,看看就明白了
( o! x8 w% l! v. g% y# Wireless networks often produce a lot1 L+ G8 w! s4 ^ M6 |
# of duplicate packets. Set this flag
1 e+ B1 c2 |% R3 i& d# to silence duplicate packet warnings.1 c7 V6 ~: f+ K2 z& o, X
;mute-replay-warnings
3 r2 P8 e7 G+ _, T, r% T4 G! v
e/ ~+ X& q* P# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件4 S: U& S5 w p; m6 R+ d: J3 x
ca ca.crt! i% F* i. t0 y) y: G' o
# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。& ^! }- N+ E: F! |3 C \1 Y
cert elm.crt
( w! v, Z6 @5 R$ H% E2 G: D( g' ukey elm.key
: c7 V) c4 u& p" Z g4 K, n. }4 @$ i% q! Y7 P, i
# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项5 n8 {; X9 }1 A. K9 L
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server0 [4 Y1 I+ s( Y0 [+ }
# 因为他们的CA里没有这个扩展0 z+ @" V5 h" c7 p
ns-cert-type server
, j& L! g3 k& I( ~! S
' h" A7 v% G# y6 {# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1
3 e' j1 |/ @" k1 a" T+ u" }tls-auth ta.key 1+ Z3 r- E% K, X4 S# p7 |
8 p/ y8 g2 s% k- J$ T0 ^1 @0 a# 压缩选项,和Server严格一致
4 B8 i6 C3 Q) [& r% g& b, @comp-lzo
# |& Z& U0 ^( {5 V' ~+ m
; u+ m3 U" l+ ]! S/ I+ Y# Set log file verbosity. t8 T1 ]$ I ?
verb 4 5 C) J0 {, l1 r% s- w1 W
|
|