centos 6 搭建基于证书认证登录的OpenVPN服务器

一、OpenVPN简介

    OpenVPN 是一个基于 OpenSSL 库的应用层 PVN 实现。和传统 vpn 相比,它的优点是简单易用。

    Openvpn允许参与建立vpn的单点使用共享金钥,电子证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSLv3/TLSv1 协议函式库。Openvpn能在SolarisLinuxOpenBSDFreeBSDNetBSDMac OS XWindows 2000/XP/Vista上运行,并包含了许多安全性的功能。它并不是一个基于Webvpn软件,也不与IPsec及其他vpn软件包兼容。

    Openvpn2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。 Openvpn所有的通信都基于一个单一的IP端口,默认且推荐使用UDP协议通讯,同时TCP也被支持。Openvpn连接能通过大多数的代理服务器,并且能够在NAT的环境中很好地工作。服务端具有向客户端推送某些网络配置信息的功能,这些信息包括:IP地址、路由设置等。Openvpn提供了两种虚拟网络接口:通用Tun/Tap驱动,通过它们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数据可通过LZO算法压缩。在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。

 

二、Openvpn的安装

Openvpn服务器

   内外地址:10.0.0.41

   外网地址:211.152.xx.xx

本地客户端

   网段:192.168.0.0

   本机IP192.168.0.125

1、安装前的准备工作

   请关闭防火墙和selinux,简单的安装方法就是使用yum安装,首先我们应该先安装epel软件仓库。

1

2

3

service iptables stop

setenforce 0

rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

2、开启服务器端路由转发功能

1

sysctl -w net.ipv4.ip_forward=1

3、设置nat转发

注:保证vpn地址池可路由出外网

1

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

4、安装openvpn,他会自动解决依赖关系

我使用的openvpn版本是2.3.7,建议大家也使用这个版本,附件有

1

yum install openvpn -y

5、安装好之后我们查看安装了哪些文件,其中标记红色的部分的是我们后面配置需要的

[root@vpn ~]# rpm -ql openvpn

……

……

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/README

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/client.conf

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/firewall.sh

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/home.up

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/loopback-client

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/loopback-server

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/office.up

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/openvpn-shutdown.sh

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/openvpn-startup.sh

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/roadwarrior-client.conf

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/roadwarrior-server.conf

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/server.conf

下面两行是运行在预共享的静态密钥下的示例配置文件

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/static-home.conf

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/static-office.conf

下面两行是运行在SSL/TLS模式下的示例配置文件

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/tls-home.conf

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/tls-office.conf

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/xinetd-client-config

/usr/share/doc/openvpn-2.3.7/sample/sample-config-files/xinetd-server-config

/usr/share/doc/openvpn-2.3.7/sample/sample-keys

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/.gitignore

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/README

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/ca.crt

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/ca.key

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/client-ec.crt

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/client-ec.key

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/client-pass.key

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/client.crt

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/client.key

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/client.p12

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/dh2048.pem

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/gen-sample-keys.sh

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/openssl.cnf

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/server-ec.crt

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/server-ec.key

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/server.crt

/usr/share/doc/openvpn-2.3.7/sample/sample-keys/server.key

/usr/share/doc/openvpn-2.3.7/sample/sample-plugins

……

……

 

三、Openvpn的配置

    首先把主要配置文件复制到/etc/openvpn

1

cp /usr/share/doc/openvpn-2.3.7/sample/sample-config-files/server.conf /etc/openvpn/

    网上有很多是编译安装的vpn,也主要讲解了如何生成证书,我这里就不演示证书创建的过程了,因为我们安装的openvpn里面自带了测试的证书(上面红色部分)等等,如果想自建证书的话请看本篇附录,为了简便,我这里运行openvpn的权限是root,如果要使用openvpn权限运行的话,务必修改一些文件的权限,比如证书等等。

1

vim /etc/openvpn/server.conf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

port 1194

proto tcp

dev tun

ca /usr/share/doc/openvpn-2.3.7/sample/sample-keys/ca.crt

cert /usr/share/doc/openvpn-2.3.7/sample/sample-keys/server.crt

key /usr/share/doc/openvpn-2.3.7/sample/sample-keys/server.key

dh /usr/share/doc/openvpn-2.3.7/sample/sample-keys/dh2048.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "route 10.0.0.0 255.255.255.0"

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 114.114.114.114"

topology subnet

client-to-client

keepalive 10 120

comp-lzo

persist-key

persist-tun

status /var/log/openvpn/openvpn-status.log

log-append /var/log/openvpn/openvpn.log

verb 3

注:可按照默认模板配置,本例为自定义配置文件,";"还有"#"开头的是注释

--------------------------

# 设置监听IP,默认是监听所有IP

;local a.b.c.d

# 设置监听端口,必须要对应的在防火墙里面打开

port 1194

# 设置用TCP还是UDP协议?(用UDP会比较快些)

;proto tcp

proto tcp

# 设置创建tun的路由IP通道,还是创建tap的以太网通道路,由于IP容易控制,所以推荐使用tun;但如果IPX等必须使用第二层才能通过的通讯,则可以用tap方式,tap也就是以太网桥接

;dev tap

dev tun

# Windows服务端需要给网卡一个名称,linux不需要

;dev-node MyTap

# 这里是重点,必须指定SSL/TLS rootcertificate (ca),certificate(cert), and private key (key)ca文件是服务端和客户端都必须使用的,但不需要ca.key,服务端和客户端指定各自的.crt.key,请注意路径,可以使用以配置文件开始为根的相对路径,也可以使用绝对路径,请小心存放.key密钥文件

ca /usr/share/doc/openvpn-2.3.7/sample/sample-keys/ca.crt

cert /usr/share/doc/openvpn-2.3.7/sample/sample-keys/server.crt

key /usr/share/doc/openvpn-2.3.7/sample/sample-keys/server.key

# 指定Diffie hellmanparameters.

dh /usr/share/doc/openvpn-2.3.7/sample/sample-keys/dh2048.pem

# 配置服务器模式和vpn使用的网段,Openvpn会自动提供基于该网段的DHCP服务,但不能和任何一方的局域网段重复,vpn服务器将会把10.8.0.1留给自己,其余的分配给vpn客户端,每一个客户端都会从10.8.0.1这个IP到达Openvpn服务端,如果使用dev tap模式,则需要注释掉该指令。

server 10.8.0.0 255.255.255.0

# 维持一个客户端和virtual IP的对应表,以方便客户端重新连接可以获得同样的IP

ifconfig-pool-persist ipp.txt

# 配置为以太网桥模式(dev tap,但需要使用系统的桥接功能,这里不需要使用

;server-bridge 10.8.0.4 255.255.255.010.8.0.50 10.8.0.100

# 为客户端创建对应的路由,以另其通达公司网内部服务器,但记住,公司网内部服务器也需要有可用路由返回到客户端,这里主要填写openvpn所在局域网的网段,我的openvpn所在的局域网是10.0.0.0,如果你的openvpn所在的局域网是其他的网段,下面请填写其他网段,可以填写多个网段。

;push "route 192.168.20.0255.255.255.0"

push "route 10.0.0.0255.255.255.0"

# 若客户端希望所有的流量都通过vpn传输,则可以使用该语句,其会自动改变客户端的网关为vpn服务器,推荐关闭,一旦设置,请小心服务端的DHCP设置问题,如果需要抓取所以连接vpn客户端的流量信息,需要开启,这就是网络上面所说的vpn

;push "redirect-gateway def1bypass-dhcp"   所有数据都通过vpn

# OpenvpnDHCP功能为客户端提供指定的DNSWINS

push "dhcp-option DNS114.114.114.114"

;push "dhcp-option WINS10.8.0.1"

# 默认客户端之间是不能直接通讯的,除非把下面的语句注释掉

client-to-client

# 如果您希望有相同Common Name的客户端都可以登陆,也可以注释下面的语句,推荐每个客户端都使用不用的Common Name,开启的话,一个证书可以多个客户端连接

;duplicate-cn

# 设置服务端检测的间隔和超时时间

keepalive 10 120

# 使用lzo压缩的通讯,服务端和客户端都必须配置

comp-lzo

# 设置最大用户数

;max-clients 100

# Openvpnnobody用户和组来运行(安全)

;user nobody

;group nobody

#持续选项会尽量避免访问某些资源的重新启动可能不可以因为特权的降级。

persist-key

persist-tun

# 输出短日志,每分钟刷新一次,以显示当前的客户端

status /var/log/openvpn/openvpn-status.log

# 缺省日志会记录在系统日志中,但也可以导向到其他地方建议调试的使用先不要设置,调试完成后再定义,只能使用其中的一个,log会每次启动前先清楚日志,log-append会对数据追加

;log /var/log/openvpn/openvpn.log

log-append /var/log/openvpn/openvpn.log

# 设置日志的级别

verb 3

--------------------------

其中我们只需要修改一下红色的部分,很多其他不常用的参数并没有列举出来,如果需要可以查阅配置文件。

四、Openvpn的启动

1

service openvpn start

[root@vpn ~]# netstat -tlnp

1

2

3

4

5

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address    Foreign Address    State     PID/Program name   

tcp        0      0 0.0.0.0:22        0.0.0.0:*         LISTEN      2381/sshd           

tcp        0      0 127.0.0.1:25      0.0.0.0:*         LISTEN      1425/master         

tcp        0      0 0.0.0.0:1194      0.0.0.0:*         LISTEN      12947/openvpn

五、客户端的安装

1.下载客户端,并默认安装:

如何你不可以下载的话,可以通过我的附件下载,在最下面

http://vpntech.googlecode.com/files/openvpn-2.1.1-gui-1.0.3-install-cn-64bit.zip

 

2.将服务端内ca.crtclient.crtclient.keyclient.conf复制到客户端C:\Program Files(x86)\Openvpn\config下。

 

3.client.conf改名为client.ovpn

1

2

3

4

5

6

7

8

9

10

11

12

13

client

dev tun

proto tcp

remote 211.152.x.x 1194

resolv-retry infinite

nobind

persist-key

persist-tun

ca ca.crt

cert client.crt

key client.key

comp-lzo

verb 3

# 定义是一个客户端

client

# 定义使用路由IP模式,与服务端一致

;dev tap

dev tun

# 定义Windows下使用的网卡名称,linux不需要

;dev-node MyTap

# 定义使用的协议,与服务端一致

;proto tcp

proto tcp

# 指定服务端地址和端口,可以用多行指定多台服务器实现负载均衡高可用(从上往下尝试)

remote 211.152.x.x 1194

;remote my-server-2 1194

# 若上面配置了多台服务器,让客户端随机连接,以便实现负载均衡

;remote-random

# 解析服务器域名

resolv-retry infinite

# 客户端不需要绑定端口

nobind

# Try to preserve some state acrossrestarts.

persist-key

persist-tun

# 重点,就是指定ca和客户端的证书

ca ca.crt

cert client.crt

key client.key

# 使用lzo压缩,与服务端一致

comp-lzo

# Set log file verbosity.

verb 3

-----------------------

client里面可以只填写上面红色的参数,其他的参数可以全部删掉。

 

5、连接

    在右下角的openvpn图标上右击,选择“Connect”,若能正常分配IP,则连接成功。

    我获取的IP10.8.0.6

    先去看一下我们的路由信息

    因为我们使用了push "route 10.0.0.0 255.255.255.0" ,所以openvpn给我们推送了一条路由信息,我们在查看一下openvpn上面的IP信息

 

     那我们去ping一下服务器的内外IP,还有服务器内外外的另一台设备,看看是否可以连入机房内网。

事实证明我们的配置是成功的!

目前我们使用的是证书登录,如果需要修改成账号密码登录,请查看本博客下一篇文章,谢谢!

六、客户端IP地址的使用

    --topology mode选项中,mode有三种取值,即net30subnetp2p

    当运行在--dev tun模式下时,可以通过--topology mode选项来配置虚拟地址的拓扑结构。而对于--dev tap而言,该选项没有任何意义,因为在--dev tap模式下,总是使用子网拓扑如果在服务器端设置了--topology mode选项,那么--server--server-bridge选项将会很好地自动地把拓扑模式推送到客户端。该选项也可以被手动的推送到客户端,类似于--dev选项,另外,还要求服务器端和客户端必须支持该选项。

1net30

   Openvpn默认的子网掩码是/30,也就是255.255.225.252。在这样的情况下,每组网络四个地址,只有两个地址可以使用,一个给服务端,一个给客户端,另外一个是网络地址,一个是广播地址,这样地址是很浪费的,这是Openvpn 2.0的默认模式。

   Openvpn2.0版本中,Openvpn能通过虚拟一个TUN虚拟接口处理多个客户端,要处理这种技术,可以把服务器上看到的PtP连接看作是一个操作系统和Openvpn之间的连接,而在Openvpn内部还需要为每一个客户端创建另一个PtP。如何所有的O/STUN接口上真正的支持PtP连接,那么这将会是的Openvpn服务器仅使用一个IP地址,并且一个客户端也使用一个IP地址。

    OS系统和Openvpn之间首先要有一个10.8.0.1<->10.8.0.2PtP连接。

   于是Openvpn为每一个连接的客户端指定一个/30的子网,第一个可以使用的/30的子网是:

·        10.8.0.4:网络地址;

·        10.8.0.5:在Openvpn中的“虚拟”IP地址;

·        10.8.0.6:指定给客户端的IP地址;

·        10.8.0.7:广播地址。

    然后将路由推到客户端,这样便使所有IP地址为10.8.0.5的流量都必须通过网关”10.8.0.5才可以出去或者进入。

    由于10.8.0.5仅是Openvpn内部的一个虚拟IP地址,它被用作末端路由,对应这个地址,Openvpn不会接受ping,而10.8.0.6对于服务器的操作系统来说却是一个真正的IP地址,因此它可以接受ping,我们让客户端连接查看一下。

    以此类推,第二个客户端连接分配的IP地址对就是10.8.0.9<->10.8.0.10,从这个IP分配来看,对IP的使用造成的浪费。但是对于Openvpn服务器端仅使用一个配置来为所有类型的客户端分配地址来说这是最好的一种方式。

2subnet

   subnet通过配置TUN接口的本地IP地址和子网掩码来使用一个子网,而不是点对点的拓扑结构,类似于使用--dev tap和以太网桥模式的拓扑结构。这种模式为每个客户端分配单个IP地址。

3p2p

   p2p模式使用点对点拓扑,仅适用于Windows系统下,现在已经不再赞成使用。

附录

下载密钥制作工具easy_rsa 2

         wget https://github.com/Openvpn/easy-rsa/archive/release/2.x.zip

解压easy_rsa并拷贝到/etc/openvpn

         unzip 2.x.zip

        mv easy-rsa-release-2.x/ /etc/openvpn/

编辑easy-rsavars文件,设定相关变量信息:

         cd /etc/openvpn/easy-rsa-release-2.x/easy-rsa/2.0

         vim vars

exportKEY_COUNTRY="CN"

exportKEY_PROVINCE="Shanghai"

exportKEY_CITY="Shanghai"

exportKEY_ORG="Comratings"

exportKEY_EMAIL="[email protected]"

exportKEY_OU="MyOpenvpn"

         编辑完之后,保存退出。

将刚才编辑的vars文件,执行如下命令:

         source vars 

        ./clean-all

        ./build-ca

创建服务器的证书和密钥:

       ./build-key-server Openvpn_Server

[[email protected]]# ./build-key-server Openvpn_Server

Generating a2048 bit RSA private key

.................................+++

............+++

writing newprivate key to 'Openvpn_Server.key'

-----

You are about tobe asked to enter information that will be incorporated

into yourcertificate request.

What you areabout to enter is what is called a Distinguished Name or a DN.

There are quitea few fields but you can leave some blank

For some fieldsthere will be a default value,

If you enter'.', the field will be left blank.

-----

Country Name (2letter code) [CN]:

State orProvince Name (full name) [BEIJING]:

Locality Name(eg, city) [BEIJING]:

OrganizationName (eg, company) [XIAOCUI]:

OrganizationalUnit Name (eg, section) [MyOpenvpn]:

Common Name (eg,your name or your server's hostname) [Openvpn_Server]:

Name [EasyRSA]:

Email Address[ADMIN@ XIAOCUI.COM]:

 

Please enter thefollowing 'extra' attributes

to be sent withyour certificate request

A challengepassword []:

An optionalcompany name []:

Usingconfiguration from /etc/openvpn/easy-rsa-release-2.x/easy-rsa/2.0/openssl-1.0.0.cnf

Check that therequest matches the signature

Signature ok

The Subject'sDistinguished Name is as follows

countryName          :PRINTABLE:'CN'

stateOrProvinceName  :PRINTABLE:'BEIJING'

localityName         :PRINTABLE:'BEIJING'

organizationName     :PRINTABLE:' XIAOCUI '

organizationalUnitName:PRINTABLE:'MyOpenvpn'

commonName           :T61STRING:'Openvpn_Server'

name                 :PRINTABLE:'EasyRSA'

emailAddress         :IA5STRING:'ADMIN@ XIAOCUI.COM'

Certificate isto be certified until May  2 07:49:13 2025 GMT (3650 days)

Sign thecertificate? [y/n]:y

 

 

1 out of 1certificate requests certified, commit? [y/n]y

Write outdatabase with 1 new entries

Data BaseUpdated

 

创建客户端的证书和密钥:

       ./build-key client-user-test1

 

[[email protected]]# ./build-key client-user-test1

Generating a2048 bit RSA private key

....................+++

...............................................................................+++

writing newprivate key to 'client-user-cuiyuanrong.key'

-----

You are about tobe asked to enter information that will be incorporated

into your certificaterequest.

What you areabout to enter is what is called a Distinguished Name or a DN.

There are quitea few fields but you can leave some blank

For some fieldsthere will be a default value,

If you enter'.', the field will be left blank.

-----

Country Name (2letter code) [CN]:

State orProvince Name (full name) [BEIJING]:

Locality Name(eg, city) [BEIJING]:

OrganizationName (eg, company) [XIAOCUI]:

OrganizationalUnit Name (eg, section) [MyOpenvpn]:

Common Name (eg,your name or your server's hostname) [client-user-test1]:

Name [EasyRSA]:

Email Address[[email protected]]:

 

Please enter thefollowing 'extra' attributes

to be sent withyour certificate request

A challengepassword []:

An optionalcompany name []:

Usingconfiguration from /etc/openvpn/easy-rsa-release-2.x/easy-rsa/2.0/openssl-1.0.0.cnf

Check that therequest matches the signature

Signature ok

The Subject'sDistinguished Name is as follows

countryName          :PRINTABLE:'CN'

stateOrProvinceName  :PRINTABLE:'BEIJING'

localityName         :PRINTABLE:'BEIJING'

organizationName     :PRINTABLE:'XIAOCUI'

organizationalUnitName:PRINTABLE:'MyOpenvpn'

commonName           :PRINTABLE:'client-user-test1'

name                 :PRINTABLE:'EasyRSA'

emailAddress         :IA5STRING:'[email protected]'

Certificate isto be certified until May  2 07:53:17 2025 GMT (3650 days)

Sign thecertificate? [y/n]:y

 

 

1 out of 1certificate requests certified, commit? [y/n]y

Write outdatabase with 1 new entries

Data BaseUpdated

 

创建Diffie Hellman 参数:

       ./build-dh



 

转载至http://blog.51cto.com/wzlinux/1673778

https://yq.aliyun.com/articles/434416


猜你喜欢

转载自blog.csdn.net/vic_qxz/article/details/80859625