通过openVPN,实现安全内网穿透

openVPN 为开源服务,虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,跨平台,支持linux\window\macos\AndroidiOS,值得学习使用。

1、安装openVPN

ubuntu环境下

复制代码
apt install openvpn

安装完成后生成了目录

二、安装Easy RSA套件

用于生成openVPN所需的密钥,服务端和客户端所需的证书和密钥

1、下载Easy RSA源码包:

Easy RSA下载官网:https://github.com/OpenVPN/easy-rsa/releases

复制代码
[root@localhost ~]wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.2/EasyRSA-3.1.2.tgz

下载完后解压,在/etc/openvpn目录下创建目录easy-rsa,将刚才解压缩的所有文件复制到这个目录下

复制代码
[root@localhost ~]#tar -zxvf EasyRSA-3.1.2.tgz
[root@localhost ~]#mkdir /etc/openvpn/easy-rsa
[root@localhost ~]#cp -r EasyRSA-3.1.2/* /etc/openvpn/easy-rsa

2、Easy RSA在服务端生成私钥和证书

  • 进入Easy RSA的安装目录,并配置参数;

    [root@localhost ~]# cd /etc/openvpn/easy-rsa/
    [root@localhost easy-rsa]# cp vars.example vars
    [root@localhost easy-rsa]# vim vars

  • 清理原有证书和私钥并初始化;

    [root@localhost easy-rsa]# ./easyrsa clean-all

  • 生成CA根证书;

    [root@localhost easy-rsa]# ./easyrsa build-ca

CA根证书生成位置:/etc/openvpn/easy-rsa/pki/ca.crt

3、 为OpenVPN服务端生成server证书和私钥;

备注:这里使用nopass参数设置不需要密码,那么在启动OpenVPN服务的时候就不提示输入密码

复制代码
[root@localhost easy-rsa]# ./easyrsa build-server-full server nopass

服务端证书路径:/etc/openvpn/easy-rsa/pki/issued/server.crt

服务端私钥路径:/etc/openvpn/easy-rsa/pki/private/server.key

  • 生成Diffie-Hellman算法需要的密钥文件;

    [root@localhost easy-rsa]# ./easyrsa gen-dh

等待一段时间即可生成成功

生成tls-auth Key用于防止DDOS和TLS攻击;

复制代码
[root@localhost easy-rsa]# openvpn --genkey --secret ta.key

ta.key路径:/etc/openvpn/easy-rsa/ta.key

三、OpenVPN服务端配置

创建/修改OpenVPN服务端配置文件 vim /etc/openvpn/server/server.conf

复制代码
port 1194                               #端口
dev tun                                 #采用路由隧道模式tun
ca ca.crt                               #ca证书文件位置
cert server.crt                         #服务端公钥名称
key server.key                          #服务端私钥名称
dh dh.pem                               #交换证书
auth SHA1 
proto tcp
server 10.8.0.0 255.255.255.0           #给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
push "route 10.0.8.2 255.255.252.0"   #允许客户端访问内网10.0.8.2网段,我这里填了服务器内网IP和子网掩码
client-to-client
verb 3                                  #openvpn版本
persist-key     #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。
persist-tun     #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
keepalive 10 120                        #存活时间,10秒ping一次,120 如未收到响应则视为断线
max-clients 200                         #最多允许200个客户端连接
ifconfig-pool-persist ipp.txt           #地址池记录文件位置 维持客户端和virtual ip的对应表,以便客户端重连接连接也是相同IP
duplicate-cn    #和keys连接VPN,一定要打开这个选项,否则只允许一 个人连接VPN
script-security 3                                   #支持密码认证-允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/check.sh via-env #支持密码认证-指定认证脚本
username-as-common-name                             #支持密码认证-用户密码登陆方式验证

编写用户认证脚本文件

复制代码
[root@Web01 ~]# vim /etc/openvpn/check.sh

写入下面内容

#!/bin/bash
PASSFILE="/etc/openvpn/openvpnfile"   #密码文件 用户名 密码明文
LOG_FILE="/var/log/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   

给脚本执行权限

复制代码
[root@Web01 ~]# chmod +x /etc/openvpn/check.sh

创建用户密码,空格为分割符

root@Web01 \~\]# vim /etc/openvpn/openvpnfile koten 1 **- 拷贝私钥、公钥和证书等文件到server.conf同级目录/etc/openvpn/server/下;** 备注:需要拷贝的文件包括ca.crt、ca.key、server.crt、server.key、dh.pem、ta.key [root@localhost server]# cp /etc/openvpn/easy-rsa/pki/ca.crt [root@localhost server]# cp /etc/openvpn/easy-rsa/pki/private/ca.key [root@localhost server]# cp /etc/openvpn/easy-rsa/pki/issued/server.crt [root@localhost server]# cp /etc/openvpn/easy-rsa/pki/private/server.key [root@localhost server]# cp /etc/openvpn/easy-rsa/pki/dh.pem [root@localhost server]# cp /etc/openvpn/easy-rsa/ta.key ![](https://file.jishuzhan.net/article/1731581068131176450/6550efe2a4a4da2d2a918b5035f887c2.webp) 修改服务端配置文件为支持密码认证 #### 启动服务端服务 /etc/openvpn/server/目录下执行 [root@uos server]# openvpn --config server.conf ![](https://file.jishuzhan.net/article/1731581068131176450/8d1ad1b4502ec1b38596d9a786941c76.webp) ### 四、OpenVPN客户端配置 在服务端生成客户端的证书和私钥,每多一个客户端就要多生成一份,为好区分,命名`client_xxx`为不一样 /etc/openvpn/easy-rsa/ 目录下执 行 [root@localhost easy-rsa]# ./easyrsa build-client-full client nopass ![](https://file.jishuzhan.net/article/1731581068131176450/fccddd2c6bd6ad4283687f652fdf58e9.webp) 客户端证书路径:/etc/openvpn/easy-rsa/pki/issued/client.crt 客户端私钥路径:/etc/openvpn/easy-rsa/pki/private/client.key 将生成的客户端证书(client.crt)、私钥(client.key),服务端根证书(ca.crt)、ta.key打包下载回来 上传到客户端的 /etc/openvpn/client 前提是客户端需要先安装vpn:apt install openvpn linux **进入客户端 /etc/openvpn/client** 创建OpenVPN客户端配置文件 vim /etc/openvpn/client/client.conf 写入内容 client dev tun proto tcp remote 41.19.18.17 1194 ca ca.crt #指定CA证书的文件路径 cert client.crt #指定当前客户端的证书文件路径 key client.key #指定当前客户端的私钥文件路径 nobind #不绑定本地特定的端口号 auth SHA1 resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用 verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup auth-user-pass pass.txt #用户密码验证 **/etc/openvpn/client下创建用户密码文件pass.txt** **写入用户,换行写密码** ![](https://file.jishuzhan.net/article/1731581068131176450/3434ab7df59e017617ab59031a9381ef.webp) 目录文件如下 ![](https://file.jishuzhan.net/article/1731581068131176450/5c16ad7d78471655d87896e7464bfd25.webp) #### 启动客户端服务 /etc/openvpn/client/目录下执行 root@localhost: openvpn --config client.conf ![](https://file.jishuzhan.net/article/1731581068131176450/2eb478bde1ab76bea657875d8617bdfe.webp) 成功!! 五、window下客户端配置 安装好客户端 OpenVPN ![](https://file.jishuzhan.net/article/1731581068131176450/722cbbc480b82967c35c4c74d629170d.webp) 进入安装目录C:\\Program Files\\OpenVPN\\config\\ 建了一个目录 config.4 ![](https://file.jishuzhan.net/article/1731581068131176450/8c2dd9f18ec07cfe673cdfa7aedc3282.webp) 将上面说到的Easy RSA生成服务器根证ca.crt,和客户端私钥clientpc.key和证书clientpc.crt,和ta.key复制到config.4目录下面 ![](https://file.jishuzhan.net/article/1731581068131176450/532a1a025d387b580beeed29a6ae50fe.webp) 新建pc.ovpn文件,填入内容 client dev tun proto tcp remote 41.19.18.17 1194 ca ca.crt #指定CA证书的文件路径 cert clientpc.crt #指定当前客户端的证书文件路径 key clientpc.key #指定当前客户端的私钥文件路径 nobind #不绑定本地特定的端口号 auth SHA1 resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用 verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup auth-user-pass pass.txt #用户密码验证 新建pass.txt 文件 填入内容 ![](https://file.jishuzhan.net/article/1731581068131176450/3434ab7df59e017617ab59031a9381ef.webp) 到这里配置完成 测试连接成功 ![](https://file.jishuzhan.net/article/1731581068131176450/fd048024710e7109df45d6cda63b88a1.webp) 查看本机IP ![](https://file.jishuzhan.net/article/1731581068131176450/6cf8e5eccfea928bba0fac7dde098ec3.webp) 正学的话和上面的linux客户端可以ping通 #### 六、开始启动设置 **服务端开机启动** 修改openvpn-server服务文件 vim /usr/lib/systemd/system/openvpn-server@.service 修改内容: ExecStart=/usr/sbin/openvpn --config server.conf ExecStop=killall openvpn 修改ExecStart 和 ExecStop 启动和关闭命令即可,存盘退出后,再执行: rm -rf /etc/systemd/system/openvpn-server@server.service.d 因为这个地方会 Override 加载一些没有用的内容而导致加载失败,而这些功能(add-bridge等)都不是我们这个极简教程所需要的,因此将之删除,有兴趣的同学可以在备份好源文件的前提下继续深入研究。现在,重新加载OpenVPN服务: systemctl daemon-reload systemctl start openvpn-server@server.service 查看状态 systemctl status openvpn-server@server.service 一切无误后,输入: systemctl enable openvpn-server@server.service ##### **客户端服务开机启动** vim /usr/lib/systemd/system/openvpn-client@.service 修改内容: ExecStart=/usr/sbin/openvpn --config client.conf ExecStop=killall openvpn 重新加载OpenVPN服务: systemctl daemon-reload systemctl start openvpn-client@client.service 一切无误后,输入: systemctl enable openvpn-client@client.service

相关推荐
用户962377954482 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机5 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机5 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954487 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star7 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544810 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行5 天前
网络安全总结
安全·web安全
red1giant_star5 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透5 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全