|
|
Server使用的配置文件server.conf
( Z" D" D$ d2 [—————————–
# S, J! C& _5 H, n#申明本机使用的IP地址,也可以不说明2 ?* j2 c- J6 Y- s$ u5 s
;local a.b.c.d
0 w4 F- {; s. o ]8 Z. s* ?0 `#申明使用的端口,默认1194
. Q/ f: j& _& X0 Rport 1194# D3 J5 i0 s* k7 @0 R2 H1 B! ^
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议: J3 R% O* {; b% J
#如果使用ipv6应改为proto tcp6或proto udp6
0 a6 t4 q5 @1 |3 h;proto tcp
9 l3 o3 u6 Z4 j5 C: ^proto udp. {' W* F. V8 U2 S: S
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。+ b* _) t M2 f9 E/ k t" K
#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备( r, H3 D$ v3 a6 O$ R" h/ Z6 K
dev tap+ F# I) d" O) y8 k. l, M/ C& P
;dev tun' Y' k0 v1 r+ P/ {. x A: `9 e# U
#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法& Y( p% O5 }8 D; p$ X1 c1 s
ca ca.crt2 B' f' O3 \5 E" }+ b
#Server使用的证书文件2 M: E6 J2 ]: d/ L
cert server.crt
' y- ?8 y3 Y# S6 d2 s#Server使用的证书对应的key,注意文件的权限,防止被盗
, X% b$ b0 A, c- J1 S% Wkey server.key # This file should be kept secret0 ~! x9 t7 I7 ?" D9 j9 [
#CRL文件的申明,被吊销的证书链,这些证书将无法登录
5 b1 A: _ `! [! q- j9 Vcrl-verify vpncrl.pem. w, Y9 D6 B5 W" `
#上面提到的生成的Diffie-Hellman文件; v' u' \/ e/ K
dh dh1024.pem$ z" i8 O% e# E* r. M: ~3 c$ N" E$ x
#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由) w/ w* I7 Y8 E- a6 o
#这条命令等效于:. n t3 t, g1 u/ [; L4 C
# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入
( _/ G% W- Z) B7 n8 X/ O# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
' R, {* `5 |6 Q: P+ V#+ T2 u6 `( k3 ~$ v5 ]
# if dev tun: #如果使用tun设备,等效于以下配置* A4 d9 t! V0 E+ }" g
# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址( o- a9 ?+ G- \+ y$ ?
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址
6 C7 g5 @) K* {# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2$ g( x, S, r& s+ z. T3 l
# if client-to-client: #如果使用client-to-client这个选项/ F6 [4 `/ U: c! D$ h! m& C$ S
# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.1
5 B! n. D. O. D7 L2 D7 H+ @# else/ ^ A0 {* ?# Q( e+ X; E
# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1
# {1 D: G( ?: C" {#" h9 ^6 e+ [" |$ p
# if dev tap: #如果使用tap设备,则等效于以下命令
* R; L ?% u8 i: H# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址
3 v* w- x6 @3 ^: y3 r# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码5 ^2 B8 E% R' t& o n. ^5 t. P
# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机. J0 Q( o' F* J3 O, ]4 y
#
$ X+ [2 S/ L7 y$ \* Rserver 10.8.0.0 255.255.255.0 #等效于以上命令
2 T" m. }- w2 Z, z* }0 D6 I2 A+ n#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,
. b& d% o. T; F$ L#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址/ K& x9 i' ]3 l2 }% Y
ifconfig-pool-persist ipp.txt4 ~( T0 h' i0 l+ F) h0 Z
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
4 ^) P7 N: b; g8 ?( v;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
. P) w K' |( j, ?3 o& i% {% P#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用( \4 F( S; q1 P& i( c+ A g' {
;push “route 192.168.10.0 255.255.255.0″
' `- d8 a0 k7 ]: y0 T/ E: C;push “route 192.168.20.0 255.255.255.0″
) e0 }: J8 s. |; U$ f* \#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
% I# Z" y4 ]( b/ Z/ Z;route 10.9.0.0 255.255.255.252& Y8 g8 C% }6 d+ p$ Z& W
#Run script or shell command cmd to validate client
4 l$ G/ Z! z! B4 T5 l#virtual addresses or routes. 具体查看manual3 R! j5 }: |0 N* k
;learn-address ./script
' P8 v: y( T! H" ?, L; o, c#其他的一些需要PUSH给Client的选项. F- h4 m \) M- X+ v/ Z$ O9 }
#3 n! m# K" o0 d! Z4 ^+ ~
#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走
( `0 ?( \5 m- @5 X W6 r9 c: M" l$ S;push “redirect-gateway”
) Y1 h: ^: Z- A( ?6 x#DHCP的一些选项,具体查看Manual
; Z$ ]4 |1 K( X$ q5 T;push “dhcp-option DNS 10.8.0.1″
" D/ B- i. d' V: t% y;push “dhcp-option WINS 10.8.0.1″% T, p3 E7 O6 z2 S, s4 c$ l* C( n
#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,1 p: m8 l6 F0 ?9 X' I
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率: a. v: \9 z7 |7 W& N- {
client-to-client2 u' P" x, T& a# l. S' h. d9 s* p
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA
7 Y% |8 [# c2 G; L) H. ]#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN# {4 i3 K$ ?1 V( b7 {9 S
;duplicate-cn. {8 X9 ^4 ]+ u, Z: l+ e/ B, s N, l. @# j
#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,' T6 E& n, r& Y9 u- f+ u
#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
( O: {% {) S2 W8 J#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,
% @1 f2 r9 p' j9 a, d#认为连接丢失,并重新启动VPN,重新连接6 _$ w# k b# B8 ~
#(对于mode server模式下的openvpn不会重新连接)。
3 W6 A5 ^; M2 J E6 G: t2 tkeepalive 10 120 Z" v" a0 Z" \$ F" E, E' U
#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,8 `( Z# f5 y7 [$ k- @* z4 E
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1
7 ]" {1 d& U, ]0 w. v9 r! @tls-auth ta.key 0 # This file is secret
( c t/ i& \% C: M# s. o: l#对数据进行压缩,注意Server和Client一致; l# B. _, `3 \! F- D0 X
comp-lzo! F ^' M4 t. I. a/ R# u9 g
#定义最大连接数# a+ _: ^# [& d8 j8 T# m7 i
;max-clients 1002 Z5 ?6 U( |/ E6 ]3 ~1 V
#定义运行openvpn的用户2 `: c8 Q) f5 ~$ O, o. Z8 v
user nobody
* k" |5 ]& f0 e+ Z& e5 sgroup nobody5 H2 B3 N& O) M0 Y
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys: I: M! v# y) r+ A$ d3 ]
persist-key
6 K4 j- b% v! q#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,1 G3 Y& I+ {4 H. B1 { X
#否则网络连接会先linkdown然后linkup' H1 h0 D; `$ X4 a. ~- I z
persist-tun9 b; D) E( _% c$ L) q8 s! ]0 A3 z
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作* W' f3 w8 y( q" n9 u
status openvpn-status.log
' w8 T# Q$ c Y+ d( `; K! W1 p- e#记录日志,每次重新启动openvpn后删除原有的log信息$ q& a5 _9 L( ~9 `: A
log /var/log/openvpn.log* O& F, N2 T6 @0 [1 A! n
#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后) U) }* @! |" c! k& a! ^" n
;log-append openvpn.log$ P0 i& D2 X7 e
#相当于debug level,具体查看manual
* Z+ U K3 a5 h4 |% Kverb 3/ T1 l4 D* b/ a
——————————-
' q% K9 u }& L- j把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:5 t, I- F' X& T% \4 \" E5 _
#cd /etc/openvpn
* ?: \8 H( y a" q1 L, {, D5 g. t#cp easy-rsa/keys/ca.crt .
3 c- k- U% v1 w' X2 ^) e#cp easy-rsa/keys/server.crt .0 `6 |; G* n h, f4 T! {) |% K0 ]
#cp easy-rsa/keys/server.key .; ]9 x/ h1 E# J, d+ c
#cp easy-rsa/keys/dh1024.pem .
9 R; \$ {; n! g# U1 Q#cp easy-rsa/keys/ta.key .! J* H- M" q. f5 W$ r+ v
#cp easy-rsa/keys/vpncrl.pem .
. C9 R, x( q4 G" A创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn) n( U0 F( [) ]% ]
然后运行:, N F( c* b0 m/ A4 o g* I
#chkconfig –add openvpn
7 D8 I/ O; N0 [, P# D#chkconfig openvpn on
$ G, y3 j4 w5 @: V/ X1 U立即启动openenvpn" l/ j9 m+ G# c- b. e7 K9 u
#/etc/init.d/openvpn start4 I, }9 R% ?5 i& d F! f
. P! x6 b8 \! m/ I( C
接下来配置客户端的配置文件client.conf:
0 i$ {4 s; l; Z \- h; T0 d: iLinux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key
* N6 P3 t f2 g. e- g8 U; w; |7 t———————————-( L' H8 i: G, _1 F2 a- w
# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”4 L" W Y! e3 C/ T6 l
client
. q- I2 x2 S- O) O9 k# h+ h% T8 q3 h0 D0 ]
#指定接口的类型,严格和Server端一致) I6 a3 @. G( ?7 O' ]6 A
dev tap" O1 e. Q A1 b% ?; A0 Y
;dev tun) e9 t% H. I2 O
7 v2 R2 C" p, L1 V% H0 d0 i# Windows needs the TAP-Win32 adapter name- S' O3 w2 ~, J- F+ ?
# from the Network Connections panel9 q. r: U/ ]) i
# if you have more than one. On XP SP2,. x7 F, k& f1 B K# u$ N
# you may need to disable the firewall' ]8 `0 K: K: [4 E5 w8 q) |- E
# for the TAP adapter.8 i% l2 |0 ^1 I. g) p! @7 q
;dev-node MyTap
* \/ v9 p2 c! y1 x5 e2 i4 ]% Y% N1 K2 _8 U$ ~
# 使用的协议,与Server严格一致
2 p. l7 b$ P7 D! v; J# N;proto tcp h7 x v# _2 B+ K5 _" H
proto udp
( K0 V2 |% P' H1 T) t d2 d. W1 V3 z. O/ ]9 l, c9 A/ z" A
#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字/ X4 H# P4 g, i
9 s# F! y D1 G7 p3 G- L: s8 i. W+ Bremote 61.1.1.2 11944 T4 f' u/ R8 \. v0 A& }
;remote my-server-2 11948 }7 U) @0 u j9 k& V9 M8 c3 g
: v9 G) ^; \8 N- X6 v' C
# 随机选择一个Server连接,否则按照顺序从上到下依次连接$ s* \3 N& j4 Y- e9 ~8 g! c
;remote-random
5 ?2 t! X. p& I6 x& F% J; `, q. m- J% R& o* u d+ T" a* s8 g% ]+ i$ x) o
# 始终重新解析Server的IP地址(如果remote后面跟的是域名),- p3 j% f# t5 w
# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址
3 A- f( @; e R1 k# 这样无需人为重新启动,即可重新接入VPN
* f# a: m# O: L6 T, @3 Iresolv-retry infinite: F1 U. b! T, \
' R; k2 D* L5 V' W( A* T% N3 c# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要 F% U0 \. R# w: U
nobind
: D+ w! t& v7 l. Z6 m2 C) O+ ~1 m3 x$ {1 {1 [8 Y8 K/ ]5 P
# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作 u& z, r8 |. N4 P% L9 B+ x& v
user nobody! a( f- d- n" \) q2 U) ^
group nobody
$ @1 e& O9 ]9 `0 u" L" J( w. x `- Q
#在Client端增加路由,使得所有访问内网的流量都经过VPN出去# q8 y: H( o# a2 k# h0 `( f. }
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
; z) v- v- v4 w* H" V/ m* O2 L# push “route 192.168.0.0 255.255.255.0″ o. v3 u- Q7 P; p( G0 }4 @4 j. ~
route 192.168.0.0 255.255.0.0
) `: C0 V+ ~$ L* l; w; s: e/ B3 p. z5 w6 E: G2 B
# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备
: e3 F! Q9 W) F8 \, \, W- {persist-key
6 f# n4 U0 \1 T. _8 W7 a- w9 A; Opersist-tun
, T: ^, A' z4 `" c5 h
4 K7 [4 j$ v$ T7 `+ G0 o/ o+ M# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面* ?4 S2 D9 z- ]; `) K5 J& R! @
# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]* Q2 s, l$ s, |9 X
# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual; p+ {8 ~- S; v+ F! s X
;http-proxy-retry # retry on connection failures$ e$ g& w" W) {
;http-proxy [proxy server] [proxy port #]9 \6 F' Y. a- f: n1 M1 T0 ?
: V i) d3 x5 B3 K# 对于无线设备使用VPN的配置,看看就明白了
) _ d2 L4 }7 v' x# Wireless networks often produce a lot
4 _+ c7 A3 O' G$ o2 R5 @) v# of duplicate packets. Set this flag
2 \6 {; g8 \0 F" Q1 d, h8 X# to silence duplicate packet warnings.
- l& s, A/ N# h;mute-replay-warnings
* \( Z. U0 R& I3 [$ f' V2 |+ t: J% U# g
# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件# c' u/ H) Z* v- W# O
ca ca.crt0 r; } g v( U" [' [
# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。' R$ P' s+ G5 K3 K: `- m- P7 V4 e
cert elm.crt
* K4 x* s7 M; Ikey elm.key6 `) Z+ g! g" ?. Z6 w
( K5 n1 m0 ^8 |: s: U! S
# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项( x: L3 Q. I$ d$ r% Y
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server2 ^; g, R6 n+ T N' U$ Z" Z
# 因为他们的CA里没有这个扩展9 }, Z0 e# F, [ R
ns-cert-type server( Q C K; P: ~7 r+ E
8 O4 U2 t% E w" W5 E; ?! v
# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1
+ d7 m9 z/ A/ G0 g9 @* H r: Ytls-auth ta.key 1, e1 b2 ~. O& I) v/ w0 C
& n3 B2 B3 j3 b8 J
# 压缩选项,和Server严格一致" Z4 e) M" b1 r! M I3 O
comp-lzo
" n- ^, |4 X: i: L3 A @8 Z
1 Q& w# e4 [4 E$ Q! ~4 U' d# Set log file verbosity.
' L4 K0 ?& d$ c# |5 S% q! w2 yverb 4 u( o; y: d0 `: A
|
|