文章来源:

https://blog.51cto.com/qiangsh/2061725

 

什么是openV pn?

OpenV pn是一个基于OpenSSL库的应用层V pn实现

openV pn可工作于两种模式:

tun 一种是IP遂道路由模式,主要应用于点对点
eth 一种是基于以太网的遂道桥模式, 应用于点对多点,有多个分支机构
1.
2.
openV pn提供两种安全模式:

Static Key
X509 PKI (Public Key Infrastructure)
1.
2.
环境准备
#同步服务器时间

# crontab –e
添加脚本例子如下:
*/20 * * * *  /usr/sbin/ntpdate 1.cn.pool.ntp.org        //每20分钟执行一次
1.
2.
3.
#关闭selinux

setenforce 0
sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config
1.
2.
#启用转发

echo 1 > /proc/sys/net/ipv4/ip_forward
//或直接vim /proc/sys/net/ipv4/ip_forward 修改值为1

#检验
cat /proc/sys/net/ipv4/ip_forward
1
1.
2.
3.
4.
5.
6.
**#安装和打开iptables **

systemctl mask firewalld  #冻结服务,unmask解冻
systemctl enable iptables
systemctl stop firewalld
systemctl start iptables
iptables --flush
1.
2.
3.
4.
5.
#安装openssl和lzo,lzo用于压缩通讯数据加快传输速度.
yum -y install unzip openssl openssl-devel lzo

TUN/TAP

** OpenV pn要使用到TUN/TAP作为接口建立隧道,但需要内核支持。TUN 接口创建的是三层路由隧道,建立方便;**

TAP 是二层网卡桥接隧道,即创建一个以太网桥接,相对复杂。
TUN 接口下所有的客户端处于一个完全独立的子网内,与 V pn 服务器所在的子网没有关系;
TAP 接口的好处相较之下则相当明显,客户端可以获得 V pn 服务器所处子网的 IP(即,忽略物理上的区别,可以完全将客户端看做是于 V pn 服务器处于同一子网的另一台机器)
1.
2.
3.
1. 检查内核是否支持TUN/TAP设备驱动
 modinfo tun    #如果有正常的输出,则支持
  
2. 确定内核支持TUN/TAP模块之后,加载模块
 modinfo tun    # 加载
 lsmod tun     # 检查
 ls /dev/net/tun  # 检查文件是否存在判断tun模块是否加载
1.
2.
3.
4.
5.
6.
7.
#安装epel源
需要安装额外的软件包的企业Linux(EPEL)库。因为Openv pn不在默认的CentOS的软件库。EPEL库是一个额外的库由Fedora项目包含非标准但流行包。

yum install epel-release
1.
安装软件
一、OpenV pn安装配置
1. 安装openv pn
yum install openv pn

二、 安装最新的easy-rsa
该包用来制作ca证书,服务端证书,客户端证书。最新的为easy-rsa3。

1.下载解压

wget https://github.com/Openv pn/easy-rsa/archive/master.zip
unzip master.zip
1.
2.
2.将文件重命名为easy-rsa,然后复制到/etc/openv pn/目录下
mv easy-rsa-master/ /etc/openv pn/easy-rsa/

3. 进入/etc/openv pn/easy-rsa/easyrsa3目录,复制vars.example为vars

cd /etc/openv pn/easy-rsa/easyrsa3/
cp vars.example vars
1.
2.
#编辑vars文件,根据自己环境配置修改下面字段

vim vars

//以下字段根据自己实际情况更改,这些信息前面是有#注释的,去掉#号
set_var EASYRSA_REQ_COUNTRY “CN” #国家
set_var EASYRSA_REQ_PROVINCE “GuangDong” #省份
set_var EASYRSA_REQ_CITY “GuangZhou” #城市
set_var EASYRSA_REQ_ORG “tielemao” #非盈利组织,此处可填公司之类
set_var EASYRSA_REQ_EMAIL “wwz@tielemao.com” #邮箱地址
set_var EASYRSA_REQ_OU “My Open×××” #组织单元
1.
2.
3.
4.
5.
6.
7.
8.
9.
创建服务端证书及key
1. 初始化./easyrsa init-pki

cd /etc/openv pn/easy-rsa/easyrsa3
./easyrsa init-pki
---------------------------------------------------------
Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/open***/easy-rsa/easyrsa3/pki
1.
2.
3.
4.
5.
6.
7.
8.
9.
2. 创建根证书

./easyrsa build-ca
1.

#生成的根证书文件为:/etc/openV pn/easy-rsa/easyrsa3/pki/ca.crt

3.创建服务器端证书
./easyrsa gen-req server nopass

生成的证书文件有两个,注意这个时候这两个文件还不是服务端证书:

4.签约服务端证书

./easyrsa sign server server
#注,这里前一个server表示注册的是server端,后一个server是可以自行定义的名字,但是要和前面命令起的名字一致,我这里一致都是server。
1.
2.


5.创建Diffie-Hellman

#确保key穿越不安全网络
./easyrsa gen-dh
1.
2.


6. 将下列证书文件放到/etc/openv pn/server/ 目录

cp /etc/openv pn/easy-rsa/easyrsa3/pki/ca.crt /etc/openv pn/server/
cp /etc/openv pn/easy-rsa/easyrsa3/pki/private/server.key /etc/openv pn/server/
cp /etc/openv pn/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openv pn/server/
cp /etc/openv pn/easy-rsa/easyrsa3/pki/dh.pem /etc/openv pn/server/
1.
2.
3.
4.
创建客户端证书
1. 新建client文件夹

#新建client文件夹,文件夹可随意命名,然后拷贝前面解压得到的easy-ras文件夹到client文件夹,进入下列目录:

mkdir /etc/openv pn/client
cp -R /etc/openv pn/easy-rsa/ /etc/open***/client/
cd /etc/openv pn/client/easy-rsa/easyrsa3/
1.
2.
3.
4.
5.
2. 初始化

# 仅首次创建时执行,建立一个空的pki结构,生成一系列的文件和目录
./easyrsa init-pki
1.
2.


3. 创建客户端key及生成证书(记住和之前的操作一样生成时是自己输入的密码)
./easyrsa gen-req client-test //名字自己定义

4. 将生成的client-wwz.req导入然后签约客户端证书

#返回到/etc/openv pn/easy-rsa/easyrsa3/
cd /etc/openv pn/easy-rsa/easyrsa3/

#导入req
./easyrsa import-req /etc/openv pn/client/easy-rsa/easyrsa3/pki/reqs/client-test.req client-test
1.
2.
3.
4.
5.


5.签约证书

./easyrsa sign client client-test
#这里生成client所以必须为client,client-test要与之前导入名字一致;
#上面签约证书跟server类似,期间还是要输入CA的密码
1.
2.
3.

客户端证书路径在: /etc/openv pn/easy-rsa/easyrsa3/pki/issued/client-test.crt

6. 将下列文件放到/etc/openv pn/client/ 目录下

cp /etc/openv pn/easy-rsa/easyrsa3/pki/ca.crt /etc/openv pn/client/
cp /etc/openv pn/easy-rsa/easyrsa3/pki/issued/client-test.crt /etc/openv pn/client/
cp /etc/openv pn/client/easy-rsa/easyrsa3/pki/private/client-test.key /etc/openv pn/client/
1.
2.
3.


配置OpenVp n
1. 配置openv pn

#复制Openv pn示例配置文件server.conf文件作为自己的配置文件
cp /usr/share/doc/openv pn-2.4.6/sample/sample-config-files/server.conf /etc/openv pn/
1.
2.
2.修改server.conf配置

vi /etc/openv pn/server.conf

//主要修改如下几项(其余都使用了默认配置):
local 172.17.100.140            # 填自己openvp n服务器的 IP,默认侦听服务器上的所有ip
port 1194                     # 侦听端口,默认1194
proto tcp                     # 端口协议,默认udp,也可以开启tcp方便映射转发。
dev tun                       # 默认创建一个路由IP隧道

ca /etc/openv pn/server/ca.crt        # 根证书
cert /etc/openv pn/server/server.crt  # 证书
key /etc/openv pn/server/server.key   # 私钥文件/重要保密
dh /etc/openv pn/server/dh.pem

crl-verify /etc/openv pn/easy-rsa/easyrsa3/pki/crl.pem
#根据文件crlin PEM格式检查对等证书。当特定密钥被泄露但总体PKI仍然完好时,使用CRL(证书撤销列表)。
#假设您有一个由CA,根证书和许多客户端证书组成的PKI。
#假设包含客户端密钥和证书的笔记本电脑被盗。通过将被盗证书添加到CRL文件,您可以拒绝任何尝试使用它的连接,同时保留PKI的整体完整性。
#只有在根证书密钥本身受到损害的情况下才需要从头开始重建整个PKI。

server 10.66.88.0 255.255.255.0
# 设置服务器端模式,并提供一个VP N子网,以便于从中为客户端分配IP地址。服务器自身会使用10.66.88.1这个ip。

ifconfig-pool-persist ipp.txt 
# 指定用于记录客户端和虚拟IP地址的关联关系的文件。
# 当重启OpenVP N时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址

push “route 10.0.0.0 255.0.0.0” 
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。
# (简而言之,就是允许客户端访问VP N服务器自身所在的其他局域网)
# 这些私有子网也要将OpenVP N客户端的地址池(10.66.88.0/255.255.255.0)反馈回Open×××服务器。

push "redirect-gateway def1 bypass-dhcp" 
# 启用该指令,所有客户端的默认网关都将重定向到VP N,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VP N。
# (为确保能正常工作,OpenVP N服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)

push "dhcp-option DNS 114.114.114.114"
# 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。
# 实际上可用于推送内网dns或阿里内网dns等。

keepalive 30 240 
# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。
# 默认每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。比较频繁,建议改成30 240?

comp-lzo 
# 在v pn连接上启用压缩。如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。

max-clients 100 
#默认最大客户端连接100,为安全可限到1或2。

persist-key
persist-tun
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。

status openv**-status.log 
# 状态日志

verb 3
# 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。

client-to-client  
# 允许客户端之间可见,默认情况下,客户端只能看到服务器。

explicit-exit-notify 1
# 通知客户端服务器重新启动时,可以自动重新连接。

user nobody
group nobody
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
还有许多详细配置,可查看官网说明。

注意, 如果想在win7中使用open***的同时, 又想连接局域网内的其他主机, 比如:192.168.1.100, 可以通过添加一条路由规则来实现:
route add -net 10.8.0.0/24 gw 192.168.1.108
#其中192.168.1.108为我的wi7主机的内网ip.

防火墙配置
开启地址转换(eth0为外网网卡,根据实际情况替换。)

iptables -t nat -A POSTROUTING -s 10.66.88.0/24 -o eth0 -j MASQUERADE
iptables -I FORWARD -s 10.66.88.0/24 -j ACCEPT
iptables -I FORWARD -d 10.66.88.0/24 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT

service iptables save
/bin/systemctl restart iptables.service
1.
2.
3.
4.
5.
6.
7.
启动服务
1. VMware虚拟机可能还需加载tun内核模块

#加载tun内核模块以便于open***生成虚拟网卡。
[root@my-*** open***]# modprobe tun

#检验加载是否成功**
[root@my-*** open***]# lsmod | grep tun
tun                    31621  0 

[root@my-*** open***]# locate tun.ko
/usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/net/tun.ko
/usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/net/tun.ko.xz
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
2. 生成ta.key密钥
openv pn --genkey --secret /etc/openv pn/ta.key

3. 启动openV pn服务

systemctl -f enable openv pn@server.service
systemctl start openv pn@server.service
systemctl status openv pn@server.service
1.
2.
3.
所有的配置文件已经准备好,接下来是在不同的平台上连接Open×××服务器。

Windows连接方式
1. 首先从服务器拷贝下列文件到客户端设备

#可以通过secure crt客户端,使用rz、sz命令传输以下文件:
/etc/open***/client/ca.crt
/etc/open***/client/client-test.crt
/etc/open***/client/client-test.key
/etc/open***/ta.key
1.
2.
3.
4.
5.
2. 客户端设备上创建client.opvn文件
#客户端设备上创建client.opvn文件,这是Open××× 客户端配置文件;
配置文件如下所示,大部分地方需要与服务器配置匹配。

client
dev tun
proto tcp
remote xxx.xxx.xxx.xxx 1194 //主要这里修改成open***服务器的外网ip
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client-test.crt
key client-test.key
tls-auth ta.key 1    ; 服务器需要设置为0, 客户端需要配置为1.
cipher AES-256-CBC    ; ubuntu和os x上面必须指定,否则会出现错误。
comp-lzo
auth-nocache
verb 3
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
3. 打开OpenV pn Gui(必须要使用管理员权限打开),右击连接后即可。

解决客户端登录时提示:

WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
1.
解决办法在客户端配置文件中添加
auth-nocache

其他连接方式
Ubuntu:

a. 安装open***
apt-get install open***

b. 开启open***
sudo open*** --config ~/path/to/client.o***
1.
2.
3.
4.
5.
OS X:

a. 下载Tunnelblick 软件。安装

b. 复制配置文件到~/Library/Application Support/Tunnelblick/Configurations 目录

c. 如果连接后不能FQ上外网时,详情里面设置DNS服务器为不指定。
1.
2.
3.
4.
5.
**Android: **

a. google play中下载open*** connect安装,(国内无法下载,可网上查找相关的apk安装)

b. 安卓手机连接电脑拷贝配置文件到手机存储中

c. 打开open*** connect选择手机中查找配置文件,选中client.opvn后即可,点击connect后连接Open×××。
1.
2.
3.
4.
5.
IOS:

a. 由于国内的appid在app store中不能下载open*** connect。所以需要先另外注册一个国外的apple id,例如新西兰。

b. 注册好后登录app store中下载open*** connect。下载安装好后可以再使用国内apple id。

c. 通过PC端的ITools软件,找到Open××× Connect软件,打开共享文件,会看到document文件,进入document文件夹后,把配置文件拖入此文件夹。

d. 打开open*** connect会自动检测配置文件,并通过滑动条连接,会弹出提示框确认是否使用×××,点击是以后会连接×××。
1.
2.
3.
4.
5.
6.
7.
同时监听TCP和UDP端口
之前用的是TCP协议,因为公司网络可能出于安全角度考虑,封禁了常见×××协议的默认端口和协议,UDP也被封了。虽然用TCP协议连回去也工作得很正常,但我还是想在可以的时候使用UDP协议连上Raspberry Pi,比如在运营商并不对UDP协议强力QoS时,Open××× over UDP会有较小的latency。

要让OpenV pn同时监听TCP和UDP端口方法不止一种,我用了最简单的办法。

把/etc/openv pn/server.conf复制一份,比如/etc/openv pn/udp.conf,然后修改udp.conf:
proto udp #协议修改为UDP

IP地址修改略作修改,比如所有原来是10.66.88.x的地方,都改为10.66.90.x
然后修改iptables,增加一条nat规则:
iptables -t nat -A POSTROUTING -s 10.66.90.0/24 -o eth0 -j MASQUERADE

最后,再运行一个OpenV pn进程,通过命令行参数指定新的配置文件:
/usr/sbin/openv pn --daemon ov pn-server --status /run/openv pn/server.status 10 --cd /etc/openv pn --config /etc/openv pn/udp.conf

这样,就应该可以以UDP协议连上server了
-----------------------------------
©著作权归作者所有:来自51CTO博客作者qianghong000的原创作品,请联系作者获取转载授权,否则将追究法律责任
Centos7搭建openV pn服务器
https://blog.51cto.com/qiangsh/2061725

评论

发表评论

关于我

8年以上程序开发,熟用php、python、js(jquery、angular)、C等语言,&数据库等。熟悉国内部份开源软件。应用过php socket、vb socket等物联网应用开发设计。对系统设计、分析、团队带领有多年经验,有大型移动项目开发管理经验,对App接入设计管理有较熟悉。多数据量数据库设计使用经验,对高并发负荷系统有深入了解与研究。不喜平淡无挑战性的工作,期待能高迁业务稳定的公司,同时也欢迎各位boss、技术大牛有项目或者技术上的合作!

IM与我联系