frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力。类似的还有:ngrok、lanproxy等(frp和ngrok都是用go实现,lanproxy是用java实现)。利用内网穿透,我们可以实现微信调试,将内网的应用对外展示等。
搭建分服务器端和客户端。

服务器端搭建

下载软件

下载软件:FRP Releases
支持多平台,需根据服务器系统和CPU架构选择下载。下载的包是同时包含服务器端和客户端软件的。下载速度可能会比较慢,请耐心等会。

## 存放下载文件目录
cd /data/source
## 下载
wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_386.tar.gz
## 解压
tar zxf frp_0.27.0_linux_386.tar.gz
## 移至安装目录
mv frp_0.27.0_linux_386 /data/soft/frp

服务端配置

frps.ini是服务端的配置文件。
完整的配置说明可以参考:frps配置
例如我的配置如下:

[common]
# 服务端监听端口
bind_port = 7000
# 搭建http web服务,监听的端口(例如:80,但由于80端口留给nginx,此处改为其它端口)
vhost_http_port = 7080

# 配置服务器管理看板
# 限定访问ip,如果不限制访问请设置为:0.0.0.0。
# 监听端口,管理员的登录名和密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password

# 设置记录日志的文件
# 日志级别:trace, debug, info, warn, error,从低到高
# 日志最多保留的天数
log_file = /data/soft/frp/log/stdout.log
log_level = info
log_max_days = 3

# 认证token
token = token

# 如果设置subdomain_host,可以在客户端frpc中为http或https设置子域名,比如:test,这可以通过test.frp.abc.com访问客户端。
subdomain_host = frp.abc.com

配置好后,就可以通过命令:./frps -c ./frps.ini启动frps服务了。
当然我们可以将命令放置在脚本,通过脚本来启动:

启动脚本

创建文件:

touch /data/soft/scripts/frps_start.sh
vim /data/soft/scripts/frps_start.sh

脚本内容:

#!/bin/bash
/data/soft/frp/frps -c /data/soft/frp/frps.ini &

echo $! > /data/soft/frp/log/frps.pid

停止脚本

创建文件:

touch /data/soft/scripts/frps_stop.sh
vim /data/soft/scripts/frps_stop.sh

脚本内容:

#!/bin/bash
pkill -F /data/soft/frp/log/frps.pid
rm -f /data/soft/frp/log/frps.pid

最后给脚本添加可执行权限:

chmod +x frps_start.sh frps_stop.sh

这样就可以通过/data/soft/scripts/frps_start.sh启动frps服务,通过/data/soft/scripts/frps_stop.sh停止frps服务。
如果系统随系统自启动,可以将命令/data/soft/scripts/frps_start.sh添加至/etc/rc.local中。

FRP与Nginx共用80端口

在nginx的配置文件目录,添加frp.abc.com.conf配置文件,然后配置nginx反向代理。
配置内容如下:

# 服务器端管理后台
server {
    listen 80; 
    server_name frp.abc.com;

    location / { 
        proxy_pass http://127.0.0.1:7500;
        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;
    }   
}

# 代理http web
server {
    listen       80; 
    server_name  *.frp.abc.com;

    location / { 
        proxy_pass http://127.0.0.1:7080;
        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;
    }   
}

# 如果启用SSL
server {
    listen 443 ssl;
    server_name *.frp.abc.com;

    # ssl on; 
    ssl_certificate /etc/letsencrypt/live/frp.abc.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/frp.abc.com/privkey.pem;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 60m;

    location / {
        proxy_pass http://127.0.0.1:7080;
        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;
    }
}

客户端配置

frpc.ini是客户端的配置文件。
完整的配置说明可以参考:frpc配置
例如我的配置内容:

[common]
server_addr = {服务端ip}
server_port = 7000
token = {服务端设置的token}

# 配置日志文件
# 日志级别:trace, debug, info, warn, error
log_file = ./frpc.log
log_level = info
log_max_days = 3

# 客户端管理配置
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[ssh_a]
type = tcp
local_ip = 127.0.0.1
local_port = 39888
remote_port = 6000

[web_a]
type = http
local_ip = 127.0.0.1
local_port = 80
subdomain = suba

[web_b]
type = http
local_ip = 127.0.0.1
local_port = 8080
subdomain = subb

[web_c]
type = http
local_ip = 127.0.0.1
local_port = 8083
subdomain = subc

配置好后,就可以通过如下命令启动客户端:

  • Linux:./frpc -c ./frpc.ini
  • Windows:frpc.exe -c frpc.ini

标签: 网络

已有 6 条评论

  1. 按照您的教程,https的配置会出现502呢

    1. 是我搞错了,根本就不用配置frps的https。大雾

      1. 是的,frps不需要配置https,直接通过nginx代理https。

  2. 徐

    内网的frpc中不支持https服务的内外网穿透,会出现502

    1. 我这个方案是通过nginx进行反代Https的,只要http能成功的话,https应该也没有问题的。

    2. # 如果启用SSL
      server {
      listen 443 ssl;
      server_name *.frp.abc.com;

      # ssl on;
      ssl_certificate /etc/letsencrypt/live/frp.abc.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/frp.abc.com/privkey.pem;
      ssl_prefer_server_ciphers on;
      ssl_session_timeout 60m;

      location / {
      proxy_pass http://127.0.0.1:7080;
      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;
      }
      }

添加新评论