title: Centos7使用OpenVPN实现内网穿透和代理服务
date: 2023-09-20 16:48:34
tags:
- Centos
- 内网穿透
categories: - 工具使用
mathjax: true
引言
在工作中我们经常会遇到这样的一些问题,例如公司服务器数据存放在公司内容,现在在外面出差无法通过资源浏览器直接访问,通常的做法是使用远程控制软件如to_desk
、向日葵等等,这种方式虽然能够解决我们文件查找的问题,但是在进行传输的时候,第三方工具的传输速度太慢,并且这种方式也不太优雅;再比如,公司在做开发时,一般是很多人一起完成一个项目,每个人负责一部分代码,这个时候就设置到一个代码同步的问题,场景的做法就是在局域网中搭建gitlab
,然后大家统一将代码上传到gitlab
,但是有的时候由于一些原因有些工作需要回家完成,但是在家完成后又无法直接上传到公司的局域网gitlab
,和其他同事之间就无法进行及时的同步进度~~~~。
这些问题在学习完本文的内容后都会得到解决。
安装前的准备工作
设备
我在这里演示的设备有3个:
- 服务端:阿里云服务器Centos7操作系统。【服务端一定要位于公网】
- 客户端1:本机Windows11操作系统。
- 客户端2:公司服务器Centos7操作系统
关闭防火墙
1 | systemctl stop firewalld |
关闭Selinux
1 | sed -i 's/enforcing/disabled/' /etc/selinux/config |
安装依赖包
1 | yum install -y vim wget lrzsz gcc-c++ openssl openssl-devel net-tools lzo lzo-devel pam pam-devel |
下载安装包
1 | mkdir ~/file |
安装OpenVPN和EasyRSA
解压安装包
1
2tar -zxvf openvpn-2.5.6.tar.gz
tar -zxvf EasyRSA-3.0.8.tgz
配置OpenVPN
1 | cd openvpn-2.5.6 |
添加环境变量
1 | echo -e "PATH=\$PATH:/etc/openvpn/sbin" >/etc/profile.d/openvpn256.sh |
查看安装版本
1 | openvpn --version |
配置EasyRSA
1 | cd ../ && mv EasyRSA-3.0.8 /etc/EasyRSA |
服务端配置
准备CA签发机构环境
拷贝EasyRSA
到OpenVPN
文件夹
1 | cp -r /etc/EasyRSA /etc/openvpn/easy-rsa-server && cd /etc/openvpn/easy-rsa-server |
拷贝vars
文件
1 | cp vars.example vars |
编辑vars
文件
添加以下参数
1
2
3
4
5
6#添加参数,设置CA证书有效期为100年
set_var EASYRSA_CA_EXPIRE 36500
#添加参数,设置服务器证书为10年
set_var EASYRSA_CERT_EXPIRE 36500
# 添加参数
export KEY_NAME="minglogvpn"可自己灵活修改。
制作CA证书
1 | ./easyrsa init-pki # 初始化CA证书 |
1 | ./easyrsa build-ca nopass # 创建CA机构,无密码登录 |
这里的签发机构可以自己随便写,我这里写的
minglog
。
此时已经生成了CA
证书文件和密钥文件.
使用以下命令查看
1 | ll pki/ca.crt pki/private/ca.key |
制作Server端证书
1 | ./easyrsa build-server-full minglogvpn nopass |
查看服务端证书
1 | ll pki/issued/minglogvpn.crt pki/private/minglogvpn.key |
生成加密交换时的Diffie-Hellman文件
1 | ./easyrsa gen-dh |
将所有文件拷贝到OpenVPN根目录
1 | cd /etc/openvpn |
修改配置文件
1 | vim server.conf |
修改以下内容:
- 开启
TCP
协议,关闭UDP
协议
- 指定服务端
- 给客户端分配地址池,注意:不能和
VPN
服务器内网网段有相同
允许客户端能够连接到服务器后的其他私有子网,要想连接到VPN的客户机之间可以相互访问,必须设置这个参数。
允许客户端之间进行相互访问。
对于与旧客户端兼容的压缩,使用
comp-lzo
,如果在此启用,还必须在客户端配置文件中启用它
- 开启
TLS-auth
,使用ta.key
防御攻击,服务器端的第二个参数值为0
,客户端的为1
- 设置日志格式,
log-append
是在之前的日志内容后进行追加。
- 开启允许多人同时登录
开启服务
1 | nohup openvpn --config /etc/openvpn/server.conf & |
可以监控日志
1 | tail -f /etc/openvpn/openvpn.log |
服务开启成功
开放1194端口
在服务器安全组中开放1194
端口
注意:这一步很重要,如果没有开放
1194
端口OpenVPN
是无法通信的。
客户端配置
制作Client证书
1 | cd /etc/openvpn/easy-rsa-server/ && ./easyrsa build-client-full minglog nopass |
查看客户端证书
1 | ll pki/issued/minglog.crt pki/private/minglog.key |
将客户端证书拷贝到一个文件夹
1 | cd ~ && mkdir VPNfile && cd VPNfile |
此时这里的3个文件就是我们在配置客户端时需要的相关文件。
在客户机1【windows11】上安装OpenVPN客户端并配置连接
将前面准备好的3个文件下载到本地,然后复制到目录:C:\Users\ming\OpenVPN\config
然后继续在该文件夹下创建minglog.ovpn
文件,文件内容如下所示:
1 | client |
其中:
remote
行的xxxxxxxx
需要修改为自己的服务器公网IP
地址。
配置完成后,点击连接
即可
连接成功,分配到IP:192.168.100.6
在服务器端输入ip a
,查看服务器端地址。
可以看到服务器端IP
地址为192.168.100.1
,所以此时我们在本机访问192.168.100.1
地址就可以访问到服务器。
也是可以直接ping
通的。
同时在本地对192.168.100.1
地址使用SSH
进行连接,也是可以直接连接到服务器的。
在客户机2【Centos7】上安装OpenVPN客户端并配置连接
安装OpenVPN
的过程和服务端一致,不再赘述。
同样,将前面4.1
节准备好的3
个文件下载本客户机
首先在根目录创建一个openvpn
文件夹,然后将3
个文件拷贝到该文件夹。
然后将客户机1
中创建的ovpn
文件,也拷贝到该文件夹下。
然后编写一个OpenVPN
启动脚本。
1 | nohup openvpn --config minglog.ovpn & |
赋予执行权限
1 | chmod +x run.sh |
执行脚本
1 | ./run.sh |
查看OpenVPN
服务是否启动
1 | ps -aux|grep openvpn |
启动成功。
查看客户机2的子网。
1 | ip a |
客户机2
在VPN中的子网为192.168.100.10
。
访问测试
客户机1访问客户机2
客户机2访问客户机1
相互访问都没有问题。
这种方法其实就是将一台在公网中的服务器作为跳板机,使用
OpenVPN
创建一条软路由,让多个客户机都连接到这个软路由实现内网穿透。
内网穿透的应用
实现远程访问公司服务器资源
首先在服务器段开放445
端口,该端口为Samba
的服务端口。
然后直接使用网络驱动器连接,输入账号密码即可访问。
以服务端作为代理上网
此时在服务端需要去下载TinyProxy
1 | yum -y install tinyproxy |
然后去修改Tinyproxy
的配置
1 | vim /etc/tinyproxy/tinyproxy.conf |
修改默认端口,
Tinyproxy
的默认端口为8888
这个端口太特殊容易被占用,修改为8866
。注释到仅允许本机访问
隐藏
Via
请求头部
然后在服务器中开放8866
端口
接下来,启动Tinyproxy
1 | systemctl start tinyproxy |
然后回到客户机1,配置代理
在开始菜单搜索关键词代理
。
然后点击手动设置代理
IP
设置为服务端OpenVPN
子网IP地址。- 端口设置为前面我们设置的
8866
点击保存。
此时访问BiliBili官网
访问成功。
为了验证确实是通过该代理才成功访问的网页,可以回到服务器端关闭
TinyProxy
服务。
1 systemctl stop tinyproxy && systemctl status tinyproxy然后重新访问网站,发现此时无法请求到页面内容。
需要注意的是,服务器的访问流量是需要付费的,建议大家没有特别紧急的需求还是尽量不要使用服务器代理去访问网页和传输大文件,以免造成服务器流量浪费。
当然,这种技术掌握后应用场景还有更多,大家可以自行探索。例如:当你的服务器位于国外时,通过该服务器进行转发就可以实现科学上网。【嘘嘘嘘~~~~】