介绍
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