经过无数个日日夜夜,无数次调试、崩溃、再调试,甚至急得胃病复发。看到成功毗连的那一瞬间,竟然无比清静。写这篇文章是渴望其他利用OpenVPN的同志能够少走弯路,提供一些我的经验。
必要注明的是:即使你按照我的步调千篇一律的设置,也不愿定能成功,因为我们的主机和服务器总会有那么一丢丢差别之处。但是请相信,你肯定能成功!慢慢排查和调试,加油!
感谢文章http://t.csdnimg.cn/c23vp和http://t.csdnimg.cn/77kYS的帮助!
一、环境搭建
1.添加epel yum源、下载easyrsa:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install easy-rsa
2.专门为easyrsa设置一个文件夹/opt/easy-rsa/,把全部相干的必要文件放入:
mkdir -p /opt/easy-rsa
cp -a /usr/share/easy-rsa/3.0.8/* /opt/easy-rsa/
cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example /opt/easy-rsa/vars
3.修改vars文件并保存:
vim /opt/easy-rsa/vars
二、服务器端:创建一系列证书
1.初始化
cd /opt/easy-rsa/
./easyrsa init-pki
2.创建CA根证书
./easyrsa build-ca
他会要求你输入CA Key,你自己定义,但肯定要记住它!
Commom Name直接回车即可。
3.创建服务器端证书
1)天生。Common Name仍旧直接回车。输密码就输CA Key.
./easyrsa gen-req server nopass
2)署名
./easyrsa sign server server
4.创建DF文件
./easyrsa gen-dh
5.创建客户端证书(与3同理)
1.天生
./easyrsa gen-req client nopass
2.署名
./easyrsa sign client client
三、服务器端:摆设OpenVPN服务
1.安装Openvpn
yum install -y openvpn
可以记一下自己openvpn的版本,差别版本server.conf可利用的设置不太一样,不外这里就先记一下:
2.整理/opt/easy-rsa/中的证书、密钥文件到/etc/openvpn/..../中:
检查一下:/etc/openvpn/中应该有两个文件夹:server和client
先进入/opt/easy-rsa/:
再进pki/:
把以下两个文件复制到/etc/openvpn:
接着进issued文件夹:
把这两个证书分别移到/etc/openvpn/server和client:
回到上一层目录,进入private文件夹:
只移动这两个文件:
好啦,再进入/etc/openvpn/应该是如许的:(ta.key忽略)
3.创建设置文件server.conf
下面是我的服务器设置文件,仅供参考。很有大概与你的环境不符,但是先照我的来,有问题再根据日记报错排查。
前面有分号的就是被注释掉的。
- #监听本机端口(一定要看一下服务器开放了哪些端口,并且没有被别的服务如ssh占用的端口)
- port 1049
- #指定采用的传输协议,可选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
- #给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
- server 10.8.0.0 255.255.255.0
- #允许客户端访问内网网段,填写自己内网
- push "redirect-gateway def1 bypass-dhcp"
- push "dhcp-option DNS 8.8.8.8"
- ;push "route 192.168.7.0 255.255.255.0"
- #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址"第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP"
- ifconfig-pool-persist ipp.txt
- #存活时间,10秒ping一次,120如未收到响应则视为断线
- keepalive 10 120
- #最多允许100个客户端连接
- max-clients 100
- #日志记录位置
- status openvpn-status.log
- #openvpn版本
- verb 3
- #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
- client-to-client
- #openvpn日志记录位置
- log /var/log/openvpn.log
- #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
- persist-key
- #检测超时后,重新启动VPN,一直保持tun是linkup的.否则网络会先linkdown然后再linkup
- persist-tun
- #开启TLS-auth,使用ta.key防御攻击.服务器端的第二个参数值为0,客户端的为1
- ;tls-auth /etc/openvpn/ta.key 0
-
- #开启多人同时登录
- duplicate-cn
- #允许使用自定义脚本
- script-security 3
- #脚本路径
- auth-user-pass-verify /etc/openvpn/test.sh via-env
- #用户密码登陆方式验证:加上client-cert-not-required则代表只使用用户名密码方式验证登录,如果不加,则代表需要证书和用户名密码双重验证登录
- username-as-common-name
- auth-nocache
- #绑定客户端IP
- ;client-config-dir /etc/openvpn/ccd
- #加密算法
- cipher AES-256-CBC
- ;data-ciphers AES-256-CBC
- #MTU设置
- tun-mtu 1500
- mssfix 1450
复制代码 4.创建脚本文件和密码文件
验证用户名密码的脚本文件:
vim /etc/openvpn/test.sh
- #!/bin/bash
- PASSFILE="/etc/openvpn/openvpnpass"
- LOG_FILE="/var/log/openvpn-password.log"
- TIME_STAMP=`date "+%Y-%m-%d %T"`
-
- ###########################################################
- # 打印所有环境变量到日志文件(可选,用于调试)
- env >> $LOG_FILE
- echo "Debug: Username is '${username}' and Password is '${password}'" >> $LOG_FILE
- CORRECT_PASSWORD=$(awk -v user="$username" '$1 == user {print $2; exit}' ${PASSFILE})
- if [ "${CORRECT_PASSWORD}" = "" ]; then
- echo "${TIME_STAMP}: User does not exist: username="${username}", password="${password}"." >> ${LOG_FILE}
- echo "Debug: CORRECT_PASSWORD is empty" >> ${LOG_FILE}
- exit 1
- fi
- if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
- echo "${TIME_STAMP}: Successful authentication: username="${username}"." >> ${LOG_FILE}
- exit 0
- else
- echo "${TIME_STAMP}: Incorrect password for username="${username}"." >> ${LOG_FILE}
- exit 1
- fi
复制代码 现实存储用户名密码的文件:
vim /etc/openvpn/openvpnpass
- user1 123456
- user2 hello2024
复制代码 5.修改脚本和密码文件的权限
将 /etc/openvpn 目录下的全部文件和子目录的全部者设置为 root,组设置为 openvpn
- chown root.openvpn /etc/openvpn/* -R
复制代码 脚本增加实行权限
- chmod 755 /etc/openvpn/test.sh
复制代码 密码文件修改成只能文件创建者读写,用户组只能读
- chmod 640 /etc/openvpn/openvpnpass
复制代码 6.服务器其他设置
1)打开内核转发
- [root@localhost ~]# vim /etc/sysctl.conf
- net.ipv4.ip_forward = 1
- [root@localhost ~]# sysctl -p
复制代码 2)防火墙设置,没有命令的下载一下
- systemctl start firewalld
- firewall-cmd --add-masquerade --permanent
- firewall-cmd --add-service=openvpn --permanent
- firewall-cmd --add-port=1094/tcp --permanent
- firewall-cmd --reload
复制代码 设置完看一下结果:
检查是否有OpenVPN以及你设置文件中的端口开放
7.启动OpenVPN服务
- [root@localhost openvpn]# systemctl start openvpn@server
- [root@localhost openvpn]# systemctl status openvpn@server
复制代码
能看到状态是running就对了。
不是的话,再调整你的server.conf、服务器防火墙设置、SELinux宽容模式等。
检查端口监听:
netstat -nlp
四、客户端:毗连OpenVPN服务
1.下载OpenVPN GUI软件,不是openvpn connect 啊!
我是Win11 64bit的主机,所以下载这个:
https://swupdate.openvpn.org/community/releases/OpenVPN-2.6.8-I001-amd64.msi
2.将服务器中的:ca.crt client.crt client.key
自己想办法弄到Windows主机中来(我用VSCode从服务器下载)
将这三个文件粘贴到C:\Program Files\OpenVPN\config文件夹中。
3.在config文件夹中创建client.ovpn文件(客户端设置文件)
我的该文件内容如下:
- client
- dev tun
- proto tcp
- remote <服务器公网IP> 1049
- resolv-retry infinite
- nobind
- ca ca.crt
- cert client.crt
- key client.key
- persist-key
- persist-tun
- verb 3
- cipher AES-256-CBC
- data-ciphers AES-256-CBC
- disable-dco
- setenv opt block-outside-dns
- auth-user-pass
- auth-nocache
- remote-cert-tls server
- tun-mtu 1500
- mssfix 1450
复制代码 4.开始毗连
1)点电脑菜单栏这个向上的箭头,找到客户端的openvpn小图标:一个电脑加一个锁
2.右键点击小图标,左键点击“毗连”
注:点击“编辑设置文件”会跳出client.ovpn,可以修改
注:点击“显示日记”可查察日记,用于Debug
3.输入用户名密码
4.假如两边设置没有问题,则会出现“毗连成功”的提示
假如你没有成功,很正常,我调了几百次才成。你可以根据日记提示的错误多上网搜一搜,调整你的设置文件以及检查网络设置。
也可以把你的问题留在评论区,我们一起讨论办理。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |