Fork me on GitHub
Fork me on GitHub

vpn简介及openvpn搭建

VPN介绍

VPN概述

VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的连接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术。

VPN的主要应用场景

我们根据VPN的常见企业应用,将VPN分为以下4类应用:

出差在外访问公司内部资源

企业内部员工出差、休假或特殊情况下在远离办公室的时候,又有需求访问公司的内部网络获取相关资源,就可以通过VPN拨号到公司内部。此时远程拨号的员工和办公室内的员工以及其他拨号的员工之间都相当于在一个局域网内。例如:访问内部的域控制器,文件服务器,OA系统,ERP,HTTP服务,内网飞秋聊天工具等局域网服务应用。

运维人员需要个人电脑远程拨号到企业网站的IDC机房,远程维护IDC内网服务器。

外出办公的人如何连接内网服务器呢?

  1. 没有VPN
    先登录到外网服务器组中一台服务器,然后在这个外网服务器上SSH到内网服务器。
  2. 有VPN
    把VPN搭在某一台外网服务器(外网服务器有公网ip)上,这样外出办公人员可以通过vpn拨号到这台机器上,然后在自己笔记本上输入内网服务器的IP:port访问内网服务器。同时有了vpn,可以把外网服务器的远程连接SSH全部屏蔽起来,黑客就不能通过SSH服务来攻击公司的外网服务器。而公司的人员通过vpn拨号拨到这个装了vpn的外网服务器上去,然后访问内网服务器。访问外网服务器通过访问内网ip地址去访问。

企业内部网络之间VPN服务

在公司的分支机构的局域网和公司内部LAN之间的VPN连接。通过公网Internet建立VPN将公司在各地的分支机构的LAN连接到公司总部的LAN。例如:各大超市之间业务结算等。

这是由于地域的原因而产生的VPN需求,通过VPN让不同地域内的机器可以互相访问,就好像是一个局域网一样。例如:办公室互联协同办公,机房互联数据同步及业务访问。

互联网公司多IDC机房之间VPN服务

这是运维架构人员需要考虑的问题,不同机房之间业务管理和业务访问,数据流动。

企业外部VPN服务

在供应商、合作伙伴的LAN和本公司的LAN之间建立的VPN服务。

企业内部网络之间的VPN服务、企业内部网络之间VPN服务和企业外部VPN服务是一套系统,不同的场景。

翻墙

翻墙的原理:比如有个VPS,有美国的ip地址。各位的笔记本或台式机通过vpn访问到美国的vps的机器,然后通过这个vitual private server出去访问美国的网站。在网站看来,你的源ip是美国的vps的地址,而你笔记本和vps之间的通信是加密的,走的是vpn协议。vps和后端的网站之间走的是http协议。

实现vpn功能的常见开源产品

PPTP VPN

PPTP VPN的最大优点是,不需要在windows客户端单独安装vpn客户端软件,windows默认就支持PPTP VPN拨号连接功能。PPTP VPN属于点对点方式的应用,比较适合远程的企业用户拨号到企业进行办公等的应用,但是很多网络设备不支持PPTP,导致无法访问。典型的Linux平台上的开源软件是pptp。

SSL VPN

PPTP主要为那些经常外出移动或家庭办公的用户考虑的,而OpenVPN不但可以使用于PPTP的应用场景,还适合针对企业异地两地总分公司之间的VPN不间断按需连接,例如:ERP,OA,及时通讯工具等在总分企业中的应用。但是需要在系统上单独安装客户端软件。典型的Linux平台的开源软件是openvpn。

IPSEC VPN

IPSEC VPN也适合针对企业异地两地总分公司或多个IDC机房之间的VPN不间断连接,并且在部署使用上更加方便,典型的Linux平台上IPSEC VPN的开源产品是openswan。

Linux平台搭建OpenVPN

环境规划

主机名 IP地址 操作系统版本 安装软件 运行的进程
odsee 172.16.4.81 CentOS 6.3 openvpn-2.2.2.tar.gz openvpn

配置vpn server时间同步

1
[root@odsee ~]# /usr/sbin/ntpdate pool.ntp.org


加入到定时任务:

1
2
[root@odsee ~]# echo '#time sync' >> /var/spool/cron/root
[root@odsee ~]# echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1' >>/var/spool/cron/root


注意:如果vpn服务器和拨号的计算机客户端时间不一致,可能会导致VPN连接失败。

安装openvpn

1.建立openvpn软件存放目录,并上传软件

1
2
3
[root@odsee ~]# cd /usr/local/
[root@odsee local]# mkdir openvpn
[root@odsee local]# cd openvpn/


注意:openvpn网上用的最多的是lzo-2.0.2和openvpn-2.0.9,这两个也是最稳定的。

2.安装lzo压缩模块

1
2
3
4
5
[root@odsee openvpn]# tar zxf lzo-2.06.tar.gz
[root@odsee openvpn]# cd lzo-2.06
[root@odsee lzo-2.06]# ./configure
[root@odsee lzo-2.06]# make
[root@odsee lzo-2.06]# make install

3.安装openvpn软件

1
2
3
[root@odsee lzo-2.06]# cd ..
[root@odsee openvpn]# tar zxf openvpn-2.2.2.tar.gz
[root@odsee openvpn]# cd openvpn-2.2.2

查看依赖包有没有安装,openvpn需要ssl支持:

1
[root@odsee openvpn-2.2.2]# rpm -qa|grep openssl


1
2
3
[root@odsee openvpn-2.2.2]# ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
[root@odsee openvpn-2.2.2]# make
[root@odsee openvpn-2.2.2]# make install

4.配置openvpn server,建立CA证书

1
2
3
[root@odsee openvpn-2.2.2]# cd easy-rsa/2.0/
[root@odsee 2.0]# cp vars vars20151204.bak
[root@odsee 2.0]# vim vars

在文件最后修改为如下内容:

export KEY_COUNTRY="CN"
export KEY_PROVINCE="JS"
export KEY_CITY="Nanjing"
export KEY_ORG="wisedu"
export KEY_EMAIL="salafeng1024@163.com"
export KEY_EMAIL=salafeng1024@163.com
export KEY_CN=CN
export KEY_NAME=wisedu
export KEY_OU=wisedu
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234


修改完vars文件后,执行source vars使修改生效:

清除所有证书keys:

1
[root@odsee 2.0]# ./clean-all

创建新的ca证书:


1
[root@odsee 2.0]# vim vars


1
[root@odsee 2.0]# source vars


1
2
[root@odsee 2.0]# ./clean-all
[root@odsee 2.0]# ./build-ca


查看生成的证书:

5.生成服务器端证书和密钥key文件

[root@odsee 2.0]# ./build-key-server server


也可以输入密码。

查看创建的服务端证书:

6.生成客户端证书和key文件

生成client证书和key文件。若建立多个客户端证书,则重复如下步骤即可。只需修改Common Name项的名称。

在openvpn中,这种配置方法是每一个登陆的VPN客户端需要一个证书,每个证书在同一时刻只能供一个客户端连接。下面建立1份客户端证书,key的名字叫test。在工作中一般名字为人的名字。



.crt是证书,.key是密钥文件。这两个都是客户端需要的。

注意:使用build-key给客户端生成证书和密钥,客户端拨号是不需要密码的。但是也可以加密码,使用build-key-pass脚本创建证书和密钥文件,这样你在客户端拨号的时候需要加密码,密码是拨号vpn的密码。

下面使用build-key-pass创建另一个客户端证书和密钥文件。

1
[root@odsee ~]# cd /usr/local/openvpn/openvpn-2.2.2/easy-rsa/2.0


7.生成vpn密钥协议交换文件

生成传输进行密钥交换时用到的交换密钥协议文件:

1
[root@odsee 2.0]# ./build-dh


查看生成的文件:

8.详解服务器及客户端的证书各文件用途


为了防止恶意攻击(如DOS、UDP port flooding),我们生成一个“HMAC firewall”:

1
[root@odsee 2.0]# openvpn --genkey --secret keys/ta.key


到此文件生成工作完成了。

9.详解服务器端VPN重要命令

  • vars脚本:是用来创建环境变量,设置所需要的变量的脚本
  • clean-all脚本:清理生成ca证书及密钥文件
  • build-ca脚本:生成ca证书(交互)
  • build-key-server脚本:生成服务器端密钥(交互)
  • build-key脚本:生成客户端密钥(交互)
  • build-key-pass脚本:生成客户端带密码的密钥文件(交互)
  • build-dh脚本:脚本生成Diffie-Hellman文件(交互)
  • pkitool脚本:直接使用vars的环境变量设置,直接生成证书(非交互)

10.详解openvpn服务端重要配置参数

  • 拷贝keys及配置
    1
    2
    3
    4
    [root@odsee 2.0]# mkdir /etc/openvpn/
    [root@odsee 2.0]# cp -ap keys/ /etc/openvpn/
    [root@odsee 2.0]# cd /usr/local/openvpn/openvpn-2.2.2/sample-config-files/
    [root@odsee sample-config-files]# cp client.conf server.conf /etc/openvpn/

  • 修改服务端配置文件
    原来的配置文件内容如下:
    1
    2
    3
    [root@odsee 2.0]# cd /etc/openvpn/
    [root@odsee openvpn]# grep -vE ";|#|^$" server.conf >tmp.log
    [root@odsee openvpn]# cat tmp.log >server.conf


最终修改后的文件内容如下:

local 172.16.4.81
port 52115
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
push "route 172.16.4.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 208.67.222.222"
#push "dhcp-option DNS 208.67.220.220"
push "dhcp-option DNS 114.114.114.114"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
client-to-client
duplicate-cn
log /var/log/openvpn.log

常用的配置说明:

配置参数 参数说明
local 10.0.0.28(外网卡地址) 哪一个本地地址要被openvpn进行监听
port 52115 监听的端口,默认是1194,这里为了安全起见,修改为52115
proto udp 指定监听的协议,当并发访问多时,推荐tcp
dev tun vpn server的模式采用路由模式,可选tap或tun
ca ca.crt ca证书,注意此文件和server.conf在一个目录下,否则要用绝对路径调用
cert server.crt
key server.key this file should be kept secret
dh dh1024.pem
server 10.8.0.0 这个是vpn server动态分配给vpn client的地址池,一般不需要更改。这个段不要和任何网络地址段冲突或者重复
ifconfig-pool-persist ipp.txt
push “route 172.16.1.0 255.255.255.0” 这个是vpn server所在的内网网段,如果有多个可以写多个push,注意,此命令实际作用是在vpn client本地生成vpn sever所在的内网网段路由,确保能够和vpn server所在的内网网段通信
client-to-client 允许拨号的多个vpn client互相通信
duplicate-cn 允许多个客户端使用同一个帐号连接
keepalive 10 20 每10秒ping一次,若是120秒未收到包,即认定客户端断线
comp-lzo 开启压缩功能
persist-key 当vpn超时后,当重新启动vpn后,保持上一次使用的私钥,而不重新读取私钥
persist-tun 通过keepalive检测vpn超时后,当重新启动vpn后,保持tun或者tap设备自动连接状态
status openvpn-status.log openvpn日志状态信息
log /var/log/openvpn.log 日志文件
verb 3 指定日志文件冗余

配置调试vpn并运行vpn服务

1.取消防火墙对vpnserver端口的限制以及允许服务转发。或者先关闭防火墙,调好VPN,在开启防火墙

1
[root@odsee ~]# service iptables stop

2.开启内核转发功能

1
[root@odsee ~]# sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#' /etc/sysctl.conf


1
[root@odsee ~]# sysctl -p

注意:iptables和内核的ip_forward都需要开启允许转发。

3.关闭SELinux

1
2
[root@odsee ~]# setenforce 0
[root@odsee ~]# vim /etc/sysconfig/selinux

4.启动服务端的VPN服务

1
2
[root@odsee openvpn]# /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &
[root@odsee openvpn]# netstat -anp|grep vpn


查看日志:

5.服务端查看虚拟网卡

安装windows VPN客户端,配置VPN连接

下载安装客户端

下载地址:http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe

安装过程中,有一步骤需要信任,见下图:

配置客户端证书

1
[root@odsee keys]# cd /usr/local/openvpn/openvpn-2.2.2/easy-rsa/2.0/keys/

先从vpnserver上把那个登录不需要密码的证书和密钥传下来:

1
2
3
[root@odsee keys]# sz ca.crt test.crt test.key
[root@odsee keys]# cd /usr/local/openvpn/openvpn-2.2.2/sample-config-files/
[root@odsee sample-config-files]# sz client.conf

把这些文件放到一个文件夹里:


把这个文件夹放到OpenVPN安装目录的config目录下:

配置客户端的配置文件Client.conf

备份配置文件:

可以在服务器上过滤配置文件,查看默认配置:

1
[root@odsee openvpn]# egrep -v "^#|^;|^$" client.conf



新建一个文件test.ovpn文件,然后贴入下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
client
dev tun
proto tcp
remote 172.16.4.81 52115
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert test.crt
key test.key
ns-cert-type server
comp-lzo
verb 3

拨号连接调试

在windows上拨号远程连接openvpn服务,先双击如下图标:

然后右下角右击图标,点击connect:


但是发现上不了网,能连上,查看连接vpn前的路由和连接vpn后的路由:

测试vpn客户端连接vpn server连通性的方法:

原因是:没有设置客户端的默认网关通过vpn出去:


最后改完的配置如下:

为什么dns不用8.8.8.8?因为这台vpn server(172.16.4.81) ping不通8.8.8.8

常见问题

1.拨号后地址也获取到了,但是就是访问别人时地址,别人那边看到的访问记录还是你原来的ip地址?

解决:以管理员身份运行软件,在拨号上网。

2.长时间不去生成证书,再次生成证书时如下:


解决:

1
2
3
[root@odsee 2.0]# source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/openvpn/openvpn-2.2.2/easy-rsa/2.0/keys
[root@odsee 2.0]# ./build-key-pass ldh


把生成的3个证书copy到/etc/openvpn/keys目录下。然后给别人用时给.crt .key以及ca.crt3个文件。

3.win10启动openvpn报错:


解决:
到openvpn安装后的bin下依次以管理员身份执行:delalltap.bat和addtap.bat

如果解决上面的问题,还是报错:

解决:
以管理员运行openvpn客户端。