|
|
Server使用的配置文件server.conf
1 L1 T; [/ X% ^—————————–' [0 e1 L; z @/ ?$ \! ]
#申明本机使用的IP地址,也可以不说明5 W1 q8 z( a* g L0 E; Z
;local a.b.c.d* ]" N0 E9 \1 Z) `; O, z
#申明使用的端口,默认1194" X+ ~# F) Q; P# v& Q- t% h( X
port 11946 Y) V* J2 T) c- G
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议# ] Q# ?" |9 i/ a9 A4 h E
#如果使用ipv6应改为proto tcp6或proto udp69 a, P4 G6 u$ z- K; V
;proto tcp 6 y& L, B; j& [! b8 v
proto udp3 h0 ]: \* h/ ?9 \! t" a$ o
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。
4 h3 ?* g& B0 R% H; s#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备
2 K& J& j3 |# @. i5 udev tap1 B4 d z) Q$ u/ S
;dev tun
/ P1 p6 d5 ]: x8 Y6 r- Y: h9 _#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法
5 T! i+ k( ?% l" c+ d( \; P% E/ N' aca ca.crt' S: C* `- V6 B) ~. B8 \
#Server使用的证书文件
0 G1 z/ t# P: _cert server.crt
5 @' @5 e3 w6 S# k2 J3 W#Server使用的证书对应的key,注意文件的权限,防止被盗
" q4 t; s0 D, h4 B* U- rkey server.key # This file should be kept secret
# w6 A! Q6 ?1 D8 f#CRL文件的申明,被吊销的证书链,这些证书将无法登录
4 q% ~3 }3 _. l) u5 w' L/ dcrl-verify vpncrl.pem
3 n3 U' g4 G3 o1 K# W* l9 D7 i0 v1 V#上面提到的生成的Diffie-Hellman文件- s* ^6 q) l4 ^5 F1 x9 Y6 M# Y
dh dh1024.pem
Y4 `! @( _6 Y+ s* r. E/ y#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由
; w/ p& H- w4 b) T8 m$ w/ b#这条命令等效于:
9 V8 Q6 q# ]* r% b# |: ~: F" _# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入
! p1 u3 x" V/ i" @) r6 y# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
J1 Y: a- n( \6 B e+ A+ H, S#; H1 n, k. d* P4 E
# if dev tun: #如果使用tun设备,等效于以下配置" R ^% h# K! E) _! q0 V
# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址; B9 g, K5 h( o3 E
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址( ?9 [2 v5 r) y4 z+ y8 t- y
# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2
; j/ q0 n# }) i" d1 ^ \, J B* w# if client-to-client: #如果使用client-to-client这个选项
. h( m7 O9 }1 Q, ^9 I. f9 p# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.1
6 h: i; J1 D) D5 Y: z# else. H ~* R2 {8 q8 F" {
# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1! s' d$ N6 Z6 c3 [$ a& b
#
' h) e, Y* S. d. a! x& _7 M# if dev tap: #如果使用tap设备,则等效于以下命令7 y: b0 f9 Z$ \* t" L, y
# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址
- v5 T1 a$ N/ ]5 \/ v# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码
: ]# f: m! ~$ T! u. v0 {# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机6 Q% o: L; q" m6 O) C3 {
#4 S* G! V3 Y( Y- T
server 10.8.0.0 255.255.255.0 #等效于以上命令
! e7 H- ~/ g: L1 X9 v# @#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,
( A- v \$ _" E$ L& }& H#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址
" M+ g1 ~# W3 s( v0 p" i& ~8 xifconfig-pool-persist ipp.txt8 @" G- l' e. J
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
+ C) b# w, \* i, ]: l1 S;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100: i# |+ B e2 F- ?
#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用1 H! Z. o9 V! L1 b7 x1 Q+ ]5 A
;push “route 192.168.10.0 255.255.255.0″. t- G$ M, A0 [
;push “route 192.168.20.0 255.255.255.0″
9 y& X, u" L) g5 j$ H# \# j#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
% U6 K( ]2 F. C;route 10.9.0.0 255.255.255.252" d9 @9 _) z% N5 U
#Run script or shell command cmd to validate client& Z8 h( h& f$ T
#virtual addresses or routes. 具体查看manual
% ] p) u8 S; B: \;learn-address ./script
# O, e) P( a! d5 _7 }# Q: r#其他的一些需要PUSH给Client的选项
" a1 z# t1 ]9 R- @0 e8 q: s#8 C: x- ], H: E8 ~4 h( q" p
#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走
/ a, k2 P) B2 w2 X;push “redirect-gateway”/ q, P: N, v. @8 q% E8 w4 W
#DHCP的一些选项,具体查看Manual
, A* g9 z/ J! Y;push “dhcp-option DNS 10.8.0.1″
5 M) h4 { M- b;push “dhcp-option WINS 10.8.0.1″
; M: l2 Y- S4 J) l# a0 A3 t& ^#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,
: ^/ Z" \% ?: z& N; o' B#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
7 K6 K2 }7 s4 N% L# C5 {client-to-client
6 U; Q9 Q) g# m, M: N% X#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA
* D/ z7 H- v7 J5 N$ Q" [' K#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN% H7 E8 G& y7 }' j! C9 I7 t% V0 U
;duplicate-cn9 B' G* ]9 I( k$ E; w
#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,
' n1 I. `9 R2 a#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
$ R( u3 L+ }/ w8 i( z" e#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,
% F6 e* k) u! B# B#认为连接丢失,并重新启动VPN,重新连接7 l U+ B- N: Z5 ^* h6 A8 |
#(对于mode server模式下的openvpn不会重新连接)。
' ^6 d6 ~0 \( q6 R' _& q2 Ukeepalive 10 1209 _! K5 N2 B+ n) d
#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,0 t W; }' z' Q$ c' o( ?7 }9 J8 U# z
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1
* C2 |# E( X4 f9 m0 itls-auth ta.key 0 # This file is secret1 H. U# o! ~# P- j( i6 Y1 P9 ~1 |
#对数据进行压缩,注意Server和Client一致
3 F8 L' Q, n4 H) n/ dcomp-lzo
* l# L& T* T8 H. F#定义最大连接数
/ H. w6 Z& `0 L' `;max-clients 100
4 ]6 L" q/ L& z4 E) t; N#定义运行openvpn的用户) i8 m7 M( U0 c% `0 P
user nobody# T9 |& q+ t T; v
group nobody) S L; O0 ~& ?* c) G$ O6 w
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys( M: d( |7 ~. O$ ~! g
persist-key
; \# P1 T/ C" J) e' E* u8 v9 T#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,, O3 B1 G2 R+ g+ \5 N
#否则网络连接会先linkdown然后linkup. O& O/ ?- D! Z2 L6 ~, t
persist-tun
$ Y/ K/ L+ m. B6 F# p# w#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
+ @: k: [% g( Q) L* _status openvpn-status.log
x! ?5 h4 |2 |# G3 ], r#记录日志,每次重新启动openvpn后删除原有的log信息4 b% W$ K) F R( N& g# f2 z2 l
log /var/log/openvpn.log" c! w7 C& V( d) L! q/ y
#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后' L1 a' O& [6 B; e' p5 N
;log-append openvpn.log& {7 Z& U' {: y, m) H6 z
#相当于debug level,具体查看manual
9 J- B/ E% w8 Rverb 3
/ o' Q9 x- V! h t8 I——————————-' K8 n) r/ I* }4 c" y" Q" ^
把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:: l R: E- i N- F6 n
#cd /etc/openvpn
0 m) L* X. Z& h#cp easy-rsa/keys/ca.crt .; P! A$ W; R% z6 O- j
#cp easy-rsa/keys/server.crt .
. l+ a. u: i% T. ]+ _5 G+ g+ b& [#cp easy-rsa/keys/server.key .
: U* `0 t4 w8 i' q0 s4 m#cp easy-rsa/keys/dh1024.pem .$ y- [- w6 }+ X5 b. _
#cp easy-rsa/keys/ta.key .
: e9 m- H+ S& J. G6 J g' s1 ]# f/ n#cp easy-rsa/keys/vpncrl.pem .
, }% ?3 ^* y4 I V创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn7 S9 X* K) K0 P3 j5 M6 @( s0 w" d+ \
然后运行:
7 n# ?: k+ j) y( [( f#chkconfig –add openvpn
) l. [4 X) z6 b0 e( c#chkconfig openvpn on
1 ~5 V0 Q2 Y+ P4 r/ t立即启动openenvpn
% m T `' Y4 M- o. ?2 L6 S3 u3 U#/etc/init.d/openvpn start
% h5 R9 X. l8 x) k6 j$ W' I: m& |1 A* {5 [8 }; K6 Q1 I
接下来配置客户端的配置文件client.conf:" m, ^6 O: U/ g4 x
Linux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key
( c7 m/ [& s6 g/ p& L5 |———————————-
' v! \1 C" [6 @7 Q! o% N" @. ]4 j s# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”$ G, T6 T$ d' h" K" n$ ^
client" W" _# P, [5 A* f8 r+ @. _
! y" f5 D. S4 @6 @8 m8 y1 A3 A
#指定接口的类型,严格和Server端一致
7 @5 Q# z v, _( Jdev tap- l1 s0 Q5 b7 t' _$ ^4 }
;dev tun) }2 T- t! P/ k
$ N0 }4 x# w( y' _: X# Windows needs the TAP-Win32 adapter name
7 P7 y5 D& A _; V/ g2 ]# from the Network Connections panel4 V, w7 i4 W7 ?7 b, x( l+ g/ P
# if you have more than one. On XP SP2,
# o. G& ]+ I/ f. H2 U5 @# you may need to disable the firewall
Y" d2 y. O( g. t8 B# for the TAP adapter." B- R1 m+ m( v3 [) ?! i3 d
;dev-node MyTap a+ @9 d3 Q d- @; |0 s
# ~0 a# v0 I9 a7 D/ d- r" F" W# 使用的协议,与Server严格一致
% p$ A- q Z/ b3 L/ e;proto tcp
) e0 @8 k# _* d2 w1 ~! d* ~ E$ mproto udp5 L& O) @+ d/ T8 _4 X& E/ {& O
% p+ M9 ?! K2 K3 H& s
#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
q! {, ~& M2 H: n, H( j, v# K4 i
; i2 ?+ s. j3 g9 ]. aremote 61.1.1.2 11945 W0 d# i: ]* R- i5 B4 i1 d
;remote my-server-2 1194/ p& I2 H( b" h
6 U% H4 w$ J; J( _! _# 随机选择一个Server连接,否则按照顺序从上到下依次连接
# c1 F$ D3 M6 F3 ^' Z;remote-random$ A* D# E- v# O; x* ]/ }2 j
* ^. y1 ^! U5 u& w+ K9 q! K
# 始终重新解析Server的IP地址(如果remote后面跟的是域名),
; d D* L1 a1 }% s% A# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址 C% D Z6 `' l: W
# 这样无需人为重新启动,即可重新接入VPN
* ]% x7 a1 X" ] q/ {) ^resolv-retry infinite
! {; Z A+ q* W3 c
/ l0 E+ x) Z+ j0 M3 P8 i+ x# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要! I; q: ^" j% O4 S
nobind
( C& j' E/ y i/ j( z6 N8 P
m& a) K0 D2 L) M. c0 J6 V5 h# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作
: ^9 }% J$ \. Fuser nobody
" e3 v# H9 k6 E2 R% n) `group nobody
$ g$ q( w# Z+ s4 P" I8 [. l2 ~9 t
#在Client端增加路由,使得所有访问内网的流量都经过VPN出去1 t" E2 i' n G1 m
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
" }1 N! ?# O0 u" H R: I+ y$ i, |# push “route 192.168.0.0 255.255.255.0″
, z4 l. {. f9 H* i) Aroute 192.168.0.0 255.255.0.0
- k3 S$ b5 g5 o- Z+ p! v9 M! l- Y2 d4 s. N7 O7 Q. Q
# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备
" c, S7 {( J" v5 ^! o$ `- i% {, Hpersist-key
3 Z$ R; W1 {; [persist-tun
( ]! R( y+ a) u$ V4 L: K8 p6 h0 D% S' |, G0 W& \& p7 ]8 t
# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面
8 [5 L; E& f! d) e/ o6 t. }# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]
6 l4 h) U: S0 U# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual
3 o m% M+ ~' k, [;http-proxy-retry # retry on connection failures I& R5 r. P S, N' V
;http-proxy [proxy server] [proxy port #]+ G9 V6 \+ ^! n8 F
; U5 E* X$ J, S/ I8 q* p$ ^" t0 y8 m9 [# 对于无线设备使用VPN的配置,看看就明白了* ~; z/ Z# `% J* [4 f7 K
# Wireless networks often produce a lot
# J9 h& g8 a" R- E c/ U! ^# of duplicate packets. Set this flag& I5 s6 |/ b1 n/ q! e
# to silence duplicate packet warnings.
* i( P" h; c) e;mute-replay-warnings: }0 l8 ~ n* f1 B
! {' d* k6 _- @
# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件( W- m/ ?7 K, @, y6 m, [, z
ca ca.crt; T& M' z, q2 [! g
# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。- W4 ]0 P$ f9 S( }# ?9 B
cert elm.crt* X7 \, A9 [2 z6 n/ a
key elm.key# Z* x% o. V% z. B
2 f; |% x; A1 ^3 v6 v! x3 c9 |" _
# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
; i, k. n3 l% U0 W$ m( `# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server
3 `) F3 _$ g& E1 n& a# `- J! h7 d# 因为他们的CA里没有这个扩展
( R% D. f" s% d% t: f- d5 a/ Kns-cert-type server
4 C% F% H1 ?' W6 _* s) u- ?+ N. \; R
# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1& ?; F! _, Q* a1 r& B
tls-auth ta.key 1* f- H2 _& g( ]! O5 z5 o! K
) a$ L: U/ q4 l7 r: C( b% O
# 压缩选项,和Server严格一致
8 E% U* A& M$ Y1 \3 O$ Z' xcomp-lzo" y& ^6 y& c8 q4 N1 f& u& k
# u# o" ] i i/ K# Set log file verbosity.1 o2 v4 @7 w8 @# @; N
verb 4
+ x+ h9 p9 n' }' J |
|