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

一般社员 367

{{ttag.title}}

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- ... 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


修改服务端配置文件为支持密码认证


启动服务端服务

/etc/openvpn/server/目录下执行

[root@uos server]# openvpn --config server.conf

四、OpenVPN客户端配置

在服务端生成客户端的证书和私钥,每多一个客户端就要多生成一份,为好区分,命名client_xxx为不一样

/etc/openvpn/easy-rsa/ 目录下执 行

[root@localhost easy-rsa]# ./easyrsa build-client-full client nopass

客户端证书路径:/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

写入用户,换行写密码

目录文件如下

启动客户端服务

/etc/openvpn/client/目录下执行




  • root@localhost: openvpn --config client.conf


成功!!


五、window下客户端配置

安装好客户端 OpenVPN

进入安装目录C:\Program Files\OpenVPN\config\

建了一个目录 config.4

将上面说到的Easy RSA生成服务器根证ca.crt,和客户端私钥clientpc.key和证书clientpc.crt,和ta.key复制到config.4目录下面

新建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 文件

填入内容

到这里配置完成

测试连接成功


查看本机IP

正学的话和上面的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




为客户端设置静态IP

默认客户端IP,每次重启可能都不相同,为了维护方便,设置静态IP

1.打开server端配置文件 /etc/openvpn/server/server.conf

添加一行

client-config-dir /etc/openvpn/server/clientip

2、在/etc/openvpn/server/添加一个文件夹clientip

3、在/etc/openvpn/server/clientip 下添加一个文件,文件名为客户端登录的用户名

如:客户端登录的用户名为  abc/密码为888

那这里添加的文件名就是 abc


4.为用户设置固定IP

在上一步建的文件,中输入内容,并保存

ifconfig-push 10.8.0.11 255.255.255.252

                          IP               子网掩码

ifconfig-push 10.8.0.11 10.8.0.1

                       IP               网关

我试过两种都可以

5.重启server端

6.客户端重连后就可以看到服务端分配的IP就是10.8.0.11了

注意,openvpn默认的子网掩码是255.255.255.252 所以要注意你需要分配的IP的可用性

6678765fe27a721926.png (47.51 KB, 下载次数: 15)

6678765fe27a721926.png

4977565fe284f743ba.png (33.85 KB, 下载次数: 17)

4977565fe284f743ba.png

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

科思哲 发表于 2024-3-23 09:10
  
感谢分享,有助于工资和学习
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
技术笔记
干货满满
技术咨询
产品连连看
新版本体验
功能体验
标准化排查
自助服务平台操作指引
GIF动图学习
2023技术争霸赛专题
通用技术
运维工具
信服课堂视频
秒懂零信任
技术晨报
用户认证
社区帮助指南
答题自测
深信服技术支持平台
安装部署配置
上网策略
SDP百科
设备维护
每日一记
项目案例
玩转零信任
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
测试报告
日志审计
问题分析处理
流量管理
云计算知识
原创分享
解决方案
sangfor周刊
VPN 对接
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选

本版版主

12
185
6

发帖

粉丝

关注

本版达人

LoveTec...

本周分享达人

新手24116...

本周提问达人