Write by lyc at 2022-4-22
openvpn.net
OpenVPN 中文文档
2. 配置文件说明
OpenVPN安装
Centos7 下搭建 OpenVPN 2.4.8
OpenVPN 客户端服务器模式架构图例

一、OpenVPN 服务器端部署
1.Linux 服务器环境准备
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
| systemctl disable firewalld systemctl stop firewalld
yum -y install iptables iptables-services
iptables -F && iptables -X && iptables -Z iptables -t nat -F && iptables -t nat -X && iptables -t nat -Z iptables-save > /etc/sysconfig/iptables
systemctl enable iptables systemctl start iptables
sed -i "/^SELINUX/s/enforcing/disabled/" /etc/selinux/config setenforce 0
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
yum install -y epel-release yum update -y
|
查看操作系统内核及版本号
1 2 3 4 5
| $ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
$ uname -a Linux 10-19-108-247 4.19.188-10.el7.ucloud.x86_64
|
2.创建PKI证书
创建过程参考文档 《OpenVPN easy-rsa管理证书》
3.OpenVpn 服务器端配置
安装 openvpn server
1 2 3 4 5
| yum install -y openvpn
$ rpm -qa|grep openvpn openvpn-2.4.12-1.el7.x86_64
|
主配置文件
OpenVPN的配置模板(一)之服务器模式
创建日志目录
1 2
| mkdir -p /etc/openvpn/server/ccd
|
编排主配置文件
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
| $ vim /etc/openvpn/server/server.conf port 1194 proto udp dev tun
ca /etc/openvpn/server/certs/ca.crt cert /etc/openvpn/server/certs/server.crt key /etc/openvpn/server/certs/server.key dh /etc/openvpn/server/certs/dh.pem tls-auth /etc/openvpn/server/certs/ta.key 0
server 10.201.0.0 255.255.255.0 topology subnet
push "route 10.19.0.0 255.255.0.0"
compress lzo duplicate-cn keepalive 10 60 comp-lzo
persist-key persist-tun user openvpn group openvpn
log /var/log/server.log log-append /var/log/server.log status /var/log/status.log
verb 3 explicit-exit-notify 1
|
openvpn 启动
systemd 脚本
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ vim /etc/systemd/system/openvpn-server.service [Unit] Description=openvpn After=network.target
[Service] ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/server.conf Restart=on-failure Type=simple LimitNOFILE=65536
[Install] WantedBy=multi-user.target
|
启动
1 2 3 4
| chown -R openvpn.openvpn /etc/openvpn systemctl daemon-reload systemctl enable openvpn-server.service systemctl start openvpn-server.service
|
4.tun0 隧道的回包问题
1.9. 服务器或客户端子网中的其他计算机互相访问
从客户端表现出来的问题是:openvpn 客户端能够正常拨入 openvpn 服务端,能够建立加密的通信隧道 tun0,能够 ping 通服务端的 eth0 的内网 ip,也能够 ping 通隧道的 ip 10.201.0.0,却 ping 不通 openvpn server 所在局域网的其他服务器。
究其原因原因就是:openvpn server 所在局域网的其他服务器上并没有返回 tun0 隧道的回包路由,它们能够收到来自客户端的 ping 包,却不知道如何回包(没有路由表)。有两种方式来解决回包问题:
方式1:为需要连通 tun0 隧道的个别主机添加回包路由
该方式的优缺点:
- 优点:可以指定个别几台服务器能够让 tun0 隧道通信,客户端访问最小化权限。
- 缺点:配置繁琐,要逐一登录到目标服务器上去加回包路由。但是云实例 UDB, URedis 不像云主机,是无法添加路由的,所以也无法访问运实例。
注意回包路由是 openvpn server 所在局域网的其他服务器上配置的,添加的网络号是 tun0 隧道网段,下一跳指向 openvpn server eth0 的 IP 地址。
1 2 3 4 5 6 7 8 9 10 11
| $ route add -net 10.201.0.0/24 gw 10.19.108.247 dev eth0
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.19.0.1 0.0.0.0 UG 0 0 0 eth0 10.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 10.201.0.0 10.19.108.247 255.255.255.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
|
方式2:iptables SNAT(推荐)
1.9.1. 防火墙规则
在 openvpn server 服务器上的 iptables nat 表上添加转发规则,让 tun0 隧道过来的数据包伪装成本机的内网地址发给其他局域网服务器(SNAT)。
1 2 3 4 5 6 7
|
iptables -A FORWARD -o tun+ -d 10.201.0.0/24 -j ACCEPT
iptables -A FORWARD -i tun+ -s 10.201.0.0/24 -j ACCEPT
iptables -A FORWARD -i tun+ -s 10.201.0.0/24 -d 10.66.0.33 -j ACCEPT
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| *nat
iptables -t nat -A POSTROUTING -s 10.201.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 10.201.0.0/24 -j MASQUERADE
*filter iptables -t filter -A FORWARD -o tun+ -d 10.201.0.0/24 -j ACCEPT iptables -t filter -A FORWARD -i tun+ -s 10.201.0.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 10.201.0.101/32 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth1 -s 10.201.0.105/32 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
|
三层交换机添加路由(可选)
另外如果是公司环境,应在三层交换机上添加回包路由,下一条为vpnopen服务器
1 2 3 4
| # 思科3560 config terminal switch3560-1(config)# ip route 10.201.0.0 255.255.255.0 ${openvpn_server_eth0_ip} exit
|
二、OpenVpn 客户端
OepnVPN 官网下载
1.openvpn Windows 客户端
安装与配置
下载 win10 客户端,全部保持默认安装

拷贝客户端证书压缩包 user001.zip
到 openvpn client 的安装目录下 C:\Program Files\OpenVPN
, 解压并重命名为 config

查看 openvpn 客户端主配置文件:C:\Program Files\OpenVPN\config\client.ovpn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| client proto udp dev tun nobind remote xxx.xxx.xxx.xxx 1194 ca ca.crt cert user001.crt key user001.key tls-auth ta.key 1 remote-cert-tls server persist-tun persist-key comp-lzo verb 3 mute-replay-warnings
|
启动 openvpn 客户端
双击桌面图标启动,右下角任务栏小图标右击可控制断开或重新连接。

2.openvpn Linux 客户端(CentOS7)
Linux 客户端安装 openvpn
1 2 3 4 5 6 7
| yum install -y epel-release yum install -y openvpn
mkdir -p /etc/openvpn/client/certs mkdir -p /var/log
|
openvpn 客户端主配置文件
上传客户端证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| cd /etc/openvpn/client/certs rz user002.zip unzip user002.zip
$ tree /etc/openvpn/client/certs/user002 /etc/openvpn/client/certs/user002 ├── ca.crt ├── ta.key ├── user002.crt ├── user002.key └── user002.ovpn
0 directories, 5 files
|
编排主配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $ vim /etc/openvpn/client/user002.conf client proto udp dev tun nobind remote ${OPENVPN_SERVER_HOST} 1194 ca /etc/openvpn/client/certs/user002/ca.crt cert /etc/openvpn/client/certs/user002/user002.crt key /etc/openvpn/client/certs/user002/user002.key tls-auth /etc/openvpn/client/certs/user002/ta.key 1 remote-cert-tls server persist-tun persist-key comp-lzo verb 3 mute-replay-warnings log /var/log/openvpn.log log-append /var/log/openvpn.log
|
授权目录
1 2
| chown -R openvpn.openvpn /etc/openvpn chown -R openvpn.openvpn /var/log
|
开机自启动
systemd 脚本
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ vim /etc/systemd/system/openvpn-client.service [Unit] Description=openvpn After=network.target
[Service] ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client/user002.conf Restart=on-failure Type=simple LimitNOFILE=65536
[Install] WantedBy=multi-user.target
|
启动
1 2 3
| systemctl daemon-reload systemctl enable openvpn-client.service systemctl start openvpn-client.service
|