Myluzh Blog

CentOS7搭建OpenVPN Server

发布时间: 2023-2-2 文章作者: myluzh 分类名称: OpenVPN 朗读文章


0x01 安装OpenVPN
#临时关闭selinux
setenforce 0
#添加epel yum源
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean
yum makecache
#yum安装包
yum install openvpn -y

0x02 证书制作
# 下载安装easy-rsa
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.2/EasyRSA-3.1.2.tgz
tar xf EasyRSA-3.1.2.tgz
mkdir -p /etc/openvpn/easy-rsa3
cp -r EasyRSA-3.1.2/* /etc/openvpn/easy-rsa3

# 进入easy-rsa3目录
cd /etc/openvpn/easy-rsa3/
#初始化目录
./easyrsa init-pki

# 复制vars文件模板
cp /etc/openvpn/easy-rsa3/vars.example /etc/openvpn/easy-rsa3/vars
# 编辑vars文件
vim vars
set_var EASYRSA_REQ_COUNTRY     "CN"
set_var EASYRSA_REQ_PROVINCE    "Zhejiang"
set_var EASYRSA_REQ_CITY        "Hangzhou"
set_var EASYRSA_REQ_ORG         "ITHO"
set_var EASYRSA_REQ_EMAIL       "support@itho.cn"
set_var EASYRSA_REQ_OU          "ITHO OpenVPN"
#移动vars文件到pki目录
mv vars ./pki/

#创建根证书 #nopass 参数表示不加密;也可以不加此参数,那就需要输入密码短语
./easyrsa build-ca nopass
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:ITHO

#创建服务端秘钥
./easyrsa gen-req server nopass
Common Name (eg: your user, host, or server name) [server]:ovpnServer
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa3/pki/reqs/server.req
key: /etc/openvpn/easy-rsa3/pki/private/server.key

#给服务端证书签名,这里要输入yes才能完成
./easyrsa sign-req server server
Type the word 'yes' to continue, or any other input to abort.
 Confirm request details: yes
Certificate created at:
* /etc/openvpn/easy-rsa3/pki/issued/server.crt

#创建客户端秘钥
./easyrsa gen-req client nopass
Common Name (eg: your user, host, or server name) [client]:ovpnClient
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa3/pki/reqs/client.req
key: /etc/openvpn/easy-rsa3/pki/private/client.key

#给客户端证书签名,这里要输入yes才能完成
./easyrsa sign-req client client
Certificate created at:
* /etc/openvpn/easy-rsa3/pki/issued/client.crt

#创建Diffie-Hellman
./easyrsa gen-dh
DH parameters of size 2048 created
at: /etc/openvpn/easy-rsa3/pki/dh.pem

#创建TLS认证密钥
openvpn --genkey --secret /etc/openvpn/ta.key

# 拷贝证书到目录
# 目录自定义,openvpnserver配置文件中需要用到
cd /etc/openvpn/easy-rsa3/pki/
cp ca.crt dh.pem /etc/openvpn/
cp private/server.key issued/server.crt /etc/openvpn/server/
cp private/client.key issued/client.crt /etc/openvpn/client/

0x03 编辑server.conf配置文件
#修改文件目录权限
chown root.openvpn /etc/openvpn/* -R
cd /etc/openvpn/
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf ./
vim server.conf
#监听本机ip地址 
local 0.0.0.0(这里填本机地址)
#监控本机端口号
port 1194
#指定采用的传输协议,可以选择tcp或udp
proto tcp
#指定创建的通信隧道类型,可选tun或tap
dev tun
#指定CA证书的文件路径
ca /etc/openvpn/ca.crt
#指定服务器端的证书文件路径
cert /etc/openvpn/server/server.crt
#指定服务器端的私钥文件路径
key /etc/openvpn/server/server.key
#指定迪菲赫尔曼参数的文件路径
dh /etc/openvpn/dh.pem
#指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用.1的ip地址
server 10.8.0.0 255.255.255.0
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
ifconfig-pool-persist ipp.txt
#自动推送客户端上的网关及DHCP
push "redirect-gateway def1 bypass-dhcp"
#OpenVPN的DHCP功能为客户端提供指定的 DNS、WINS 等
push "dhcp-option DNS 8.8.8.8"
#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client
#每10秒ping一次,连接超时时间设为120秒
keepalive 10 120
#开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
tls-auth /etc/openvpn/ta.key 0
#加密认证算法
cipher AES-256-CBC
#使用lzo压缩的通讯,服务端和客户端都必须配置
comp-lzo
#最大连接用户
max-clients 100 
#定义运行的用户和组
user openvpn
group openvpn
#重启时仍保留一些状态
persist-key
persist-tun
#输出短日志,每分钟刷新一次,以显示当前的客户端
status /var/log/openvpn-status.log
#日志保存路径
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
mute 10

0x04 配置系统转发和开放端口(云服务器记得安全组要开放对应端口)
4.1启用转发
#/etc/sysctl.conf 配置文件中添加
net.ipv4.ip_forward=1
#生效
sysctl -p
4.2 centos6 使用iptables
#iptables
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE #这条有问题,写下面这条
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
#如果你之前防火墙是直接关了的 这边开启防火墙后 你的web端口 ssh端口都需要自己再开一下
iptables -t nat -L
#保存规则并重启
service iptables save
systemctl restart iptables
4.2 centos 7 使用firewalld
systemctl start firewalld.service
firewall-cmd --state
firewall-cmd --zone=public --list-all
firewall-cmd --add-service=openvpn* --permanent
firewall-cmd --add-port=1195/udp --permanent
firewall-cmd --add-port=22/tcp --permanent
firewall-cmd --add-source=10.8.0.0 --permanent
firewall-cmd --query-source=10.8.0.0 --permanent
firewall-cmd --add-masquerade --permanent
firewall-cmd --query-masquerade --permanent
4.3 重启网络服务
systemctl restart network.service

0x05 启动 OpenVPN 服务
#启动 OpenVPN 服务
systemctl start openvpn@server
#确认服务进程是否存在
netstat -lntp|grep openvpn
ps -aux|grep openvpn
#这里可能会无法启动报错,最后说解决办法

0x06 客户端连接测试
在 A 目录新建 client.ovpn 配置文件,内容如下:
#客户端配置文件
client
dev tun
proto tcp
remote 你的服务器ip/域名 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
tls-auth ta.key 1
cipher AES-256-CBC
auth-nocache
verb 4

0x07 错误记录

7.1 启动失败
在服务端启动 OpenVPN 的时候,启动失败并报错
Job for openvpn@server.service failed because the control process exited with error code. See "systemctl status openvpn@server.service" and "journalctl -xe" for details.
查看状态 systemctl status openvpn@server.service,根据提示重新检查配置 和 iptables
certificate verify failed
这里主要是客户端和服务端的时间不一致造成的,首页此博文最开始就强调了时间的问题,如果时间不一致,需要调整好时间后重新生成证书才可以。
OpenVPN Bad LZO decompression header byte: 69
客户端连接的时候,提示连接成功,但是会报这个错误然后卡住。这个主要是服务得的配置有 comp-lzo adaptive 这一行,客户端配置里没有,所以需要在客户端配置文件 client.ovpn 里加上一行 comp-lzo ,此配置的默认值就是 adaptive
explicit-exit-notify
explicit-exit-notify 1
#此选项开启只能使用udp协议。否则会报错error: --explicit-exit-notify can only be used with --proto udp

7.2 连上后访问外网不通,ping 10.8.0.1也不通
# 确保有两条tun0路由
route -n
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0

0x08 自用配置
8.1 服务端配置 server.conf
[root@VM-12-17-centos ~]# cat /etc/openvpn/server.conf
local 0.0.0.0
port 1195
proto udp
dev tun
ca ./ca.crt
cert ./server/server.crt
key ./server/server.key
dh ./dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push 'redirect-gateway def1 bypass-dhcp'
push 'dhcp-option DNS 223.5.5.5'
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ./ta.key 0
cipher AES-256-GCM
verb 3
mute 10
# 下面这几行是开启了ovpn设置账号密码登陆,详见:OpenVPN设置账号密码登陆
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
username-as-common-name
verify-client-cert none
8.2 客户端配置 clietn.ovpn
# OvpnClientConfig
client
dev tun
proto udp
remote 121.4.185.211 1195
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher AES-256-GCM
auth-nocache
verb 3
# 账号密码登录
auth-user-pass
# 证书认证登录
;cert admin.crt
;key admin.key


#ca证书
<ca>
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
</ca>

#客户端证书
<cert>
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
</cert>

#客户端密钥
<key>
-----BEGIN PRIVATE KEY-----

-----END PRIVATE KEY-----
</key>

#ta.key文件内容
key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----

-----END OpenVPN Static key V1-----
</tls-auth>


0x09 其他
https://www.zhihu.com/column/p/154309923?utm_medium=social&utm_source=weibo

标签: centos openvpn easy-rsa

发表评论