Centos7下搭建openvpn

前言

自从公司配置了openvpn之后就可以在家里连到公司的内网,能访问部署在公司内网的项目。这让我对openvpn很感兴趣,于是我就开始查找相应的教程,并在寻找便宜的vps主机尝试搭建openvpn。我先后在华为云,腾讯云,搬瓦工上搭建了openvpn,不同的vps上搭建略有不同,但大体的原理是一样的。期间也遇到了不少坑,尝试搭建的过程大概花了一个多星期。在这里我想把搭建的过程以及遇到的问题纪录一下。

oepnvpn搭建

我使用过2种方式搭建过openvpn,一种是使用yum安装,另一种是通过docker-compose安装

yum方式安装

OpenVpn在默认的CentOS存储库中不可用。因此,我们需要安装Linux(EPEL)存储库。使用以下命令安装EPEL存储库

yum install epel-release

1. 安装openvpn

yum install openvpn -y

2. 安装Easy RSA

yum install easy-rsa -y

3. 配置openvpn

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

vi /etc/openvpn/server.conf

在编辑server.conf文件时要注意以下几个地方

1
2
3
4
5
6
7
8
dh dh2048.pem
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
user nobody
group nobody
log openvpn.log
;explicit-exit-notify 1

log openvpn.log这个配置可以看oepnvpn的启动和连接日志。我刚开始配置openvpn时没设置log,导致发生错误时不能准确找到错误原因,只能网上查错误的原因一个一个去尝试,效率非常低下。而有了log日志后出现问题就能比较准确定位了,比如;explicit-exit-notify 1,原始配置中是没有;的,启动openvpn时会报错,通过查看log日志能很快找到原因。个人觉得这个配置很重要,所以这里特别备注下。

4. 生成证书和秘钥

mkdir -p /etc/openvpn/easy-rsa/keys

cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

vi /etc/openvpn/easy-rsa/vars

vars中需要修改以下内容,

1
2
3
4
5
6
7
8
9
export KEY_COUNTRY="CH"
export KEY_PROVINCE="ZJ"
export KEY_CITY="HZ"
export KEY_ORG="DC"
export KEY_EMAIL="example@gmail.com"
export KEY_OU="Community"
export KEY_NAME="server"
. . .
export KEY_CN=openvpn.yourname.com

由于版本不可检测,OpenSSL配置可能无法加载。为了避免这种情况,从openSSl文件名中删除版本号。

cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

接下来进行服务端证书生成

cd /etc/openvpn/easy-rsa

source ./vars

./clean-all

./build-ca

./build-key-server server

./build-dh

cd /etc/openvpn/easy-rsa/keys

cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

客户端证书生成

cd /etc/openvpn/easy-rsa

./build-key client

5. 路由配置

安装iptables

yum install iptables-services -y

systemctl mask firewalld

systemctl enable iptables

systemctl stop firewalld

systemctl start iptables

iptables --flush

配置路由转发

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

iptables-save > /etc/sysconfig/iptables

开启路由转发

vi /etc/sysctl.conf

sysctl.conf中增加
net.ipv4.ip_forward = 1

重启网络服务

systemctl restart network.service

这一步很重要,如果网络服务重启失败,请排查原因。这里报错的话一般和网卡设置有关,在/etc/sysconfig/network-scripts目录下查看网卡设置是否正确。参考centos7网卡配置

6. 启动openvpn

设为开机启动
systemctl -f enable openvpn@server.service

启动openvpn

systemctl start openvpn@server.service

如果openvpn启动失败,请翻阅日志,日志默认在 /etc/openvpn路径下

至此服务端配置完毕。

7. 配置客户端

在服务端找到以下文件

/etc/openvpn/easy-rsa/keys/ca.crt

/etc/openvpn/easy-rsa/keys/client.crt

/etc/openvpn/easy-rsa/keys/client.key

把这些文件拷贝到客户端openvpn的config目录下

创建一个.ovpn配置文件,配置文件如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
client
dev tun
proto udp
remote your_server_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert client.crt
key client.key

要注意的是客户端的.ovpn文件与服务端的server.conf某些配置上需要保持一致,否则会连接失败。.ovpn也放到 openvpn的config目录下。

ca.crt,client.crt client.key与.opvn文件的集成:

在openvpn文件中使用<ca></ca>,<cert></cert>,<key></key>标签,把对应的文件内容复制粘贴到标签当中去。

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
client
dev tun
proto udp
remote your_server_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert client.crt
key client.key
<ca>
......
......
</ca>
<cert>
......
......
</cert>
<key>
......
......
</key>

docker-compose方式安装

1.创建一个docker-compose.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
version: '2'
services:
openvpn:
cap_add:
- NET_ADMIN
image: kylemanna/openvpn
container_name: openvpn
ports:
- "1194:1194/udp"
restart: always
volumes:
- ./openvpn-data/conf:/etc/openvpn

2.初始化配置文件和安装证书

1
2
docker-compose run --rm openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM
docker-compose run --rm openvpn ovpn_initpki

3. 启动openvpn

docker-compose up -d openvpn

4. 查看启动日志

docker-compose logs -f

5.生成客户端证书

1
2
3
export CLIENTNAME="your_client_name"
docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME

6. 生成集成客户端.ovpn文件

docker-compose run --rm openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn

搭建openvpn过程中遇到的那些坑

1.华为云上搭建好了openvpn,客户端一直连接不上。

原因: 华为云中有个安全策略设置,安全策略中1194端口没有开放,需要开放后才能连接。安全策略设置在华为云后台控制中设置

2. 搬瓦工vps中安装不了docker。

原因:
使用docker-compose方式安装openvpn需要先安装docker。搬瓦工采用openvz架构搭建,其linux内核版本为2.6.32-042stab120.18,不可升级,而docker需要linux内核3.1以上,所以搬瓦工上不能安装docker,也不能使用docker-compose的方式安装openvpn。

3. 搬瓦工上openvpn连接上了,但不能上网。

原因: 转发失败,由于搬瓦工上一个网卡上有两个ip地址所致,默认转发到第一个ip地址上。

解决办法:

编辑转发配置文件

vi /etc/sysconfig/iptables

删除原来的转发规则

-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

新增转发规则

-A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to-source your ip

保存后重启网络即可

systemctl restart network

结束语

openvpn搭建只要弄懂了它的实现原理,按照步骤一步步搭建,还是很容易成功。遇到问题先看日志,准确定位问题发生的环节,就能针对性解决问题。我在搭建过程中一般出现问题就是在转发规则配置的地方,不同的vps在这上面配置可能存在着差异,需要根据vps的实际情况进行配置。搭建openvpn中对于centos7中的网络配置这块内容也了解了不少,算是收获良多,搭建成功以后也是满满的成就感!在此把搭建过程和遇到过的问题纪录了下,方便以后查阅。

参考资料

docker-compose方式安装openvpn

centos7安装openvpn