|
|
Server使用的配置文件server.conf: Q |: w5 F6 G- u, [" U
—————————–. q; E; j+ t; P) q. F
#申明本机使用的IP地址,也可以不说明9 L8 ?4 j, \- K" \
;local a.b.c.d
s6 W" T8 V" @! L B$ s" f#申明使用的端口,默认1194
7 y# C( v% X$ Q& l& }( X1 u; Rport 1194
+ I; T$ I( v3 L. i6 o; ?#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议
& D4 O) v9 n- A0 N#如果使用ipv6应改为proto tcp6或proto udp6; t( N* E, z2 S$ T7 D2 s7 {& T# M
;proto tcp
) F$ [# q; T, P2 J ?1 c& W# _proto udp
7 N# R C8 U1 `* q6 Q#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。
( v' i, P$ L6 A) n2 w5 E& Z#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备5 u; g) x9 k0 q8 [: F$ [; |! o2 N+ ^
dev tap
5 \( M) s% O: g) I6 ^5 y& a8 o+ T;dev tun
: ^- x/ M& e' @$ C% L: h- A- q#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法
2 {! U9 W+ }* z( {& f8 n qca ca.crt
" R/ ~ {: Y. k: G#Server使用的证书文件
; s% e' J" B) @5 acert server.crt
' V& |; B1 {8 `! U1 E& {#Server使用的证书对应的key,注意文件的权限,防止被盗
; Q4 I: n! J7 X9 h- Okey server.key # This file should be kept secret
+ ~5 i) [5 i. g/ ^; \' o) Y#CRL文件的申明,被吊销的证书链,这些证书将无法登录+ @6 I+ k' E b
crl-verify vpncrl.pem; ^/ f6 s5 [7 N6 |4 K
#上面提到的生成的Diffie-Hellman文件$ \2 P9 l, ]; {! n4 R$ m+ V- R
dh dh1024.pem
' U" @% I- E. M3 P#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由1 W/ d+ D; b0 a. Y% N" s$ ~
#这条命令等效于: T) G6 s" \3 n9 O. r
# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入, P" ]+ P" }1 f0 q( v2 M% c$ M5 Y
# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
. X/ Q5 M7 U+ f: S#- ]; o" L. f1 t6 p- w$ Q5 Q6 b9 v
# if dev tun: #如果使用tun设备,等效于以下配置5 W1 k& u- d" ` z
# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址
3 n: i7 _1 l: F" c# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址
+ b2 @( H+ i) P3 t7 r- g9 v J$ c, b# ]# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2
3 x! c+ L; F& ^) A& w% ^# if client-to-client: #如果使用client-to-client这个选项
8 n' f0 U! m5 _+ N9 K5 P# x3 U) f# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.11 O5 S" ~" m. Y" `% a$ a
# else, D% o6 `% x8 ^ u0 G/ R
# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1
& n" C; W5 p; y6 N6 C' t! h5 A#: j7 ?5 r0 u7 w
# if dev tap: #如果使用tap设备,则等效于以下命令1 w J1 {9 j K& N6 _/ L
# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址' Y4 j+ s: v& `/ y
# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码8 o( @2 d% p: }! d8 C4 `/ k
# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机
" [# B7 O$ p/ r5 ?$ J#: V" p. n3 C" T6 x8 H
server 10.8.0.0 255.255.255.0 #等效于以上命令
/ N8 A! M# s0 {% x#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,1 X" k" a/ g( |; r) s2 c
#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址
2 M( M$ I/ X" W, {& bifconfig-pool-persist ipp.txt
( e4 e* [/ v* U+ [: Q) R* A#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用$ o; q' r7 p3 N, ~4 x3 r, m
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
7 M5 P" b, w+ D' M5 h% @#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用
' {; t" s: F G! z+ |/ ~;push “route 192.168.10.0 255.255.255.0″% L! U5 o$ K) @: c1 J7 y
;push “route 192.168.20.0 255.255.255.0″
" c! e0 C0 k( q- d$ e7 i2 |#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
6 g- O! l* r( L, l;route 10.9.0.0 255.255.255.252
" U f. t( s1 I! G/ U! Q! t#Run script or shell command cmd to validate client
8 {6 L" s, M, F }7 G#virtual addresses or routes. 具体查看manual8 k S5 v5 q; b
;learn-address ./script
) y9 o/ Y6 C% U$ h- Q# w( w#其他的一些需要PUSH给Client的选项; j) X+ h# @, C" W3 P+ ?' C0 C# M4 I
#) Q( q8 f# ~. K }/ l
#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走" |5 f- R2 {) @' [8 C9 s' ]
;push “redirect-gateway”- }7 ~. e' T9 r+ M) l
#DHCP的一些选项,具体查看Manual4 }' x5 D' W* |, Q
;push “dhcp-option DNS 10.8.0.1″( {7 H k2 C' J% [3 `* E
;push “dhcp-option WINS 10.8.0.1″
; V. ]$ J- F1 \) X' L; M#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,
- j) v% B/ i+ s m) h. r#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
7 q7 [# c3 B9 O- G- Zclient-to-client
4 o6 l7 v* t W9 }- y3 Q) K#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA
& o* B% @. L0 v/ ^, V#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN
1 j1 T9 h/ L4 W7 {! O+ B;duplicate-cn6 f: ]% z0 ]1 S$ ]4 Z
#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,
9 Q0 ]- s) {% } O$ g#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
1 {4 l1 f% ?0 T8 O( _#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,! e% g% D8 U% N7 C) T/ J
#认为连接丢失,并重新启动VPN,重新连接
$ a2 Y. c; E# {1 O: d" \1 k) p1 f#(对于mode server模式下的openvpn不会重新连接)。
8 ]* l4 y4 ]6 p2 Lkeepalive 10 120* I7 V& O" V! Z9 m6 h& R
#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,
# n5 x* q& v0 }6 g2 J& @+ x#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1
2 v( t' H3 a- r: M4 `( R) |. [tls-auth ta.key 0 # This file is secret9 Y! z% \7 A$ z9 A V* e, p
#对数据进行压缩,注意Server和Client一致3 ~0 X8 M( j6 r w; A$ P! ?
comp-lzo
4 h( s* ^; C0 B- R3 h" L& l; d#定义最大连接数3 p0 c0 W- n9 ^) ?
;max-clients 100! {: P1 F# y5 |' }& Y2 ]" h
#定义运行openvpn的用户
. g( U$ a! b4 t V* Q6 fuser nobody0 f2 K B, s4 H
group nobody
3 F1 Q0 C E1 d. z' v7 v. u4 u' W9 `#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
) V2 k2 d3 ^8 j$ ppersist-key
" s& ?* a. e6 F: m! q6 _* ~- T#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,
2 Z7 }9 e9 O! Z#否则网络连接会先linkdown然后linkup8 x' b Z5 k+ P
persist-tun5 \9 x" T; _' g; v4 t
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
, z' e0 n: r7 l" `3 r9 f, e# \status openvpn-status.log
+ F1 m: Y" Y, _ \#记录日志,每次重新启动openvpn后删除原有的log信息
0 u0 X* s5 y& h, j" ^log /var/log/openvpn.log! `+ M8 v" s3 c+ X" u r
#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后
}1 m# i( q7 A;log-append openvpn.log# O e1 @" b9 }
#相当于debug level,具体查看manual
R, H: s4 `9 X& Y0 k- }' \* n, P$ Yverb 3, @2 s j) v1 b, |) ~4 x E
——————————-2 s9 I- S \4 g W
把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:4 C2 N4 y4 x* R' b
#cd /etc/openvpn
T. R/ `: V _( R# \" `#cp easy-rsa/keys/ca.crt .) f$ g4 F4 p7 j5 m6 A, ?4 {( x; Y$ j
#cp easy-rsa/keys/server.crt .: ?: {2 J' H, y, [/ G) g
#cp easy-rsa/keys/server.key .. k9 L9 y( j! w T: s8 T4 g
#cp easy-rsa/keys/dh1024.pem .# L$ I, j. K. R1 `* a. j- H U1 b
#cp easy-rsa/keys/ta.key .
4 [& t9 @, l _( c# b( z! W0 q#cp easy-rsa/keys/vpncrl.pem .0 L8 i' R- X9 Q
创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn7 W; v1 @* U' h# q7 S8 h) E) I
然后运行:
T1 ^( S J( n7 c) ~" A#chkconfig –add openvpn- j4 L8 Z. T! ?! y! l2 x! Z
#chkconfig openvpn on
: G3 I' W; _2 t* Z2 v% ?; U立即启动openenvpn
3 Q3 c4 j" R6 ^8 N2 {" J#/etc/init.d/openvpn start
9 w( r8 p: N0 B
6 h% d/ S0 W3 z4 b# u接下来配置客户端的配置文件client.conf:
! D; K$ D# X2 c& t: hLinux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key; } V5 }2 e: s$ b! D; M
———————————-
: g' y3 o' w7 b$ a% @# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”4 l; T. ]* @3 z
client2 E( Q9 Q ?( R2 g Z" E
8 _( B! r4 _) w" a8 J
#指定接口的类型,严格和Server端一致
" @1 J1 ]( ?% ~' p! jdev tap
3 `( W2 |; L; |. ]) D9 K% Y;dev tun
, `8 ?' ?9 A& D9 _$ K2 K* f# p( G3 W) P! k5 w0 D/ ^
# Windows needs the TAP-Win32 adapter name
7 C; q, O/ u5 p1 n4 U, ]# from the Network Connections panel( Y2 D0 `3 O4 n9 Y: d
# if you have more than one. On XP SP2,7 E0 S! F+ [% K% ^8 ^
# you may need to disable the firewall
5 V* @& Q+ u6 ^% c0 O# for the TAP adapter.
3 J4 w. i0 B3 X, h;dev-node MyTap
0 u% J1 H/ e. u v# W5 @* n. Z0 R
) ]4 [! F- f7 Q6 \ p; `( ] c# 使用的协议,与Server严格一致7 C) Y8 p) n- U' [
;proto tcp6 ]3 r0 Z! E7 |$ [
proto udp% }: W: h8 g" e# A7 z
d2 P) E2 x* V3 |" x7 w#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
( G" a% y' X' o' f7 u9 B J3 R& g( Y& Y5 @3 x/ S
remote 61.1.1.2 1194! X J! y, @9 P' ^0 v
;remote my-server-2 11945 {0 c% q3 t& h( H+ }4 [+ f
' N7 p8 k; T$ z- k0 @) }. z
# 随机选择一个Server连接,否则按照顺序从上到下依次连接
# L# |; r, _! f;remote-random
* n- B$ B8 n8 X5 }0 m" I9 }# |# K3 E! _- p u# l6 a7 d! V
# 始终重新解析Server的IP地址(如果remote后面跟的是域名),
1 x7 Z: Q' b3 ]: ?3 C3 b# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址' t* a+ S0 a. G- Q# c1 j) V
# 这样无需人为重新启动,即可重新接入VPN! r p- z, a) X1 p. i- i
resolv-retry infinite ], q1 T" C/ s# @; L+ N
5 M3 v! I6 g+ g2 P
# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要
[8 U0 C$ r$ C3 @; F4 l8 t unobind+ @# F. z G0 r% [
6 B6 ?3 D' c B7 d
# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作
3 I2 W- L0 `1 C5 Suser nobody
# }6 Q; f' v1 c: N1 }group nobody- ^6 v9 A( g _. [
$ i# o/ @; V1 c6 y#在Client端增加路由,使得所有访问内网的流量都经过VPN出去
* e. x6 Q6 k3 F8 N1 W#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
8 |* X* |; O7 b8 q @" j9 z# E G6 E# push “route 192.168.0.0 255.255.255.0″7 ~& V& C: D9 ?: s4 t% ]/ c
route 192.168.0.0 255.255.0.0! A- J! n) B. k* o, W+ |( W, R* }
+ o# t( s' L! _/ G# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备
2 Q! M! ]- G2 A* bpersist-key
6 I+ o" c& Q; }# _9 ^8 W( C1 Rpersist-tun
8 ~& y% `8 o' k# k0 w/ N( b, K7 f* d9 g. Z4 x h) L
# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面
6 t+ |! S( N" j' z! z5 A# h# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]
# z( n! {) W b' o9 M2 `: i# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual
8 A1 T/ e/ W7 ^;http-proxy-retry # retry on connection failures" G; t% o2 h7 c. M3 E( R/ B7 J6 I
;http-proxy [proxy server] [proxy port #]
$ r' m3 Y* @0 m4 V1 P0 [$ ?& P5 ~& l. Z9 b4 c9 ?& d/ l
# 对于无线设备使用VPN的配置,看看就明白了 E+ J1 f. B5 t; J2 v$ c
# Wireless networks often produce a lot
2 C+ v5 l5 A: ^- F; W# of duplicate packets. Set this flag& s0 i. r- V8 y) M" Z% y( j7 q/ ]
# to silence duplicate packet warnings.# l- E! E1 G' H' b+ Y
;mute-replay-warnings; Y# q$ C" W. D; N6 m* R' ^
0 D+ L0 O$ u( J9 v, s
# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件
- c, k/ X2 m* c4 oca ca.crt
; Z) T8 x2 w* U4 e# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。- i9 g( n% r% I+ Z8 \- Y
cert elm.crt
* t) X6 o8 ]4 y6 S3 \ Z" [1 ?key elm.key! H3 w, ?/ B, B. G, F5 R5 }
; J# T& P3 h, E$ ?' ^1 s9 o# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
/ z- m2 ~0 j" g+ x" c" l# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server
5 ]0 O' d9 p4 s( O! f1 B! \6 \# 因为他们的CA里没有这个扩展% `& Q: `' b" @3 x9 H
ns-cert-type server
, t4 m+ v2 q3 M6 ?/ F6 W
0 j9 L6 h% [' c# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1
3 i: d* W! P3 ]tls-auth ta.key 1* T* g- D, f- y7 k/ {
- v5 Z+ ?4 C( f- E% @4 K8 ?+ |8 u
# 压缩选项,和Server严格一致5 u" }$ A5 v3 u$ R
comp-lzo. O7 H0 F4 a( u9 [: O- r
* C& s: \5 z" j0 |& s
# Set log file verbosity.
5 y$ o# o/ j6 _% [; H# q* G; \3 iverb 4
, j$ d; Z8 x* E6 J" S, D |
|