前言

​ 近期被某个抽象比赛的虚拟机卡红温了,而又因为线下赛主赛场在外地,我们只能使用这个赛方提供的虚拟机远程接入比赛内网,体验很不好,于是想着搞内网穿透了。


内网穿透

​ 已知有三台机器ABC,A为本机,B为赛方提供的可连接公网并可访问内网的跳板机,C则为内网服务器。

​ 正常来说,我们通过本机是无法直接访问到C这个内网服务器的,这时候就需要用到内网穿透,让B这个跳板机作为中间商进行流量的转发。

​ 在赛时完成整套搭建后,实际上有4台主机参与了整个交互:

  • 非内网主机A

  • 内网跳板机B

  • 内网服务器C

  • 公网服务器D

    A本地安装Proxifier通过D进行代理

    D上安装Frp服务端双向接受来自A和B的信息

    B上安装Frp客户端,作为被代理的一方,与C直接交互

    最终实现A可以直接访问C


Frp反向代理+Proxifier实现内网穿透

​ 最终我选择的解决方案使用Frp进行反向代理,并使用Proxifier实现本地客户端的全局代理。

​ 需要明确的是,服务端指的是你所连接的公网服务器,客户端是实际需要被内网穿透的跳板机。

​ 简单来说公网服务器就是服务端,能够访问内部局域网服务的就是客户端,客户端可以是你的本机,也可以是一个跳板机。

​ 你首先需要:

  • 一台有着公网IP的服务器;
  • Frp (V36.2)客户端与服务端;
  • Proxifier客户端 (亲测可用的密钥:5EZ8G-C3WL5-B56YG-SCXM9-6QZAP)。

Frp搭建

​ 首先你需要选择对应系统版本的Frp:

1
uname -m		# 查看linux系统架构

服务端

​ 以下以unbuntu22.04作为服务端为例。

基础配置

​ 首先将下载的Frp文件上传至你的公网服务器中。

​ 依次执行:

1
2
3
4
5
6
sudo mkdir /opt/frp  							# 存放软件路径
sudo mv frp_0.36.2_linux_amd64.tar.gz /opt/frp # 移动Frp文件
cd /opt/frp # 进入该目录
sudo tar -zxvf frp_0.36.2_linux_amd64.tar.gz # 解压
cd frp_0.36.2_linux_amd64 # 进入解压后文件目录
rm -r frpc* # 清除frpc开头文件(这是客户端组件,服务端不需要)

​ 成功完成所需文件准备。

​ 然后需要进行配置文件设置:

1
vim frps.ini

​ 将文件内容修改为这样的基础配置,可根据自身情况进行修改:

1
2
3
4
5
6
7
8
[common]
bind_port = 7000
bind_udp_port = 7001
auto_token = yourtoken

dashboard_port = 7500
dashboard_user = user
dashboard_pwd = password

​ 解释:

1
2
3
4
5
6
7
8
[common]
bind_port = 7000 # 绑定的端口,frp将会监听7000端口
bind_udp_port = 7001 # 绑定的udp端口,frp将会在7001监听udp请求
auto_token = yourtoken # 作为验证的token,客户端与服务端token相同才会连接

dashboard_port = 7500 # 监控面板端口为7500
dashboard_user = user # 登录监控面板的账户为user
dashboard_pwd = password # 登录监控面板的密码为password

​ 同时如果是云服务器,需要在云服务器的安全组中放行对应端口。

​ 如果开启了防火墙,需要放行开放的端口:

1
2
3
firewall-cmd --zone=public --add-port=7000/tcp --permanent		#开放7000端口,其他端口也依次开放
firewall-cmd --reload #重新加载防火墙
firewall-cmd --list-all #查看防火墙信息,检查所需端口是否开放

​ 尝试运行:

1
./frps -c ./frps.ini

image-20241019145725172

​ 像这样便是成功运行了。

​ 如果运行报错,大概率是frp版本有误,重新检查一下该选择哪个架构版本。

开机自启动

​ 接下来可配置开机自启动,临时用一下就不需要了:

1
vim /lib/systemd/system/frps.service

​ 将文件内容修改为:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
TimeoutStartSec=30
ExecStart='ADDRESS'/frps -c 'ADDRESS'/frps.ini # 修改'ADDRESS'为frps.ini所在目录的绝对路径
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

​ 然后重载服务:

1
systemctl daemon-reload

​ 基本操作:

1
2
3
4
5
systemctl start frps		#启动frps
systemctl stop frps #停止frps
systemctl status frps #查看frps运行状态
systemctl enable frps #设置frps开机自启动
systemctl disable frps #取消frps开机自启动

客户端

​ 以下以window11作为客户端为例。

基础配置

​ 首先将frp文件下载到合适的位置并解压,进入到解压后的目录,并在该目录处打开终端。

​ 同样的,删除frps开头的文件,这些是服务端的组件,客户端不需要。

​ 打开frpc.ini修改内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = xxx.xxx.xx.xxx
server_port = 7000
auto_token = frptoken
tls_enable = ture

[plugin socks]
type = tcp
plugin = socks5
remote_port = 7499
plugin_user = username
plugin_passwd = password
use_encryption = true
use_compression = true

​ 解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = xxx.xxx.xx.xxx # 你的服务端公网ip
server_port = 7000 # 服务端绑定的端口号
auto_token = frptoken # 服务端中设置的token值
tls_enable = ture # 启用tls加密连接

[plugin socks] # 使用socks进行全局代理
type = tcp # 数据传输类型为tcp
plugin = socks5 # 使用的插件为socks5
remote_port = 7499 # 代理的端口为7499
plugin_user = username # 连接的用户名
plugin_passwd = password # 连接的密码
use_encryption = true # 开启数据加密,你也可以关闭
use_compression = true # 开启压缩数据,可关闭

​ 启动服务:

1
./frpc.exe -c frpc.ini

​ 没有报错的话,应该就已经实现了内网穿透,其他主机可以通过服务端socks5进行代理后就可以访问到该客户端的内网服务了


Proxifier的使用

Proxifier是一个知名的代理工具,它允许用户将网络应用程序通过代理服务器进行连接。它本身只是一个代理管理的工具,可以设置和管理代理连接,但并不提供代理服务器。

​ 下载安装好Proxifier后,确保服务端与客户端服务均是开启状态。

​ 依次点击Profile -> Proxy Serves -> add,然后在address栏输入服务端ip,和frpc.ini中设置的remote_portProtocol选择为socks5

image-20241019165410522

​ 勾选上Enable,用户名和密码是frpc.ini中设置的,最后点击check测试连接

image-20241019165520110

​ 测试通过说明已经成功连接上了,点击OK保存

​ 最后打开Profile -> Procification Rules,将Action选项中选择刚刚保存的代理服务器并点击OK保存即可

image-20241019165602553

image-20241019165648425

​ 为了避免流量较大,一般来说会将Target Hosts设置为内网ip,参考设置:

1
localhost; 127.0.0.1; %ComputerName%; ::1;10.*.*.*;172.*.*.*;192.168.*.*;

​ 完成所有配置后,此时如果在客户端中的局域网开启了一个WEB服务,那么公网其他主机便可以使用Proxifier通过服务端socks5的代理直接访问到内网的WEB服务。

​ 在linux中可使用ProxyChains,此处不再赘述。

参考