frp内网穿透搭建


三寻猿
发布于 2023-05-26 / 59 阅读 / 0 评论 /
介绍 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 不同于ZeroTier(基于ip穿透,ip下全部端口互通),frp只是基于ip+端口的点对点穿透,但也因为功能

介绍

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

不同于ZeroTier(基于ip穿透,ip下全部端口互通),frp只是基于ip+端口的点对点穿透,但也因为功能简单,安装使用也很简单,并且开源免费。想进一步了解frp的看这里,想省时间的直接往下看安装过程。

安装过程

安装过程分两部分,服务器端和客户端。服务器端用来转发流量到客户端,客户端就是你要穿透的内网。

服务器端搭建

1. 下载&解压

这里以x86架构64位的linux系统为例。其它版本请到这里选择,然后复制文件链接替换第3行命令引号里的内容,第4、5行的文件名也要替换。选择其它版本的只有下载这一步有区别,后续步骤没有区别。

sudo mkdir -p /etc/frp
cd /etc/frp
sudo wget "https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz"
sudo tar zxvf frp_0.48.0_linux_amd64.tar.gz
sudo mv /etc/frp/frp_0.48.0_linux_amd64/* /etc/frp

2. 配置

编辑配置文件frps.ini。

vi frps.ini
[common]
# 绑定端口,默认是7000,如果被占用可以修改,客户端也需要配。
bind_port = 7000
# 启用token验证
authentication_method = token
# 你的token,相当于密码,客户端也需要配。
token = zhe_li_tian_mi_ma
# 服务端(也就是本机)启动的http监听端口,如果被占用可以修改。
vhost_http_port = 80
# 服务端(也就是本机)启动的https监听端口,如果被占用可以修改。
vhost_https_port = 443

# 监控服务端口,通过http://ip:7500 可使用
dashboard_port = 7500
# 监控服务账号
dashboard_user = admin
# 监控服务密码
dashboard_pwd = admin

3. 启动

/etc/frp/frps -c /etc/frp/frps.ini

需要关闭进程的先查到pid,再执行kill。

ps aux | grep frps
kill -9 pid

4. 加开机启动项

vi /lib/systemd/system/frps.service
[Unit]
Description=fraps service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target

[Service]
Type=simple

ExecStart=/etc/frp/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

启停进程使用的命令。

systemctl start frps
systemctl status frps
systemctl stop frps

5. 查看监控

浏览器打开 http://ip:7500/,输入账号密码即可查看全部的穿透配置和流量。

客户端搭建

1. 下载&解压

其实和服务端的下载&解压一样,因为frp的服务端和客户端都在一个压缩包里面。这里以x86架构64位的windows系统为例,下载压缩包并解压。其它版本请到这里选择版本下载。

2. 配置

打卡解压后的文件夹,编辑配置文件frpc.ini。

[common]
# 你的服务端的ip
server_addr = 8.8.8.8
# 你的服务端的绑定端口
server_port = 7000
# 你的服务端的token
token = zhe_li_tian_mi_ma

# 配一个ssh穿透,这里只是起个名字
[ssh1]
# 协议tcp
type = tcp
# 内网ip
local_ip = 127.0.0.1
# 内网ip下的端口
local_port = 22
# 暴露在服务端的端口
remote_port = 6221

# 配另一个ssh穿透,不限制个数
[ssh2]
type = tcp
local_ip = 192.168.50.3
local_port = 22
remote_port = 6222

# 配http穿透
[web1]
# 访问协议是http、https的,不用配服务端端口,因为服务端vhost_http_port 、vhost_https_port 配置了
type = http
local_ip = 192.168.50.3
local_port = 8080
# 多个http穿透是通过custom_domains区分的
custom_domains = w1.yourdomain.com

# 再配一个http穿透
[web2]
type = http
local_ip = 192.168.50.3
local_port = 9999
custom_domains = w2.yourdomain.com

# 也可以用tcp协议替代http协议,这个配置等价与web2,但是服务端的端口不一样。如果需要端口统一可以在服务端部署nginx解决
[web3]
type = tcp
local_ip = 192.168.50.3
local_port = 9999
remote_port = 8888
 
# windows远程桌面
[RDP]
type = tcp
local_ip = 192.168.50.10
local_port = 3389
remote_port = 3389

3. 启动

4. 华硕梅林固件

华硕梅林固件也可以安装frp客户端,在软件中心里安装“frpc内网穿透 v1.7”即可配置(对应frpc版本是0.20.0)。配置项都是一样的,不习惯页面交互配置的也可以使用"自定义设置",和frpc.ini完全一样。

问题解决

现象:客户端连接服务端时,服务端有如下报错,同时服务端进程退出。服务端版本0.33.0(最新版0.48.0也有这个问题),客户端版本0.20.0。

解决办法:服务端使用和客户端一样的版本0.20.0后问题解决。

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xa8c1fe]

goroutine 31 [running]:
github.com/fatedier/frp/server.(*Service).RegisterControl(0xc0003ae900, {0xe42438, 0xc00013c820}, 0xc0003f3f40)
	github.com/fatedier/frp/server/service.go:510 +0x3fe
github.com/fatedier/frp/server.(*Service).handleConnection(0xc0003ae900, {0xe3ea88?, 0xc000038090?}, {0xe42438, 0xc00013c820})
	github.com/fatedier/frp/server/service.go:372 +0x2b4
created by github.com/fatedier/frp/server.(*Service).HandleListener.func1
	github.com/fatedier/frp/server/service.go:454 +0x208


评论