基于frp和http代理搭建的内网穿透


前言

emm因为学校里有一些服务必须用到校园网才能访问,而我有时候可能会长时间不在学校(回家啊出去玩什么的),这时候要访问这些内网服务就很麻烦~~(包括我们实验室的靶场也需要校园网西八)~~,本科期间我的舍友搭了个内网穿透,通过在浏览器中搭载一个proxy SwitchyOmega插件设置我们搭建好的代理服务器后,即可在浏览器中访问我们想要访问的内网服务了,因此这次我也照葫芦画瓢自己搭一个内网穿透。

知识点

frps、socks5、http代理、云服务器、防火墙、内网穿透

搭建过程

①前期准备

  • 本实验方案需要用到一台有公网ip的云服务器(租vps一般都会有公网ip的)和一台连接了内网的设备,我这里用的是一台华为云Flexus云服务的vps和一台小工控机(就是前面做软路由用到的J1900)。VPS的系统版本是CentOS 8.2,工控机的系统版本是Ubuntu 22.04.4

  • 需要用到的工具是frp,这是一个快速反向代理工具,可以将位于NAT或者防火墙后的本地服务器(也就是内网)暴露到互联网上,实现内网穿透的效果。其支持TCP和UDP,以及HTTP和HTTPS协议,允许通过域名将请求转发到内部服务。
    这里用到的frp版本为0.44.0(有更高的版本,但新的版本配置语法改动较大,比较麻烦),可以在这里:https://github.com/fatedier/frp/releases

    获取对应的版本,然后放到vps和本地设备中,进行解压

image-20241209210038256

  • 在自己的浏览器中(我用的google)安装一个SwitchyOmega插件,后续会用到

②环境搭建

frp的分为服务端(公网设备)和客户端(内网设备)

服务端

解压好frp的压缩包后,修改目录中的frps.ini配置文件,内容配置如下:

[common]
bind_port = 7000	# frp服务的端口号,可以自行调整
token = xxx	# frp客户端连接时的密码,可以自行调整

dashboard_port = 23499		# frp的web界面的端口号,可以自行调整 
dashboard_user = 2hi5hu		# web界面的登录账户,可以自行调整 
dashboard_pwd = xxx	# web界面的登录密码,可以自行调整 
authentication_method = token	# 认证方法

配置好后执行下面的命令

./frps -c ./frps.ini	# 可以在最后面加个&实现后台运行

运行后显示如下则代表成功启动

image-20241210204059926

配置完成后,将frps设置为系统服务

新建frps服务配置文件
vim /etc/systemd/system/frps.service

# 配置如下

[Unit]
Description=FRPS Server
After=network.target

[Service]
Type=simple
ExecStart=/root/data/frp/frp_0.44.0_linux_amd64/frps -c /root/data/frp/frp_0.44.0_linux_amd64/frps.ini
Restart=on-failure
StandardOutput=append:/var/log/frps.log  # 将标准输出至/var/log/frps.log
StandardError=append:/var/log/frps.log   # 将错误输出至/var/log/frps.log

[Install]
WantedBy=multi-user.target

配置完成后重新加载服务daemon,开启frps服务

systemctl daemon-reload
systemctl start frps
systemctl status frps

客户端

解压好frp的压缩包后,修改目录中的frpc.ini配置文件,内容配置如下:

[common]
server_addr = xxx.xxx.xxx.xxx		# 云服务器的公网IP
authentication_method = token		# 认证方式
server_port = 7000		# 配置的frp的服务端口
token = xxx		# 配置的frp的连接密码

[ssh]
type = tcp
local_ip = 127.0.0.1	# 本机的内网IP地址
local_port = 22			# ssh的端口
remote_port = 20022

[rdp]
type = tcp
local_ip = 127.0.0.11	# 本机的内网IP地址
local_port = 3389		# rdp的端口
remote_port = 23389

[http_proxy]
type = tcp
remote_port = 6000		# http的代理端口
plugin = http_proxy		# 使用http代理的插件

配置好后执行下面的命令

./frpc -c ./frpc.ini	#可以在最后面加个&实现后台运行

运行后显示如下则代表成功启动,成功连接上服务端

image-20241210204243041

配置完成后,将frpc设置为系统服务

新建frpc服务配置文件
vim /etc/systemd/system/frpc.service

# 配置如下

[Unit]
Description=FRPC Server
After=network.target

[Service]
Type=simple
ExecStart=/root/data/frp/frp_0.44.0_linux_amd64/frpc -c /root/data/frp/frp_0.44.0_linux_amd64/frpc.ini
Restart=on-failure
StandardOutput=append:/var/log/frpc.log  # 将标准输出至/var/log/frpc.log
StandardError=append:/var/log/frpc.log   # 将错误输出至/var/log/frpc.log

[Install]
WantedBy=multi-user.target

配置完成后重新加载服务daemon,开启frpc服务

systemctl daemon-reload
systemctl start frpc
systemctl status frpc

最后在omega中配置好即可实现内网穿透

image-20241209212720291

这时就可以访问内网的服务啦(校园网的服务之类的)

③遇到的问题

  • 客户端连接不上服务端,显示连接超时——配置vps的安全组,将用到的端口都开放,并且要在vps里开放防火墙的用到的端口(只配置安全组不行一样会超时)
  • 插件用Socks5好像不能成功代理,暂时不太清楚是为什么,有可能是因为google浏览器中SwitchyOmega插件本身不支持Socks5代理
  • 持久化做的有点问题,一关finalshell ftp服务就会断,暂时不知道为啥,到时候要处理一下

qwq