需求:公司异地员工需要访问内部办公网服务器,所以需要搭建一个vpn提供异地员工使用,且每个员工可配置单独的账号。
一、环境
服务器系统:CentOS Linux release 7.9.2009 (Core)
安装操作基于root用户
防火墙禁用firewalld,采用iptables
OpenVpn版本:2.4.12
安装目录(默认):/etc/openvpn
Easy-rsa版本:3.0.8
安装目录(默认):/usr/share/easy-rsa
网络信息:
- 办公网络公网IP:115.192.22.166
- 路由器端口映射:允许公网1194端口 → 192.168.10.230的1194端口
- OpenVPN服务器IP:192.168.10.230(内网)
- 测试服务器IP:192.168.10.240(内网)
- OpenVPN客户端虚拟网段:172.16.16.0/24
二、准备工作
对服务器的一些必要设置以及依赖安装,都需要在root账户下进行操作
1、关闭selinux
[root@openvpn ~]# sed -i '/^SELINUX/s/enforcing/disabled/g' /etc/selinux/config
[root@openvpn ~]# setenforce 0
2、防火墙更换成iptables(如果已经使用iptables,可忽略)
[root@openvpn ~]# systemctl stop firewalld.service
[root@openvpn ~]# systemctl disable firewalld.service
[root@openvpn ~]# yum install iptables-services -y
[root@openvpn ~]# depmod -a
[root@openvpn ~]# modprobe ip_tables
[root@openvpn ~]# modprobe iptable_filter
[root@openvpn ~]# systemctl enable iptables
[root@openvpn ~]# systemctl start iptables
3、安装相关依赖、安装netstat(方便查看端口运行状态)
[root@openvpn ~]# yum -y install vim wget lrzsz gcc-c++ openssl openssl-devel net-tools lzo lzo-devel pam pam-devel
[root@openvpn ~]# yum -y install net-tools netstat
4、内核转发规则(也可手动编辑/etc/sysctl.conf文件)
[root@openvpn ~]# vim /etc/sysctl.conf
#
# 如果有net.ipv4.ip_forward=0,则改成net.ipv4.ip_forward=1;如果没有,则直接添加
net.ipv4.ip_forward=1
5、使之生效
[root@openvpn ~]# sysctl -p
三、安装OpenVPN和EasyRSA
本教程采用yum安装
安装openvpn、easy-rsa
# 安装目录:/etc/openvpn
[root@openvpn ~]# yum -y install openvpn
# 安装目录:/usr/share/easy-rsa
[root@openvpn ~]# yum -y install easy-rsa
四、创建CA机构与服务器证书
当前的EsayRSA版本是3.0.8,所以如果你安装器是其他版本,注意版本替换
1、创建证书环境目录
[root@openvpn ~]# mkdir -p /etc/openvpn/easy-rsa
[root@openvpn ~]# cp -a /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa
[root@openvpn ~]# cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars
2、修改vars配置文件
[root@openvpn ~]# vim /etc/openvpn/easy-rsa/vars
# 取消vars下面配置的注释,并按照自己填写
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Zhejiang"
set_var EASYRSA_REQ_CITY "Hangzhou"
set_var EASYRSA_REQ_ORG "IT"
set_var EASYRSA_REQ_EMAIL "IT@qq.com"
set_var EASYRSA_NS_SUPPORT "yes"
3、初始化,创建pki目录用于存储证书
[root@openvpn ~]# cd /etc/openvpn/easy-rsa
[root@openvpn easy-rsa]# ./easyrsa init-pki
4、创建根证书,根证书用于ca对之后生成的server和client证书签名时使用
[root@openvpn easy-rsa]# ./easyrsa build-ca
# 第一步:提示设置密码(可选);
# 第二步:提示输入公司(直接回车);
5、创建server端证书和密钥文件(nopass表示不加密密钥文件)
[root@openvpn easy-rsa]# ./easyrsa gen-req openvpnserver nopass
# 仅一步:会提示输入公司(直接回车)
6、给server端证书签名
[root@openvpn easy-rsa]# ./easyrsa sign server openvpnserver
# 第一步:提示确认(输入 yes)
# 第二步:提示输入密码(如果在创建证书时设置了密码,则输入对应密码)
7、创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法
[root@openvpn easy-rsa]# ./easyrsa gen-dh
# 等待完成即可
8、启用安全增强配置,创建TLS认证密钥
[root@openvpn ~]# openvpn --genkey --secret /etc/openvpn/server/ta.key
五、OpenVPN服务端配置
OpenVPN配置,我这边采用了1194端口
1、把前面创建的ca、证书都复制到server文件夹(非必需,为了归总才放到一起)
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/issued/openvpnserver.crt /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/private/openvpnserver.key /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/private/ca.key /etc/openvpn/server/
2、创建ipp.txt文件
[root@openvpn ~]# touch /etc/openvpn/server/ipp.txt
[root@openvpn ~]# chown openvpn:openvpn /etc/openvpn/server/ipp.txt
3、创建ccd文件目录(本教程不讲如何使用ccd,单纯创建)
[root@openvpn ~]# mkdir /etc/openvpn/server/ccd
[root@openvpn ~]# chown openvpn:openvpn /etc/openvpn/server/ccd
4、创建日志文件夹
[root@openvpn ~]# mkdir /etc/openvpn/logs/
5、添加密码认证脚本
[root@openvpn ~]# vi /etc/openvpn/server/check.sh
##### ----------check.sh内容start----------(这一行不用复制)
#!/bin/sh
PASSFILE="/etc/openvpn/server/openvpnpass"
LOG_FILE="/etc/openvpn/logs/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
##### ----------check.sh内容end----------(这一行不用复制)
6、增加执行权限
[root@openvpn ~]# chmod +x /etc/openvpn/server/check.sh
7、增加用户密码文件
[root@openvpn ~]# vi /etc/openvpn/server/openvpnpass
##### ----------openvpnpass内容start-----------(这一行不用复制)
openvpn01 112233
openvpn02 223344
##### ----------openvpnpass内容end-----------(这一行不用复制)
8、创建openvpn配置文件
[root@openvpn ~]# vi /etc/openvpn/server.conf
##### ----------server.conf内容start----------(这一行不用复制)
#监听本机端口
port 1194
#指定采用的传输协议,可选tcp或udp
proto tcp
#指定创建的通信隧道类型,可选tun或tap
dev tun
#指定CA证书的文件路径
ca /etc/openvpn/server/ca.crt
#指定服务器端的证书文件路径
cert /etc/openvpn/server/openvpnserver.crt
#指定服务器端的私钥文件路径
key /etc/openvpn/server/openvpnserver.key
#指定迪菲赫尔曼参数的文件路径,也就是交换证书
dh /etc/openvpn/server/dh.pem
#给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
server 10.8.0.0 255.255.255.0
#允许客户端访问内网网段,后面加上vpn_gateway说明仅仅只能访问内网段流量
push "route 192.168.10.0 255.255.255.0 vpn_gateway"
# 设置客户端所有流量都通过openvpn(这里注释了)
push "redirect-gateway def1 bypass-dhcp"
# DNS 服务器配置,可以根据需要指定其他 dns(这里注释了)
push "dhcp-option DNS 192.168.10.1"
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址"第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP"
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
#存活时间,10秒ping一次,120如未收到响应则视为断线
keepalive 10 120
#最多允许30个客户端连接
max-clients 30
#openvpn版本
verb 3
#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client
#openvpn日志记录位置
log-append /etc/openvpn/logs/openvpn.log
status /etc/openvpn/logs/status.log
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的.否则网络会先linkdown然后再linkup
persist-tun
#开启TLS-auth,使用ta.key防御攻击.服务器端的第二个参数值为0,客户端的为1
tls-auth /etc/openvpn/server/ta.key 0
#开启多人同时登录
duplicate-cn
#允许使用自定义脚本
script-security 3
#脚本路径
auth-user-pass-verify /etc/openvpn/server/check.sh via-env
#用户密码登陆方式验证:加上client-cert-not-required则代表只使用用户名密码方式验证登录,如果不加,则代表需要证书和用户名密码双重验证登录
username-as-common-name
#绑定客户端IP
client-config-dir /etc/openvpn/server/ccd
##### ----------server.conf内容end----------(这一行不用复制)
六、启动OpenVPN
允许1194端口
1、允许tcp/udp 1194通过防火墙
[root@openvpn ~]# iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
[root@openvpn ~]# iptables -I INPUT -p udp --dport 1194 -j ACCEPT
2、配置iptables转发流量:修改iptables方式
# 第一条:从 NAT 表的开头插入一条规则,允许从 10.8.0.0/24 网段的源 IP 地址发送到 eth0 接口的所有流量,使用 MASQUERADE (伪装)技术,将源 IP 地址替换为公网 IP,以实现局域网主机通过 VPN 访问公网的功能。
# 参数说明:10.8.0.0 是虚拟网段
# 参数说明:eth0中 是服务器网卡名称
[root@openvpn ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# 第二条:从 FORWARD 表的开头插入一条规则,允许经过 tun0 接口,从 10.8.0.0/24 网段的源 IP 地址发送到 eth0 接口的所有新连接通过(-m conntrack --ctstate NEW -j ACCEPT)。
# 参数说明:10.8.0.0 是虚拟网段
# 参数说明:eth0中 是服务器网卡名称
[root@openvpn ~]# iptables -I FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
# 第三条:从 FORWARD 表的开头插入一条规则,允许所有与已建立连接或 RELATED(相关连接) 的流量通过(-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT)。
[root@openvpn ~]# iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 其他说明:
# 如果你只需要让openvpn客户端访问openvpn服务端这台服务器,那么注释掉 第二条和第三条即可。
3、保存规则并重启防火墙
[root@openvpn ~]# service iptables save
[root@openvpn ~]# service iptables restart
4、服务启动【方式一】:直接启动服务(如使用此方式,则已完成,无需后续操作)
# 直接启动服务方式
[root@openvpn ~]# systemctl start openvpn@server
[root@openvpn ~]# systemctl enable openvpn@server
4、服务启动【方式二】:把OpenVPN配置系统服务,并设置开机启动(这里采用此方式)
4.1、创建系统服务的方式
[root@openvpn ~]# vim /etc/systemd/system/openvpn.service
##### ------------ openvpn.service内容start-------------(这一行不用复制)
[Unit]
Description=OpenVPN Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server.conf
##### ------------ openvpn.service内容end-------------(这一行不用复制)
4.2、加载系统服务
[root@openvpn ~]# systemctl daemon-reload
4.3、启动服务、查看服务状态、查看端口情况
[root@openvpn ~]# systemctl start openvpn.service
[root@openvpn ~]# systemctl status openvpn.service
[root@openvpn ~]# netstat -tanulp | grep 3194
4.4、设置服务开机启动(如果启动服务没问题,则可设置成开机启动项)
[root@openvpn ~]# systemctl enable openvpn.service
七、客户端证书制作
用EsayRSA制作名为client01的客户端证书
1、进入esay-rsa目录
[root@openvpn ~]# cd /etc/openvpn/easy-rsa/
2、创建client端证书和密钥文件(nopass表示不加密密钥文件)
[root@openvpn easy-rsa]# ./easyrsa gen-req client01 nopass
# 仅一步:提示输入公司明(直接回车)
3、给client端证书签名
[root@openvpn easy-rsa]# ./easyrsa sign client client01
# 第一步:提示确认(输入 yes)
# 第二步:提示输入密码(如果在创建证书时设置了密码,则输入对应密码)
4、为了方便以后归总,复制client证书到client文件夹(非必要)
[root@openvpn easy-rsa]# cp /etc/openvpn/easy-rsa/pki/issued/client01.crt /etc/openvpn/client/
[root@openvpn easy-rsa]# cp /etc/openvpn/easy-rsa/pki/private/client01.key /etc/openvpn/client/
八、客户端配置测试
在需要使用的客户机上编写配置文件(这里在macos环境)
其中客户端实际需要使用的证书有四个:ca.crt、ta.key、client01.crt、client01.key
1、把这些文件复制到客户机上 “/Users/apple/openvpn_conf/opendev/” 目录下(目录可自定义)
2、创建一个配置文件名为 client.ovpn,并用文本形式进行编辑添加内容
# 指定当前VPN是客户端
client
# 使用tun隧道传输协议
dev tun
# 使用udp协议传输数据
proto tcp
# OpenVPN服务器IP地址端口号
remote 115.192.22.166 1194
# 断线自动重新连接,在网络不稳定的情况下非常有用
resolv-retry infinite
# 不绑定本地特定的端口号
nobind
# 指定CA证书的文件路径(也可采用<ca></ca>标签内复制证书内容方式到配置文件)
ca /Users/apple/openvpn_conf/opendev/ca.crt
# 指定当前客户端的证书文件路径(也可采用<cert></cert>标签内复制证书内容方式到配置文件)
cert /Users/apple/openvpn_conf/opendev/client01.crt
# 指定当前客户端的私钥文件路径(也可采用<key></key>标签内复制证书内容方式到配置文件)
key /Users/apple/openvpn_conf/opendev/client01.key
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
persist-tun
#使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1(也可采用<tls-auth></tls-auth>内包含证书内容到配置文件方式,需额外增加一行 key-direction 1)
tls-auth /Users/apple/openvpn_conf/opendev/ta.key 1
#账号密码认证
auth-user-pass
3、下载并安装OpenVPN官方工具
macos:<https://openvpn.net/client-connect-vpn-for-mac-os/>
windows:<https://openvpn.net/client-connect-vpn-for-windows/>
linux:<https://openvpn.net/openvpn-client-for-linux/>
4、使用工具
4.1、把制作好的client.ovpn配置文件拖进工具
4.2、输入用户名和密码(密码是配置在服务器上/etc/openvpn/server/openvpnpass文件内)
4.3、All Finish
参考文章:
https://blog.csdn.net/qq_35222232/article/details/123680618
https://blog.csdn.net/m0_69013817/article/details/124589686
评论区