|
|
Server使用的配置文件server.conf# x9 G. N+ ~# K: A7 y
—————————–
6 S- s1 {% G ]) y4 }#申明本机使用的IP地址,也可以不说明0 ?- N1 i4 a5 F9 Y/ Y& R
;local a.b.c.d% u' Y7 R+ [! I
#申明使用的端口,默认1194
L0 q( {% X f! Aport 1194
4 p( u( ~- L$ O2 p#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议
0 f- [5 I' T6 P#如果使用ipv6应改为proto tcp6或proto udp6
! R" V8 X' T* t;proto tcp & x! s" z0 z7 r. s8 [' C; j
proto udp$ t( n5 r! f" _# m( r" S6 ]: t1 o
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。% W0 z* Q* p4 _% z, P7 m
#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备 F, W4 [- _- p$ u
dev tap
4 U+ v2 }/ x$ z& M;dev tun
+ H9 I1 X" v% m; ?' [' r#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法
' F# s1 h1 W2 f1 Jca ca.crt* x. H7 ^+ h& N/ w8 o& a4 O
#Server使用的证书文件4 G, ?: G) Z/ X) q& e
cert server.crt( ^* c* O; Z: J. K1 h1 F6 z5 [6 @
#Server使用的证书对应的key,注意文件的权限,防止被盗
Y' s7 P" ~" }: t( u5 Jkey server.key # This file should be kept secret# [1 k9 m3 i$ v$ B- ^
#CRL文件的申明,被吊销的证书链,这些证书将无法登录! G7 |/ B& h8 z) ?( b
crl-verify vpncrl.pem) Y4 R3 I$ G U
#上面提到的生成的Diffie-Hellman文件0 ?" k" R. g! R2 h2 I4 u) ^
dh dh1024.pem/ @* X! _3 o8 a
#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由, L2 E; y$ P# X: t* Y- l
#这条命令等效于:
! T- x2 h5 w8 u; e4 p. j6 X& h# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入) @! d2 W7 u E2 K
# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
+ y) B8 ^6 a3 Q9 X#7 F/ A0 P$ T _3 `3 K* O9 g
# if dev tun: #如果使用tun设备,等效于以下配置# M$ H* t) }9 m( g* u
# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址
/ O, P: @" F& I# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址1 ?# j0 I0 B3 E4 ~
# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2$ K5 V( N0 n. k% ?, T0 d
# if client-to-client: #如果使用client-to-client这个选项
2 z L T4 I8 [4 V; [- V! g# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.11 ?( u9 Z, H$ k; p0 c# h8 r8 X
# else
3 w8 ]% i8 G! z0 D' K# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.12 w9 h; a. `5 P T# j4 B0 |
#
- D3 O/ y2 {0 w2 X. G+ |5 v) k# if dev tap: #如果使用tap设备,则等效于以下命令: P- u6 A, u y- D) r' t- [% u
# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址) J% |' ~1 @6 |" ^
# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码5 r$ ~; g8 [3 o* ?
# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机
' ~: ~' f; W: e#; P" f$ _+ x# F
server 10.8.0.0 255.255.255.0 #等效于以上命令
# D/ g$ h# ~, p% S$ C7 y" x: B#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,
7 Y4 Y: l; O4 j: I2 ?9 h#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址2 B1 e. i r, ?8 ^9 ~* {* \
ifconfig-pool-persist ipp.txt
: ^- f' ` l0 C5 |& C#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
6 ]7 [, e1 H, j;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100! x4 Z$ l$ O! t/ P6 S: V
#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用 x; q* X) j% |; B) G6 l4 F) z
;push “route 192.168.10.0 255.255.255.0″ w d9 J5 z: v9 m1 E
;push “route 192.168.20.0 255.255.255.0″
/ Y v0 k& q" [$ K, r#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
F5 Y; t0 j6 E8 P;route 10.9.0.0 255.255.255.252
2 W" A+ Z; `3 t0 J" @% k#Run script or shell command cmd to validate client
: }: x' ~3 J% @- D) |3 y; Y#virtual addresses or routes. 具体查看manual
. K" x# C; r. C9 D0 {. y;learn-address ./script( q( u2 \. ]0 S& ~) S3 F. [9 O* D
#其他的一些需要PUSH给Client的选项. J( d: E3 h7 ]7 X5 P$ P$ [/ p
#
" b" } {/ o9 s9 Y3 R1 c3 v- z#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走
/ Y$ U) c0 j) E8 I* _;push “redirect-gateway” Q" K4 b2 ^* o5 x4 {5 c4 K: {
#DHCP的一些选项,具体查看Manual
* o" l$ I9 f8 v$ q% p! h;push “dhcp-option DNS 10.8.0.1″
* n% Z6 j7 P, J ~1 l% c! z;push “dhcp-option WINS 10.8.0.1″
) k+ ^" a8 x5 _7 }, t#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,5 \5 l/ Z' H. j. c) ~5 ~
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
6 o0 o4 C7 O: jclient-to-client: h2 G( }* u8 U: J" S. m
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA( y3 b$ `; F( ?5 d2 L, ~4 r# @
#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN$ b4 _4 {, v; A) \# c- A2 Q8 F
;duplicate-cn
2 ~- _ d; M& u( x; g4 E- c#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,
3 ?9 S" `" A# r; b#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
; ~" u$ Z' v: p. \1 z#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,
4 P; L( N; l, }4 }5 A# @2 @#认为连接丢失,并重新启动VPN,重新连接
, f) {8 s9 J4 ^, G5 N#(对于mode server模式下的openvpn不会重新连接)。
% p" [! I4 W; d2 Z% p% S0 qkeepalive 10 120
5 `4 n: x. r4 a. e- c0 x. B I#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,
9 v8 h6 Q# d# K#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1 T7 }2 g% _( k* ?& y
tls-auth ta.key 0 # This file is secret) K$ P7 z9 _% N4 _! v0 F
#对数据进行压缩,注意Server和Client一致' D9 l1 t' z) H9 g* v% h* ^9 k' q! \
comp-lzo; x- s* P) g$ h
#定义最大连接数
% E X1 \3 G; A# {* ^2 `5 |;max-clients 100- N3 F* C0 }: {+ U, q: o
#定义运行openvpn的用户" o2 a1 m2 q- B- I! \$ m
user nobody; ~5 _5 V6 G( h1 v# z
group nobody- i' K' e% }2 {, b+ H: _
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys5 S) ?2 _+ s! q w
persist-key' I9 U) q: u3 s, ]: t# N
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,6 j2 R6 r, ^4 w- f
#否则网络连接会先linkdown然后linkup- N+ r+ [& [* o$ V) u l9 S$ E
persist-tun
9 R6 k1 ]. ?! q, M: [3 Q* ^#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
# a% z4 H" M. b" ustatus openvpn-status.log' e6 Q6 ]. f, K2 Q; o
#记录日志,每次重新启动openvpn后删除原有的log信息! Z( M7 r& E: O
log /var/log/openvpn.log
* z+ L+ b$ a% W5 s$ H#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后 ?# L$ z0 Z. K. Q/ d
;log-append openvpn.log
1 m0 _# u. Q& s0 V) T#相当于debug level,具体查看manual- x/ j9 ~' ?- G2 c c, e
verb 3
( @% N0 H* O3 g: P( A# S——————————-
3 X6 g5 A. f# u& {- p. e把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:
3 @: x& c) _/ @: w- ]4 Z r$ i$ M3 k# A#cd /etc/openvpn
6 B2 Y7 {, a A) ^% S#cp easy-rsa/keys/ca.crt .) D, ?) R2 D: t8 v$ L/ C
#cp easy-rsa/keys/server.crt .
0 Y. X& k6 w# @, W# E( H" Y' \/ a: K#cp easy-rsa/keys/server.key .( {8 q$ b; v7 z! ]+ E
#cp easy-rsa/keys/dh1024.pem .& ]4 q7 [- B h* ~6 k- E
#cp easy-rsa/keys/ta.key .
9 J) {# r# ]! [5 n#cp easy-rsa/keys/vpncrl.pem .
: H n4 z; K5 a创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn
4 E9 y9 K* y& u然后运行:9 q$ Y$ g; K4 U8 }8 e2 X
#chkconfig –add openvpn
% ]% v1 i/ R: {. l: P8 \5 J5 g#chkconfig openvpn on
|5 f5 z9 r; z2 O立即启动openenvpn
/ S( G. r9 F/ Z# }' f& o3 l" b#/etc/init.d/openvpn start
8 v) i6 O$ ]6 ^, u) u/ ?( ^0 S" h( M; q: Q }, J1 p- G
接下来配置客户端的配置文件client.conf:4 W" e+ J6 f# A6 _
Linux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key
" s' |, K% @: m2 M& k" H8 F, w———————————-
7 X, h' W* {( P+ t# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”
# ?9 W, ~% i3 vclient8 ]( m2 N5 s; w( z
: V z! W# c, \3 W: B' _8 Y* ~
#指定接口的类型,严格和Server端一致) z; ?$ L% c5 Q. O
dev tap# ]! D+ U& U8 q" a
;dev tun Z9 k; ?& G' K
! j5 _0 F0 O. W1 q$ N
# Windows needs the TAP-Win32 adapter name
/ d; N; ]. l7 Q: c7 K# from the Network Connections panel" l' A# F u- L, v4 \+ X5 ]/ V9 I
# if you have more than one. On XP SP2,
0 D7 O, i, T3 d5 [9 l3 R2 F+ `# you may need to disable the firewall* ]- g3 F" s4 M* p4 R% }5 F
# for the TAP adapter. e. j2 T! i7 F4 D
;dev-node MyTap
0 X1 c w; B& R6 \' q; g! a$ r# }- [. P9 N
# 使用的协议,与Server严格一致
! J7 d8 G/ q7 Q8 ?2 K;proto tcp j1 ]8 `, z( l/ X: \2 n2 K
proto udp5 L# j7 @* C9 V6 U. R& Q2 `2 s8 J
+ g) M) h7 F: D/ f; Y
#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
& |' e4 B5 h) r% y8 M9 {: l' F# @, H/ K5 ]% W2 K7 ^
remote 61.1.1.2 1194# f6 u' K3 f7 t$ z% M6 T1 m
;remote my-server-2 1194) n( l, N) O3 B$ R9 M) J3 l8 U9 f( T
Z! d" C! @, R
# 随机选择一个Server连接,否则按照顺序从上到下依次连接* z4 c( Y& [$ x2 e
;remote-random) K5 h. c9 e1 _2 {
2 {) L8 ^' T0 e# N# 始终重新解析Server的IP地址(如果remote后面跟的是域名),
6 i5 M/ p4 i L, H; s( ]# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址# g, Q4 `- e0 b h# ~, n
# 这样无需人为重新启动,即可重新接入VPN0 D' m$ e3 L2 f8 r$ e. Z3 u0 ?0 u
resolv-retry infinite8 g$ x1 P- G' \' a F4 w7 N
5 D, J7 ?( u. T1 ]: L+ a/ f# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要0 {* a) |9 W6 v9 r# d* m
nobind
# O& O6 |( k$ |3 o9 {2 p5 w4 |
2 K, O) c! t3 M8 E# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作. ]7 e- y2 U3 g% ]0 B5 V- f
user nobody
$ `# }, E+ X1 N) f1 @9 u! G7 K; }5 ]group nobody! P% e0 ?+ S! r8 e- H- ]3 P1 g4 I
/ r+ @+ D9 _3 u) c" Q# g#在Client端增加路由,使得所有访问内网的流量都经过VPN出去1 P8 {/ s/ m, I% \
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
" I8 v5 I) k1 K$ t# push “route 192.168.0.0 255.255.255.0″
( H7 h, [- n. }) X" k! e1 Eroute 192.168.0.0 255.255.0.01 _- q- K0 p5 x0 I
* [7 w1 C) Y, j. L! x$ S
# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备) l& o5 `7 e2 I4 Z! s& j
persist-key3 x+ ]7 T+ v5 y5 V) e$ j8 j
persist-tun
& U' t/ L7 F' W* {6 ^2 i0 |
( w; k, K6 v u9 \. X( i# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面
( ]# e( K* G9 o" c' R' Q; s2 t# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]
, {, s( \$ x4 R0 A4 @' [8 j# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual
# u% a& j6 p! ^3 D;http-proxy-retry # retry on connection failures) ~* y" t% t+ J9 ], l
;http-proxy [proxy server] [proxy port #]
' Q. u! Z) w5 X( C, R0 h: {9 i. d; {) K9 E& B! @
# 对于无线设备使用VPN的配置,看看就明白了
4 O' F' g0 F: }. E# Wireless networks often produce a lot/ v ~6 E: O& I4 g- V, ]
# of duplicate packets. Set this flag
1 S( H; }' n+ ]" N" d& r' R# to silence duplicate packet warnings.# J, h* i" @" m, ~! p
;mute-replay-warnings
6 j5 x, p0 ~ x3 a0 c6 {
9 @+ D( D/ f: ^) d6 H& k# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件
8 w# Y$ |- ]( lca ca.crt
* U& c# e& Z8 c) z( S4 V1 `7 }# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。7 y% ^( D* l, Q: W! ~3 ~9 ?1 B
cert elm.crt2 t6 c- b- ~) j) G" _
key elm.key
6 U0 V1 z6 W1 P2 e+ }) U; _0 p4 y; }7 k' e
# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项/ n* m2 O7 b- u
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server( J9 b/ G6 r- ^
# 因为他们的CA里没有这个扩展
( g1 T* |% `! l( ~ns-cert-type server
n. l2 B0 A7 P" ]) e( H
" ^0 v! {$ u3 L' t& W1 W; u# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1
; F, B! }, J+ M! a: Gtls-auth ta.key 15 {5 G+ S f+ q' {* u9 O* u b
2 m. }1 k1 C( D" M" f5 m# 压缩选项,和Server严格一致, F$ q8 D2 \+ |2 Z' ^8 ~
comp-lzo
% F0 b$ ]8 K' I: E. q( D2 {: I9 ?; w( m3 a
# Set log file verbosity.8 }* c( T, O Z* N. l
verb 4
. L6 S' X" _9 p3 z. G6 f |
|