frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https, stcp 协议。利用免费 frp 内网穿透服务实现处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。对于 http 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个 80 端口,支持 80 端口穿透。利用处于内网或防火墙后的机器,对外网环境提供 tcp/udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机,支持 kcp 协议和点对点穿透。

A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.

架构图

服务端安装

1、在GitHub下载最新的release版本 【https://github.com/fatedier/frp/releases】,选择对应的服务器版本,可以查看当前服务器版本架构只需要运行arch 即可回显架构。

以阿里云服务器为例:

以 arm64 架构举例(目前大多数都应该是这个架构),本文撰写时 frp 最新版是 v0.27.1

cd /root
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.27.1/frp_0.27.1_linux_amd64.tar.gz
tar -xzvf frp_0.27.1_linux_amd64.tar.gz
mv frp_0.27.1_linux_amd64 /usr/local/
cd /usr/local/
# 更短名
mv frp_0.27.1_linux_amd64/ frp_0.27.1 
# 确保 frps 程序具有可执行权限
chmod +x frps

 

软件目录【不同版本可能存在部分差异】

然后试着运行一下 frps,看看是否能正常运行

./frps --help

 

如果提示 ./frps: cannot execute binary file: Exec format error  只能说明软件版本与服务器架构选择不匹配,更换版本即可解决。

服务端配置

服务端只需要配置frps.ini 保存即可,

# 下面这句开头必须要有,表示配置的开始
[common]
# frps绑定端口 (必选)
bind_port = 7000
# frps 日志 (可选)
log_file = ./frps.log
# frps 日志等级 (可选)
log_level = warn
# frps 日志存放天数 (可选)
log_max_days = 30
# 默认为900秒,即15分钟,如果设置成0就不会对报文时间戳进行超时验证
authentication_timeout = 900
# 仪表盘端口,只有设置了才能使用仪表盘(即后台)
dashboard_port = 7500
# 仪表盘访问的用户名密码,如果不设置,则默认都是 admin
dashboard_user = admin
dashboard_pwd = admin
# frp 穿透访问内网中的网站监听端口 配合后面使用nginx做域名绑定访问
vhost_http_port = 7001
# 将 frp.so.codeceo.org 解析到服务端后,可以使用此域名来访问客户端对应的 http
subdomain_host = frp.so.codeceo.org

 

测试开启服务端

./frps -c ./frps.ini &  # 以后台守护进程开启服务端

 

nginx 配置

server
{
    listen 80;
    listen [::]:80;
    # 这里使用统配符解决客户端绑定的域名访问
    server_name *.so.codeceo.org;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/frp;
   
    # frps proxy
    location / {
        # 反向代理frps 7001端口
        proxy_pass http://127.0.0.1:7001;
        proxy_set_header    Host            $host:80;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header   X-Powered-By;
    }
}

 

客户端配置

下载对应客户机器的frp版本【https://github.com/fatedier/frp/releases】,版本选择与服务端相同。

修改frpc.ini

[common]
# 服务端公网IP
server_addr = xxx.xxx.xxx.xxx 
# 服务端frps绑定端口
server_port = 7000

[web1]
type = http
local_port = 80
custom_domains = web1.so.codeceo.org

[web2]
type = http
local_ip = localhost
local_port = 9528
use_gzip = true
custom_domains = web2.so.codeceo.org

[web6]
type = http
local_port = 80
custom_domains = web6.so.codeceo.org

 

客户端启动测试

./frpc -c frpc.ini

 

可以登录dashboard查看当前启动的代理是否正常(访问ip:7001  vhost_http_port)

如果出现  login to server failed: EOF    可以尝试检测本机网络是否有问题。

写在最后:

当前只是一个http案例,还有更多 TCP/UDP [转发 ssh]、HTTP(S) [转发路由器设置页面]、TCP/UDP [范围转发]等需要自己慢慢摸索。

如果都使用的是阿里云ECS,开启上面指定的端口访问,否则会 connect error.