找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 14452|回复: 1

OpenVPN(2)

[复制链接]
发表于 2009-11-28 02:57:39 | 显示全部楼层 |阅读模式 IP:江苏扬州
整备OpenVPN的Server和Client的主配置文件
之前locate出来的列表当中,有Server和Client的主配置文件模版
/usr/share/doc/openvpn-2.0.9/sample-config-files/client.conf
/usr/share/doc/openvpn-2.0.9/sample-config-files/server.conf

OpnVPN Server端的主配置文件
主配置文件的路径为/etc/openvpn/下,因此先将模版配置文件复制到这个路径下再作修改
[root@VPNSRV01 easy-rsa]# cp /usr/share/doc/openvpn-2.0.9/sample-config-files/server.conf /etc/openvpn/
然后配置服务端的主配置文件server.conf
[root@VPNSRV01 openvpn]# vi server.conf
-------------------------------------------------------------------------------
# listen on? (optional)
;local a.b.c.d   (设定监听在本机的哪个网络接口上,这里使用默认注释,表示监听所有本机上的网络接口)
port 9988 (这里设定的监听端口,默认是1194,我这里修改为9988)

# TCP or UDP server?
;proto tcp
proto udp
(设定在传输层使用的协议,这里设定为默认的UDP协议)

# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
;dev tap
dev tun
(设定传输设备节点。如提示信息,tun是一个三层设备,tap是一个二层设备。而这里我们要的是IP路由,是三层的方式,因此选择tun)

# Non-Windows systems usually don't need this.
;dev-node MyTap
(设定传输设备节点名。如提示信息,非Windows系统不需要设定这项,目前这台Server的操作系统是CentOS5,保留注释)

ca /etc/openvpn/vpnkeys/ca.crt
cert /etc/openvpn/vpnkeys/vpnsrv01.crt
key /etc/openvpn/vpnkeys/vpnsrv01.key   # This file should be kept secret
(设定根证书CA、服务器证书、以及服务器密钥文件的位置。注意,这里我都是写上了绝对路径,那是因为我更动了它们的位置。这里也可以直接写文件名而不写绝对路径,表示使用默认路径,默认为/etc/openvpn/下)

dh /etc/openvpn/vpnkeys/dh1024.pem
(设定Diffie Hellman参数文件的路径。同上,我也是输入了绝对路径,也可以直接输入文件名使用默认路径。默认路径为/etc/openvpn/下)

# Configure server mode and supply a VPN subnet
server 10.99.0.0 255.255.255.0
(设定Server端虚拟出来的VPN网段)

ifconfig-pool-persist ipp.txt
(设定虚拟地址租约文件,用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,防止openvpn重新启动后“忘记”Client曾经使用过的IP地址)

push "route 111.111.111.0 255.255.255.0"   #For Net1
push "route 222.222.0.0 255.255.0.0"   #For Net2
push "route 123.123.123.234 255.255.255.255"   #For HostX
(设定Push路由。当Client连接Server的时候,自动会得到这些路由条目并添加到它们的路由表中,由于是Server那里传过来的,因此叫Push路由。当Client从Server处断开的时候这些Push路由将自动在Client的路由表中删除。一个需要提醒注意的地方就是既然是加入路由,那么必须要填写的是"route 网段 子网掩码"的格式,如果不是像第三条那样是添加针对某一个主机的路由的话,那么一定要写的是网段!如果要针对一个目的网段的路由,而却写的是主机地址的话,那么这个Push路由将失败)

;push "redirect-gateway"
;push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"
(设定其他的Push信息。redirect-gateway为接入Client重新指定出口网关,如果不设定的话则是使用Server路由表当中的默认出口网关。dhcp-option下的DNS和WIN则是为接入Client重新分配域名服务器和名称服务器的IP地址。除非特殊的规划,一般这里没有设定的必要,保持注释)

client-to-client
(设定接入的Client之间能够被允许互相访问,默认情况下接入的Client是不能互相访问的。如果需要使它们互相访问的话请去掉默认的注释)

# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE "COMMON NAME",
# UNCOMMENT THIS LINE OUT.
;duplicate-cn
(设定是否允许单证书多连接。如果有多个Client使用相同的证书接入Server,亦或Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN。但是如果出于安全考虑,比如一个证书只能由一个Client对应的情况,这里就建议关闭而保留注释)

keepalive 10 120
(设定保活参数。这里的意思是每10秒钟通过Ping来确定Client是否存活,当然这个Ping的进行是在虚拟通道中而不是在真实外部链路上的,超过120秒无反馈表示丢失该Client)

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
# openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
tls-auth /etc/openvpn/vpnkeys/ta.key 0 # This file is secret
(设定ta密钥的路径。之前提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1)

# Enable compression on the VPN link.
# If you enable it here, you must also
# enable it in the client config file.
comp-lzo
(使用Lzo功能对虚拟链路进行压缩。另外要提的一点,如果Server端开启的话,那么连接它的Client端也要在配置文件中开启)

;max-clients 100
(设定并发最大Client接入数)

user nobody
group nobody
(设定OpenVPN服务的宿主用户,这里设定nobody。使用vipw来快速查看/etc/passwd文件,可以发现nobody是系统内置的,并且UID和GID分别为99。另外要注意的是,既然将OpenVPN服务的宿主用户设定为nobody,那么凡是关于OpenVPN服务进程相关或者需要读写的文件,请都要赋予nobody权限)

persist-key
(设定连接保持密钥功能。在由于keepalive检测超时后而重新启动VPN的情况,不重新读取keys,而保留第一次使用的keys)
persist-tun
(设定连接保持在线功能。在由于keepalive检测超时后而重新启动VPN的情况,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup)

status /var/log/openvpn-status.log
(设定状态记录日志路径。状态记录日志会定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作。注意,如果更改过OpenVPN服务宿主用户的话,请记得这里将此文件赋予宿主用户一定的权限)

log       /var/log/openvpn.log
(设定OpenVPN的服务日志路径。注意,如果更改过OpenVPN服务宿主用户的话,请记得这里将此文件赋予宿主用户一定的权限)
log-append   /var/log/openvpn.log
(此项和log项配合使用,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后)

# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3
(设定OpenVPN的dubug等级。使用默认3级。)

# Silence repeating messages.   At most 20
# sequential messages of the same message
# category will be output to the log.
;mute 20
(设定日志信息的冗余程度。默认值为20,当相同的信息连续反复出现时,系统会去掉相同的20条)
-------------------------------------------------------------------------------
注意:如果不采用OpenVPN的默认路径而要定制路径的话,必须要严格确定每个配置项的路径是否设定正确。

在启动OpenVPN服务进程前的需要确定的工作:
1.建立配置文件中指定的日志文件,并赋予正确的权限
[root@VPNSRV01 easy-rsa]# touch /var/log/openvpn.log
[root@VPNSRV01 easy-rsa]# touch /var/log/openvpn-status.log
[root@VPNSRV01 easy-rsa]# chown nobody.nobody /var/log/openvpn.log
[root@VPNSRV01 easy-rsa]# chown nobody.nobody /var/log/openvpn-status.log
2.确定配置文件中的配置项指定的路径
例如:
比如我第一次配置完Server端启动时就失败了
[root@VPNSRV01 easy-rsa]# service openvpn start
Starting openvpn:                                        [FAILED]
查看日志寻找原因原因
[root@VPNSRV01 easy-rsa]# tail -n 10 /var/log/openvpn.log
Mon Aug 27 16:00:03 2007 OpenVPN 2.0.9 i386-redhat-linux-gnu [SSL] [LZO] [EPOLL] built on Mar   8 2007
Mon Aug 27 16:00:03 2007 Diffie-Hellman initialized with 1024 bit key
Mon Aug 27 16:00:03 2007 Cannot open file key file 'ta.key': No such file or directory (errno=2)
Mon Aug 27 16:00:03 2007 Exiting
原来ta密钥的路径没有写对,服务进程找不不到ta.key。因此整个服务启动失败。修正了正确的ta路径后再启动服务进程就正常了。因此,如果定制一些关键文件的路径时,一定要仔细根据定制情况正确编辑配置文件。
3.检查系统防火墙,是否为VPN开启了。
[root@VPNSRV01 easy-rsa]# iptables -A INPUT -p udp --dport 9988 -j ACCEPT
[root@VPNSRV01 easy-rsa]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
检查防火墙
[root@VPNSRV01 easy-rsa]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source             destination      
ACCEPT     udp   --   anywhere          anywhere          udp dpt:9988
ACCEPT     all   --   anywhere          anywhere          state RELATED,ESTABLISHED
4.转发开关是否打开,打开这个路由转发开关
[root@VPNSRV01 vpnkeys]# echo 1 > /proc/sys/net/ipv4/ip_forward
并且顺带将这个命令添加到启动脚本当中,使得每次系统启动的时候都会打开这个开关
[root@VPNSRV01 vpnkeys]# echo 'echo 1 > /proc/sys/net/ipv4/ip_forward' >> /etc/rc.d/rc.local

启动OpenVPN Server端的程序
[root@VPNSRV01 easy-rsa]# service openvpn start
Starting openvpn:                                        [   OK   ]
查看Server现在的网卡情况
[root@VPNSRV01 easy-rsa]# ifconfig
eth0    Link encap:Ethernet   HWaddr 00:16:3E:4A:C2:28  
      inet addr:123.123.123.233   Bcast:123.123.123.255   Mask:255.255.255.0
      inet6 addr: fe80::216:3eff:fe4a:c228/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST   MTU:1500   Metric:1
      RX packets:2059473 errors:0 dropped:0 overruns:0 frame:0
      TX packets:1258577 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
      RX bytes:159571429 (152.1 MiB)   TX bytes:98975611 (94.3 MiB)
lo        Link encap:Local Loopback  
      inet addr:127.0.0.1   Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING   MTU:16436   Metric:1
      RX packets:273 errors:0 dropped:0 overruns:0 frame:0
      TX packets:273 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:40479 (39.5 KiB)   TX bytes:40479 (39.5 KiB)
tun0    Link encap:UNSPEC   HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.99.0.1   P-t-P:10.99.0.2   Mask:255.255.255.255
      UP POINTOPOINT RUNNING NOARP MULTICAST   MTU:1500   Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100
      RX bytes:0 (0.0 b)   TX bytes:0 (0.0 b)
(这个tun0设备就是OpenVPN虚拟出来的网络接口。另外需要提到的一点是,这个设备会被初始化,但是只有在OpenVPN的服务进程成功运行起来的时候才会有这个设备,如果运行OpenVPN进程失败的话,是看不到这个设备的。也所以,当要使用OpenVPN的时候,切记要为它的网络接口开放特定的防火墙,或者干脆关闭防火墙。否则Client是无法接入的,这里需要特别提醒。因为本人曾经卡在过这个问题上,当分析出来是防火墙的时候,比较让人感到崩溃= =)

查看Server的路由
[root@VPNSRV01 easy-rsa]# route
Kernel IP routing table
Destination    Gateway       Genmask          Flags Metric Ref Use Iface
10.99.0.2       *                255.255.255.255 UH    0       0        0 tun0
123.123.123.0 *                255.255.255.0    U    0           0        0 eth0
10.99.0.0       10.99.0.2        255.255.255.0    UG    0       0        0 tun0
169.254.0.0    *                255.255.0.0       U    0           0        0 eth0
default          123.123.123.1 0.0.0.0             UG     0           0        0 eth0
其中10.99.0.0部分就是虚拟网络的路由。到此,OpenVPN的Server端已经基本完成。

将Server上之前为测试Client生成的证书密钥以及一些相关文件复制到Client端的/etc/openvpn/目录下这里,Client需要向Server得到五个重要的文件
CA证书文件             (我这里是ca.crt)
Client证书文件           (我这里是vpnclnt00.crt)
Client密钥文件          (我这里是vpnclnt00.key)  
Client的SSL证书请求文件   (我这里是vpnclnt00.csr)
ta密钥文件             (我这里是ta.key)
配置Client端的主配置文件
Client上也安装了OpenVPN的包,所以也有模版文件
/usr/share/doc/openvpn-2.0.9/sample-config-files/client.conf
这里将Client的主配置模版文件复制到OpenVPN的主配置路径下
[root@VPNCLNT00 ~]# ll /etc/openvpn/
total 48
-rw-r--r-- 1 root root 1233 Aug 27 14:09 ca.crt
-rw-r--r-- 1 root root   254 Aug 28 02:29 client.conf
-rw-r--r-- 1 root root   636 Aug 27 14:09 ta.key
-rw-r--r-- 1 root root 3537 Aug 27 14:09 vpnclnt00.crt
-rw-r--r-- 1 root root   753 Aug 27 14:09 vpnclnt00.csr
-rw-r--r-- 1 root root   887 Aug 27 14:09 vpnclnt00.key
可以看到在Client的主配置路径下一共有6个文件。5个是证书密钥,1个是Client端的主配置文件client.conf
现在我们来编辑客户端主配置文件client.conf
[root@VPNCLNT00 ~]# vi /etc/openvpn/client.conf
----------------------------------------------------------------------------
client
(声明这个配置文件作用于客户端)

dev tun
(使用tun三层虚拟连接设备)

proto udp
(使用UDP协议)

remote 123.123.123.233 9988
(设定远程Server的IP地址和端口,这里要和Server对应起来。如果有多个Server可以连接的话可以配置多条remote,一行一条)

resolv-retry infinite
(始终重新解析Server的IP地址,如果remote后面跟的是域名,保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址,这样无需人为重新启动,即可重新接入VPN)

nobind
(表示Client端不像Server端那样需要开放特定的端口,nobind的意思就是Client的不绑定特定的监听端口)

user nobody
group nobody
(指定OpenVPN服务进程的宿主用户)

persist-key
(设定连接保持密钥功能。在由于keepalive检测超时后而重新启动VPN的情况,不重新读取keys,而保留第一次使用的keys)
persist-tun
(设定连接保持在线功能。在由于keepalive检测超时后而重新启动VPN的情况,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup)

ca ca.crt
cert vpnclnt00.crt
key vpnclnt00.key
(设定CA证书、Client证书以及Client密钥文件的路径。与之前我Server端的配置不同,这里我没有写绝对路径而只是写了一些文件名。这是因为我使用了默认的OpenVPN的主路径/etc/openvpn/。如果不是使用默认路径而是定制更改了这些文件的位置的话,那么就需要注上详细的绝对路径了)

ns-cert-type server
(这一项是Server配置文件server.conf当中没有的。Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项,为的是防止黑客操纵他们的VPN Client模拟成VPN Server,然后使用他们的keys + DNS欺骗其他的Client连接他们假冒的VPN Server。因为他们的CA里没有这个扩展)

tls-auth ta.key 1
(设定ta密钥的路径。这里我使用/etc/openvpn/的默认路径。所以直接打了文件名而不是绝对路径。这个配置项是关于HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,没有HMAC signature的控制信息不予处理。这里Client使用的值是1,注意server端后面的数字肯定使用0)

comp-lzo
(设定启用Lzo将虚拟链路压缩。注意,这里一定要与Server配置统一。Server启用这条时Client也要启用,相对的Server关闭这条的时候Client也要关闭)

verb 3
(Debug等级)

;mute 20
(意义同Server端的设定)
-------------------------------------------------------------------------------------------------------

运行Client的OpenVPN
[root@VPNCLNT00 ~]# service openvpn start
Starting openvpn:                                        [   OK   ]
查看Client的路由表
[root@VPNCLNT00 ~]# route
Kernel IP routing table
Destination          Gateway       Genmask             Flags Metric Ref Use Iface
10.99.0.5              *                255.255.255.255    UH 0    0        0 tun0
123.123.123.234 10.99.0.5       255.255.255.255    UGH 0    0        0 tun0
10.99.0.0              10.99.0.5        255.255.255.0       UG 0    0        0 tun0
111.111.111.0    10.99.0.5       255.255.255.0       UG     0     0        0   tun0
222.222.0.0       10.99.0.5       255.255.0.0          UG 0    0    0   tun0
192.168.0.0           *                255.255.255.0       U     0    0        0 eth0
169.254.0.0           *                255.255.0.0          U     0    0        0 eth0
default                 192.168.0.101 0.0.0.0                UG 0    0        0 eth0
查看Client的网络接口
[root@VPNCLNT00 ~]# ifconfig
eth0    Link encap:Ethernet   HWaddr 00:16:3E:27:F9:47  
      inet addr:192.168.0.231   Bcast:192.168.0.255   Mask:255.255.255.0
      inet6 addr: fe80::216:3eff:fe27:f947/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST   MTU:1500   Metric:1
      RX packets:13328 errors:0 dropped:0 overruns:0 frame:0
      TX packets:11761 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
      RX bytes:7013030 (6.6 MiB)   TX bytes:1647512 (1.5 MiB)
lo        Link encap:Local Loopback  
      inet addr:127.0.0.1   Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING   MTU:16436   Metric:1
      RX packets:56 errors:0 dropped:0 overruns:0 frame:0
      TX packets:56 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:6020 (5.8 KiB)   TX bytes:6020 (5.8 KiB)
tun0    Link encap:UNSPEC   HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.99.0.6   P-t-P:10.99.0.5   Mask:255.255.255.255
      UP POINTOPOINT RUNNING NOARP MULTICAST   MTU:1500   Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100
      RX bytes:0 (0.0 b)   TX bytes:0 (0.0 b)

使用Client从虚拟网络中Ping向Server
[root@VPNCLNT00 ~]# ping 10.99.0.1
PING 10.99.0.1 (10.99.0.1) 56(84) bytes of data.
64 bytes from 10.99.0.1: icmp_seq=1 ttl=64 time=21.7 ms
64 bytes from 10.99.0.1: icmp_seq=2 ttl=64 time=21.6 ms
64 bytes from 10.99.0.1: icmp_seq=3 ttl=64 time=22.0 ms
64 bytes from 10.99.0.1: icmp_seq=4 ttl=64 time=21.8 ms
64 bytes from 10.99.0.1: icmp_seq=5 ttl=64 time=21.7 ms
64 bytes from 10.99.0.1: icmp_seq=6 ttl=64 time=21.7 ms
(成功Ping通,连通正确)

看到tun0出现,分配到了虚拟网络的地址。并且路由表当中也拥有了虚拟网络的路由条目,还看到Server那里Push过来的路由。说明Client已经正常连接上了Server了。想想上个周六,Client端的OpenVPN起来OK,但是不出现tun0的设备。我还以为是我配置哪里出了问题,反复地排差,看反馈信息是写No Route to host,没有去往Server的路由,但是我一直能够Ping通那台Server。所以我一直认为是tun0设备没有初始好...结果搞半天是由于Server的防火墙将VPN端口关闭造成的,囧,一直到半夜3点半,结果原来是这问题...所以,当VPN没有协商成功的时候,tun0这个设备是不会启动的,也不会在ifconfig当中看到。强制手动启动也是没有用得,这个我也尝试过...囧。所以,提醒大家一个地方哦,当Client启动OpenVPN去连接Server的时候如果有以下现象:1.从ifconfig当中没有看到tun0启动,2.信息反馈一直为No Route to Host的时候,请记得先看看是不是你Server端的防火墙没有放行...弄半天为了这低级问题,我怨念...- -
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 15:20 , Processed in 0.197158 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表