大概阅读时间10分钟
什么是OpenVPN
简介
OpenVPN是一个开源的虚拟私人网络 (VPN) 解决方案。它是一个基于SSL/TLS协议的虚拟私人网络(VPN)解决方案,通过建立加密的隧道连接,实现远程访问、安全通信和隐私保护,防止未经授权的访问者窃取或窥视通信内容。它被广泛用于企业内部网络、远程办公、跨地区连接以及保护个人隐私等方面。对于个人或小型企业来说,OpenVPN是一个简单、易用、安全的VPN解决方案。接下来我们具体介绍OpenVPN的安装和配置。
工作方式
OpenVPN 的工作原理及数据加密基本和HTTPS类似:
-
建立连接:
OpenVPN 通常使用证书或预共享密钥进行身份验证,以确保连接的双方是合法的。一旦身份验证成功,双方才能开始建立安全通信隧道。 -
建立隧道:
OpenVPN 使用SSL/TLS协议来建立安全通信隧道。它可以在 TCP 或 UDP 协议上运行,通常使用UDP以提供更好的性能。一旦连接建立,OpenVPN 通过 TLS (关于这部分后面写一个相关笔记)协商密钥以及确保通信的完整性和安全性。 -
数据传输:
一旦隧道建立,所有隧道内的数据都会被加密。OpenVPN 使用先进的加密算法,如 AES (Advanced Encryption Standard),来对数据进行加密。只有具有正确密钥的接收方能够解密并读取数据。OpenVPN 还会使用消息认证码 (MAC)来验证数据的完整性,防止数据被篡改。
OpenVPN部署
以下步骤为在CentOS 7上部署OpenVPN的步骤,使用证书进行身份验证。
安装OpenVPN
- 安装openvpn
yum install openvpn
安装完成后默认路径为
/etc/openvpn
,通过自带的样例配置来进行修改,通过rpm -ql openvpn
查看openvpn相关文件,通常在/usr/share/doc/openvpn-2.4.11
目录下,将sample目录下的server.conf
配置文件拷贝到/etc/openvpn下
安装easy-rsa并自签证书
-
安装easy-rsa
yum install easy-rsa
同样使用前面的方法找到easy-rsa的示例配置vars.sample拷贝到
/etc/openvpn/easy-rsa/vars
,并修改vars文件,easyrsa和配置文件夹x509-types同样拷贝到/etc/openvpn/easy-rsa/vars
下方便进行配置。 -
配置证书
vim vars
示例中配置都注释掉了的,可以直接移动到末尾添加配置:set_var EASYRSA_REQ_COUNTRY "Country Code" #例如CN set_var EASYRSA_REQ_PROVINCE "Province Name" #例如Sichuan set_var EASYRSA_REQ_CITY "City Name" #例如Chengdu set_var EASYRSA_REQ_ORG "Organization Name" #任意名称,企业或个人均可 set_var EASYRSA_REQ_EMAIL "email@example.com" #任意邮箱 set_var EASYRSA_REQ_OU "OpenVPN Server" #任意名称,企业或个人均可 set_var EASYRSA_KEY_SIZE 2048 #默认2048,建议1024以上 set_var EASYRSA_ALGO rsa #默认rsa,也可以选择ecdsa等 set_var EASYRSA_CA_EXPIRE 36500 #过期时间,单位天,根据实际需求来设置 set_var EASYRSA_CERT_EXPIRE 36500
-
生成自签证书
进入到cd /etc/openvpn/easy-rsa/
目录下,运行easyrsa创建CA自签证书:./easyrsa init-pki ./easyrsa build-ca # 输入密码(后续签名需要使用),填写组织名 ./easyrsa build-server-full server nopass # 生成服务端证书 ./easyrsa gen-dh # 生成pem openvpn --genkey --secret ta.key # 生成key
-
相关证书复制到openvpn配置目录中方便管理,或者就放在当前目录下也可以(后续配置需要相关文件路径):
cp pki/ca.crt /etc/openvpn/server/
cp pki/private/server.key /etc/openvpn/server/
cp pki/issued/server.crt /etc/openvpn/server/
cp pki/dh.pem /etc/openvpn/server/
cp ta.key /etc/openvpn/server/
配置Openvpn
-
配置openvpn文件
vim /etc/openvpn/server.conf
,其中;
与#
均作为注释符号,然后根据需求进行配置:local 0.0.0.0 # 修改监听地址 port 8443 # 修改监听端口,需配置防火墙放通 ;proto tcp # 协议按需选择tcp或udp proto udp dev tun # 网络设备模式,tun为虚拟网卡,tap需要桥接模式 # 配置证书信息,使用之前放置证书的路径 ca /etc/openvpn/server/ca.crt cert /etc/openvpn/server/server.crt key /etc/openvpn/server/server.key tls-auth /etc/openvpn/server/ta.key 0 server 10.0.0.0 255.255.255.0 # 指定vpn使用的子网 ifconfig-pool-persist ipp.txt # 选择指定客户端IP绑定,按需配置 push "route 172.16.1.0 255.255.255.0" # 推送需要访问的vpn内网路由 push "dhcp-option DNS 8.8.8.8" # 推送vpn的DNS以保证内网解析正确 # 开启日志,方便前期调试,日志级别在调试时可以设置更高以输出详细信息 status openvpn-status.log log-append openvpn.log verb 4 explicit-exit-notify 1 # 服务器断开时发送通知,便于客户端重连 # 证书校验,如果要管理客户端证书,需要开启 crl-verify /etc/openvpn/server/crl.pem
-
配置openvpn环境和开机启动
将openvpn服务拷到系统环境
cp /usr/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/system/openvpn@server.service
server为server.conf配置文件名称,如果修改了也需要相应修改
修改服务配置vim /usr/lib/systemd/system/openvpn@server.service
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf
如果运行service时有问题,可以将
%t
替换为完整路径,%i
替换为配置文件名称以确保变量正确。
完成后添加开机启动并启动服务:
systemctl enable openvpn@server.service
systemctl start openvpn@server.service
-
防火墙及系统配置
服务器iptables需要放通需访问的源地址和端口:
访问路径可以理解为:client --> vpn --> backend server
因此vpn服务器需配置将tun的请求nat到服务器网卡eth0以访问内部资源
iptables添加:iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
firewalld添加(添加tun0与eth0的区域):
firewall-cmd --permanent --add-interface=tun0 --zone=public firewall-cmd --permanent --add-masquerade --zone=public firewall-cmd --reload
配置nat别忘了还需要开启内核转发,否则无法转发请求:
cat /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
-
一些可能遇到的问题
a. 启动后CLI中不断提示以下信息
Broadcast message from root@Docker-test (Mon 2022-01-24 11:28:25 CST):
Password entry required for 'Enter Private Key Password:' (PID 14218).
Please enter password with the systemd-tty-ask-password-agent tool!
出现后执行systemd-tty-ask-password-agent
然后输入密码,或者通过修改openvpn服务配置添加:--askpass /etc/openvpn/server/passwd
在
passwd
文件中写入私钥密码,然后重启openvpn服务即可
b. 启动tun网卡失败,查看openvpnlog提示
TCP/UDP: Socket bind failed on local address [AF_INET]172.18.5.77:13579: Permission denied (errno=13) Exiting due to fatal error
关闭selinux即可,setenforce 0
并修改配置vim /etc/selinux/config
改为disabled
注意:其他问题可以通过
openvpnlog
来进行排查。
客户端管理
对于企业来说,可能遇到员工新增或离职的,所以需要对证书进行管理。
-
客户端证书创建
返回easyrsa目录创建客户端密钥
./easyrsa build-client-full username
期间先创建客户端的密码,然后输入服务器ca密码签名。
签发完成后将服务器ca.crt、ta.key和客户端证书及密钥导出提供给客户端使用。如果不知道生成后的存放路径可以使用./easyrsa show-cert username
或者./easyrsa show-ca
查看。 -
吊销用户证书
使用easyrsa注销用户证书:./easyrsa revoke username`
输入服务器ca密码确认后,再生成更新的crl文件:
./easyrsa gen-crl
输入ca密码确认后,将生成的crl.pem文件拷贝到openvpn配置文件目录下:
cp keys/crl.pem /etc/openvpn/server/crl.pem # 路径和openvpn配置一致
完成后重启服务即可,后续吊销都需要更新crl.pem并覆盖原文件才可以生效。
客户端配置
客户端配置文件通常是个client.ovpn
的文件,将服务器生成的证书和密钥拷贝到客户端配置文件目录下,然后将配置文件中的ca
、cert
、key
替换成服务端生成的证书和密钥。修改下服务端IP地址和端口,配置使用的方法和协议即可,部分示例如下:
client
dev tun
proto udp
remote 1.1.1.1 8443 # 服务器IP和监听端口
resolv-retry infinite
nobind
# 证书配置
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
其他配置
如果你想要在OpenVPN服务端设置端口映射,例如:将UDP 50000-60000 端口映射到8443端口,这样的话,服务端就可以不用修改端口,而客户端修改端口就可以连接上VPN。你可以使用iptables进行设置。以下是具体步骤:
-
设置iptables规则进行端口映射:
你需要添加一条规则,将所有到达你服务器UDP端口50000到60000的流量重定向到8443端口。你可以使用以下命令:iptables -t nat -A PREROUTING -p udp --dport 50000:60000 -j REDIRECT --to-ports 8443 iptables -A INPUT -p udp --dport 50000:60000 -j ACCEPT
-
客户端配置:
客户端需要将OpenVPN连接端口指定为其中一个在50000到60000范围内的端口。在客户端的配置文件(通常是client.ovpn
)中,修改remote
指令如下:remote 1.1.1.1 50000 udp
可以替换
50000
为50000到60000之间任何一个端口,根据实际情况选择。
完成以上步骤后,客户端就能够通过访问UDP 50000到60000任意端口来连接到OpenVPN服务器,这样就能隐藏服务器真实端口。
温馨提醒:
这篇文章是根据之前的经验写的,可能存在过时的内容,如果遇到问题欢迎留言提问。