0%

title: Centos7使用OpenVPN实现内网穿透和代理服务
date: 2023-09-20 16:48:34
tags:

  • Centos
  • 内网穿透
    categories:
  • 工具使用
    mathjax: true

引言

在工作中我们经常会遇到这样的一些问题,例如公司服务器数据存放在公司内容,现在在外面出差无法通过资源浏览器直接访问,通常的做法是使用远程控制软件如to_desk、向日葵等等,这种方式虽然能够解决我们文件查找的问题,但是在进行传输的时候,第三方工具的传输速度太慢,并且这种方式也不太优雅;再比如,公司在做开发时,一般是很多人一起完成一个项目,每个人负责一部分代码,这个时候就设置到一个代码同步的问题,场景的做法就是在局域网中搭建gitlab,然后大家统一将代码上传到gitlab,但是有的时候由于一些原因有些工作需要回家完成,但是在家完成后又无法直接上传到公司的局域网gitlab,和其他同事之间就无法进行及时的同步进度~~~~。

这些问题在学习完本文的内容后都会得到解决。

安装前的准备工作

设备

我在这里演示的设备有3个:

  1. 服务端:阿里云服务器Centos7操作系统。【服务端一定要位于公网】
  2. 客户端1:本机Windows11操作系统。
  3. 客户端2:公司服务器Centos7操作系统

关闭防火墙

1
2
3
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

image-20230920163937362

关闭Selinux

1
2
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

image-20230920164013255

安装依赖包

1
yum install -y  vim wget lrzsz gcc-c++ openssl openssl-devel net-tools lzo lzo-devel pam pam-devel

下载安装包

1
2
3
4
mkdir ~/file
cd ~/file
wget https://swupdate.openvpn.org/community/releases/openvpn-2.5.6.tar.gz
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz

安装OpenVPN和EasyRSA

  • 解压安装包

    1
    2
    tar -zxvf openvpn-2.5.6.tar.gz
    tar -zxvf EasyRSA-3.0.8.tgz

配置OpenVPN

1
2
3
cd openvpn-2.5.6
mkdir /etc/openvpn/ && ./configure --prefix=/etc/openvpn/
make -j 8 && make install # 编译

添加环境变量

1
2
echo -e "PATH=\$PATH:/etc/openvpn/sbin" >/etc/profile.d/openvpn256.sh
source /etc/profile

查看安装版本

1
openvpn --version

image-20230920165215203

配置EasyRSA

1
cd ../  && mv EasyRSA-3.0.8 /etc/EasyRSA

服务端配置

准备CA签发机构环境

拷贝EasyRSAOpenVPN文件夹

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证书

image-20230920170634016

1
./easyrsa build-ca nopass  # 创建CA机构,无密码登录

image-20230920170611797

这里的签发机构可以自己随便写,我这里写的minglog

此时已经生成了CA证书文件和密钥文件.

使用以下命令查看

1
ll pki/ca.crt pki/private/ca.key

image-20230920170743270

制作Server端证书

1
./easyrsa build-server-full minglogvpn nopass

image-20230920170928864

查看服务端证书

1
ll pki/issued/minglogvpn.crt pki/private/minglogvpn.key

image-20230920171037288

生成加密交换时的Diffie-Hellman文件

1
./easyrsa gen-dh

image-20230920171758543

将所有文件拷贝到OpenVPN根目录

1
2
cd /etc/openvpn
cp ~/file/openvpn-2.5.6/sample/sample-config-files/server.conf . && cp easy-rsa-server/pki/ca.crt ./ && cp easy-rsa-server/pki/issued/minglogvpn.crt ./ && cp easy-rsa-server/pki/private/minglogvpn.key ./ && cp easy-rsa-server/pki/dh.pem ./ && cp easy-rsa-server/pki/dh.pem ./dh2048.pem

修改配置文件

1
vim server.conf

修改以下内容:

  • 开启TCP协议,关闭UDP协议

image-20230920172454440

  • 指定服务端

image-20230920172538063

  • 给客户端分配地址池,注意:不能和VPN服务器内网网段有相同

image-20230920172658641

  • 允许客户端能够连接到服务器后的其他私有子网,要想连接到VPN的客户机之间可以相互访问,必须设置这个参数。

    image-20230920190152478

  • 允许客户端之间进行相互访问。
    image-20241114220409961

  • 对于与旧客户端兼容的压缩,使用comp-lzo,如果在此启用,还必须在客户端配置文件中启用它

image-20230920172732195

  • 开启TLS-auth,使用ta.key防御攻击,服务器端的第二个参数值为0,客户端的为1

image-20230920172756568

  • 设置日志格式,log-append是在之前的日志内容后进行追加。

image-20230920172849059

  • 开启允许多人同时登录

image-20230920182602240

开启服务

1
nohup openvpn --config /etc/openvpn/server.conf &

可以监控日志

1
tail -f /etc/openvpn/openvpn.log

image-20230920173645780

服务开启成功

开放1194端口

在服务器安全组中开放1194端口

image-20230920174945557

注意:这一步很重要,如果没有开放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

image-20230920171612456

将客户端证书拷贝到一个文件夹

1
2
cd ~ && mkdir VPNfile && cd VPNfile
cp /etc/openvpn/ca.crt /etc/openvpn/easy-rsa-server/pki/issued/minglog.crt /etc/openvpn/easy-rsa-server/pki/private/minglog.key .

image-20230920174158143

此时这里的3个文件就是我们在配置客户端时需要的相关文件。

在客户机1【windows11】上安装OpenVPN客户端并配置连接

下载地址

将前面准备好的3个文件下载到本地,然后复制到目录:C:\Users\ming\OpenVPN\config

然后继续在该文件夹下创建minglog.ovpn文件,文件内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
client
dev tun
proto tcp
remote xxxxxxxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert minglog.crt
key minglog.key
comp-lzo
verb 3

其中:remote行的xxxxxxxx需要修改为自己的服务器公网IP地址。

配置完成后,点击连接即可

image-20230920175042085

连接成功,分配到IP:192.168.100.6

image-20230920175119173

在服务器端输入ip a,查看服务器端地址。

image-20230920175233746

可以看到服务器端IP地址为192.168.100.1,所以此时我们在本机访问192.168.100.1地址就可以访问到服务器。

image-20230920175406626

也是可以直接ping通的。

同时在本地对192.168.100.1地址使用SSH进行连接,也是可以直接连接到服务器的。

image-20230920175655474

在客户机2【Centos7】上安装OpenVPN客户端并配置连接

安装OpenVPN的过程和服务端一致,不再赘述。

同样,将前面4.1节准备好的3个文件下载本客户机

首先在根目录创建一个openvpn文件夹,然后将3个文件拷贝到该文件夹。

image-20230920180819374

然后将客户机1中创建的ovpn文件,也拷贝到该文件夹下。

然后编写一个OpenVPN启动脚本。

1
nohup openvpn --config minglog.ovpn &

image-20230920184503038

赋予执行权限

1
chmod +x run.sh

执行脚本

1
./run.sh

image-20230920184757161

查看OpenVPN服务是否启动

1
ps -aux|grep openvpn

image-20230920184827322

启动成功。

查看客户机2的子网。

1
ip a

客户机2在VPN中的子网为192.168.100.10

访问测试

客户机1访问客户机2

image-20230920190353511

客户机2访问客户机1

image-20230920190427433

相互访问都没有问题。

这种方法其实就是将一台在公网中的服务器作为跳板机,使用OpenVPN创建一条软路由,让多个客户机都连接到这个软路由实现内网穿透。

内网穿透的应用

实现远程访问公司服务器资源

首先在服务器段开放445端口,该端口为Samba的服务端口。

image-20230920191452975

然后直接使用网络驱动器连接,输入账号密码即可访问。

image-20230920191603502

以服务端作为代理上网

此时在服务端需要去下载TinyProxy

1
yum -y install tinyproxy

image-20230920192202842

然后去修改Tinyproxy的配置

1
vim /etc/tinyproxy/tinyproxy.conf
  • 修改默认端口,Tinyproxy的默认端口为8888这个端口太特殊容易被占用,修改为8866

    image-20230920192309898

  • 注释到仅允许本机访问

    image-20230920192431163

  • 隐藏Via请求头部

    image-20230920192512356

然后在服务器中开放8866端口

image-20230920193208655

接下来,启动Tinyproxy

1
2
3
systemctl start tinyproxy
systemctl enable tinyproxy
systemctl status tinyproxy

然后回到客户机1,配置代理

在开始菜单搜索关键词代理

image-20230920193014121

然后点击手动设置代理

image-20230920192914620

  • IP设置为服务端OpenVPN子网IP地址。
  • 端口设置为前面我们设置的8866

点击保存。

此时访问BiliBili官网

image-20230920193319749

访问成功。

为了验证确实是通过该代理才成功访问的网页,可以回到服务器端关闭TinyProxy服务。

1
systemctl stop tinyproxy && systemctl status tinyproxy

image-20230920193608379

然后重新访问网站,发现此时无法请求到页面内容。

image-20230920193602269

需要注意的是,服务器的访问流量是需要付费的,建议大家没有特别紧急的需求还是尽量不要使用服务器代理去访问网页和传输大文件,以免造成服务器流量浪费。

当然,这种技术掌握后应用场景还有更多,大家可以自行探索。例如:当你的服务器位于国外时,通过该服务器进行转发就可以实现科学上网。【嘘嘘嘘~~~~】

-------------本文结束感谢您的阅读-------------