|
Server使用的配置文件server.conf! a d7 j" W: s# |) a6 G
—————————–
P- A2 d; a% t- v#申明本机使用的IP地址,也可以不说明1 B5 F: Q N. B. _1 b4 O
;local a.b.c.d
! L n# E. h7 M3 C2 c' e- J- l#申明使用的端口,默认1194. H( y; a: u8 S' Q; O$ H. g* |+ _
port 11942 }. a% v+ Z* w' r1 P! y8 Z5 R, Q
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议. M' {* p0 X! t* q) E( q2 L
#如果使用ipv6应改为proto tcp6或proto udp6) x/ z; U& g. l" ^7 d& F+ e! L+ Z
;proto tcp
& I# Z& G0 @" G9 w5 |4 Uproto udp: P3 o1 W( M; P% W
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。% p2 | u% H1 V: E
#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备
( L! k: h. ]2 s$ \+ O! K! ~dev tap" T: s$ b: W; y, S4 S2 p
;dev tun
, F* t% Z0 r" }. M1 Q#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法% n$ w8 p* b: V/ x* o+ `
ca ca.crt# R7 u: N6 z6 C9 j& x8 G$ H7 |$ K
#Server使用的证书文件
, c) C# d1 x6 Ocert server.crt
, T/ I: A& ^8 y8 t#Server使用的证书对应的key,注意文件的权限,防止被盗- m0 H# J) g; L8 x5 @
key server.key # This file should be kept secret
7 e: i% j. m5 J. S0 S/ Z) t1 _#CRL文件的申明,被吊销的证书链,这些证书将无法登录
, {( _8 \" T" ncrl-verify vpncrl.pem' U8 U7 h. @1 V( o
#上面提到的生成的Diffie-Hellman文件6 S+ s6 T8 @! S, g# P
dh dh1024.pem2 n! w5 \& j* |+ g/ z
#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由/ m4 U. b) Q8 L+ S- s$ T
#这条命令等效于:
& f6 d+ I9 ^% g! ~# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入
; N/ H5 x, C9 E3 v t, z, t" T# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client b% ]$ ?, b" n% Z4 l
#
1 n/ f- F9 Y% L7 j! X0 `# if dev tun: #如果使用tun设备,等效于以下配置
. e7 u" b! y, a4 k+ w$ ~( {6 C# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址) F, U Z% v( q0 ]& Z; I
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址
c4 X! N: M! T5 ~# A$ L# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2
+ v& G" ?0 A3 k- S# N* f+ l# if client-to-client: #如果使用client-to-client这个选项
- z5 q b4 A: W5 K- F" O# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.1
1 H% _* [# ^+ n7 ?2 R' M# else
( C$ N% d6 I% P: b# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1
1 c7 M! I6 p4 G J; |#: U/ \ a7 o0 T; U7 i
# if dev tap: #如果使用tap设备,则等效于以下命令
6 Y$ G& b" J4 Q& P* |* A' A7 r- w, @# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址% w, v1 K& {) o, b2 U) D
# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码* x. i0 ?9 n$ s: \! u% a8 U) P
# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机
9 }5 D+ i; n( ]3 }#* _) V3 N! X: B- f1 e0 E1 `! z' g0 R4 A, p
server 10.8.0.0 255.255.255.0 #等效于以上命令
* g; m6 |2 }+ ^6 M1 @% M#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,( K1 Y- W: W6 ?6 Y7 O9 @- a+ g3 G
#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址
3 U. H+ C. q& v/ Pifconfig-pool-persist ipp.txt
2 F2 V7 ^) a! x' e#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用! a5 K; \+ E* U. S8 o3 D K
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100- ?( |% y0 B3 U7 p+ ?! U
#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用6 F5 c* H% s4 |* m I* F$ ^- X6 C
;push “route 192.168.10.0 255.255.255.0″
- E; H/ j7 ]9 Z& K1 j2 e;push “route 192.168.20.0 255.255.255.0″
2 ?2 B4 ?( J, \- E% |6 Q$ e#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除, a- p: {8 Z3 I4 } d# M
;route 10.9.0.0 255.255.255.252, p2 f+ y: u0 `) @$ c) O; I
#Run script or shell command cmd to validate client
n5 T) k d1 ?6 w8 A#virtual addresses or routes. 具体查看manual
% h1 O/ q5 u; j8 P" _& W: b: P0 {0 G;learn-address ./script
5 c/ q6 [' I$ |# a, L$ u% L6 ^0 ~#其他的一些需要PUSH给Client的选项
: O- v5 N3 z7 M0 j* C# Q9 N& ]* A. n
#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走
( L- K* |; y% g3 I, V* K: S. L;push “redirect-gateway”) m4 @& k% k' D" ~8 d6 B
#DHCP的一些选项,具体查看Manual
: p( k* `- U; i1 n;push “dhcp-option DNS 10.8.0.1″& q' ?5 X! Z6 D& W: K
;push “dhcp-option WINS 10.8.0.1″1 x7 C4 |: W' [! C
#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,% k( B$ b% h& @) Y& d* ?9 o
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
( _' H2 K }; L, ]0 u4 `client-to-client$ d4 w/ B+ H1 q0 e4 q
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA3 O3 m" u; A: F3 w& @- c- Z
#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN
, ~5 Z' Q5 w7 Z8 U0 M;duplicate-cn
- T6 [& O. @1 }% |7 ]#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,
0 B3 ^! ]2 [% ?' [$ M" N#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
/ \. H8 q7 S0 f8 A3 w#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,# E; l; l$ N: h8 T- a$ R
#认为连接丢失,并重新启动VPN,重新连接: F( ^* x3 w8 l4 Y# S; w/ l, e
#(对于mode server模式下的openvpn不会重新连接)。/ e o5 @! Z9 Y9 Q$ h4 h3 c
keepalive 10 120
: [5 |8 o* L# c' ?) t4 t5 t6 d#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,- S4 J, x" {# n% B- G
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1% }* @: x$ j* E% e: x) O
tls-auth ta.key 0 # This file is secret. V! `' w/ m1 D _$ Q/ i6 a" Y8 y6 d" [
#对数据进行压缩,注意Server和Client一致( i- ]: M# o @) p
comp-lzo
- i, e, E# d7 E: i#定义最大连接数* S+ c3 l4 H, q2 }/ `/ @) J
;max-clients 100% d" S9 N6 c; x& J0 u# ~
#定义运行openvpn的用户! A+ Y, }' g$ ^/ R Y
user nobody
9 ?+ P. H6 W, V+ e, \/ ^4 vgroup nobody
* F" Z8 C" A6 u Y#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
* i! z3 |3 `; q0 M# Q3 lpersist-key4 u$ n7 }: s# P0 }
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,% p' P: U9 j; J' H. ~6 Y& T
#否则网络连接会先linkdown然后linkup
9 X+ f: p4 a0 v! @1 x" |persist-tun( V- I. e" ?+ t
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
( ^" v# i6 H- Q `0 M; A& x2 J+ {status openvpn-status.log: m. g0 z' b' m9 F. w( q
#记录日志,每次重新启动openvpn后删除原有的log信息
, Z) P4 H9 c" T! J' d" _log /var/log/openvpn.log
0 u* Q* H1 ^1 Q* l#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后+ u2 W0 k+ `/ I" `
;log-append openvpn.log7 a3 x5 v2 f+ W2 L5 r8 z
#相当于debug level,具体查看manual/ ?8 F0 I. o5 x& A' H, z9 p
verb 3" X1 b7 U8 G0 i8 M
——————————-4 q0 w0 y; ^8 `3 N, Y
把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:3 G9 X4 \+ w1 g( }+ g
#cd /etc/openvpn
& W% L+ ?! m" v* G8 f#cp easy-rsa/keys/ca.crt .
s# `( y" o5 o l6 F2 J" v0 k#cp easy-rsa/keys/server.crt .
* `3 } e& D4 \6 Q$ \2 ?& @! e#cp easy-rsa/keys/server.key .3 m; G! \$ `+ M1 q
#cp easy-rsa/keys/dh1024.pem .9 u9 W3 G0 V! d1 q2 e8 D2 [
#cp easy-rsa/keys/ta.key .7 q' ?9 t) `2 ]6 [/ e4 Y0 V! U
#cp easy-rsa/keys/vpncrl.pem .
" V4 C, N" f( s2 S) a5 D0 U8 ~8 X创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn1 ^( m; o. K. k, i
然后运行:7 a6 N% S2 h$ ?! f& {4 u: t
#chkconfig –add openvpn+ P9 O9 i) R7 m1 b
#chkconfig openvpn on" K4 _3 j. q$ N& e' d5 j+ c
立即启动openenvpn3 P9 Y" o3 _, P8 L; Q
#/etc/init.d/openvpn start" b4 |. J0 B3 D+ K, \5 @" [
4 K( |- b# G Y) e5 O' Y2 j接下来配置客户端的配置文件client.conf:
4 Y* p4 I/ a% \2 m5 S T4 j. |Linux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key
5 e, l( j$ G1 s5 c4 J———————————-& S5 e5 y+ v0 R
# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”& L( c1 n2 z! Y# A
client* y8 @0 P2 T0 T2 b3 o8 }( K
9 U0 P' ?& z, {* O( j#指定接口的类型,严格和Server端一致
& W" S( l; q' Z8 N: E9 R$ ?dev tap
$ E# ~) F. B, V7 k# c;dev tun! h: V, Q; R7 z( Y5 s# ^2 |
2 W" t! D6 b4 i) ~, \. Q
# Windows needs the TAP-Win32 adapter name' \8 Z: ~$ ~6 \! _$ j# c
# from the Network Connections panel9 `& t/ E5 m: I
# if you have more than one. On XP SP2,
( l, ]% t6 G1 ^+ b" e% A# you may need to disable the firewall
& ~. i, d2 o+ a! y# for the TAP adapter.
' |; S1 ?, {4 B2 Y& m;dev-node MyTap
/ R- [2 S+ J w! e; g6 a
. M- u+ W' a1 Z. K) p0 e# 使用的协议,与Server严格一致
3 W8 Z1 b4 N) z* Y) q;proto tcp
: g) B& t) b) Iproto udp, U3 z7 m0 j7 `5 A# ]* f, f
0 Q) n7 l* b7 I#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
5 o E! ?7 Q8 v4 g7 a+ K( V5 R! C: _8 N h' \& F% N4 k
remote 61.1.1.2 1194
7 b+ [% i) ~" o8 [+ y( |( j;remote my-server-2 1194
5 V$ k( c7 {+ F- Q) r, S6 J* p# k8 s
/ t# I0 o( F: P9 H# 随机选择一个Server连接,否则按照顺序从上到下依次连接
O5 z$ A9 g3 l- U/ t4 J/ _' o;remote-random
# o8 [2 w% F% }( z: \7 w
& L, J2 ~; v2 j# 始终重新解析Server的IP地址(如果remote后面跟的是域名),0 X: A8 g3 }6 S F# l
# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址
3 m0 i6 R& f6 I8 u+ o$ M# 这样无需人为重新启动,即可重新接入VPN5 a. A" k6 ~( P( |9 c& _
resolv-retry infinite
. M( i/ h0 x2 r A; {
. K$ Q" p% _! _# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要
$ d* W( Q+ Y' F8 ?8 gnobind1 N, Q# J4 Q4 I, X
' C0 o0 L0 e' W- R% O. E4 A# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作/ L: A& u" @5 D3 v
user nobody
5 V8 o5 s' X. W$ agroup nobody
* h- T+ H5 y# E) ?" t* a7 s0 B0 \; A. y- P/ v) v6 ?9 a
#在Client端增加路由,使得所有访问内网的流量都经过VPN出去
) I8 f% b0 _0 A; E% T#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
k) S5 }7 d' n: v- j# push “route 192.168.0.0 255.255.255.0″, N1 q( i5 _6 u
route 192.168.0.0 255.255.0.0
$ W6 B# i8 A1 J0 S9 ~8 n) {+ X& w2 W n# h
# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备
# {4 y: d" h7 O/ j4 \persist-key+ n3 i( i% Q. U( P: @
persist-tun
: b) z' m6 D9 M" t/ C+ E
b" g; t W- `# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面 j$ J9 d; v7 L
# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method], H- h9 E5 C/ k% S* \
# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual
! B2 n: q' U m1 H5 k% A8 A+ j;http-proxy-retry # retry on connection failures. s2 |4 j! B8 y
;http-proxy [proxy server] [proxy port #]: q3 e! l$ _7 W' Y7 e1 g% p
; j9 Z; S; e9 N! X8 O$ r3 Z0 E* n# 对于无线设备使用VPN的配置,看看就明白了3 F h. I7 o5 T4 J7 s5 `
# Wireless networks often produce a lot
7 ]" W8 W/ p& F9 N3 D; k# of duplicate packets. Set this flag% E1 u: p& X, P0 q$ h
# to silence duplicate packet warnings.
. i8 ? g3 r! y6 A: P& m;mute-replay-warnings
7 k2 Y% D+ f7 V' ^8 M( M1 B5 z/ _. v: F) N
# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件; g4 L6 f% g$ W3 v3 {2 t1 m
ca ca.crt
4 U" A. x E6 `6 m! M8 R# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。
0 B* S9 G% |" Jcert elm.crt
! }, `0 k5 t# }% b# V" fkey elm.key
. M" M H( P/ z' [
' ]9 N, L1 J; k% {# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
# l& g, ?6 R( N% N/ R$ ]# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server
. S6 O- B0 b& C! a9 T& `# 因为他们的CA里没有这个扩展( }( u: ^! }1 a& e7 ^1 A0 o
ns-cert-type server" v1 O( w9 z, T8 t3 [2 ]& y, C
) S) S& W; B3 |& c& P
# 和Server配置里一致,ta.key也一致,注意最后参数使用的是11 X6 {& G, R+ z9 d: m; G
tls-auth ta.key 1
$ t, v6 n& J% R7 u. H! c& A+ ^& `5 T& v5 n4 J
# 压缩选项,和Server严格一致
8 C" B/ y( z2 t% B4 b! j4 ~- v$ jcomp-lzo* x {8 K1 P, w" u" K
) Q) A' Z; Z8 B& h# Set log file verbosity.
# f A' d C: a' Y$ I ^8 Pverb 4
3 K2 s; f7 b; a( E' s- t |
|