frp内网穿透以及nginx反代理
本文最后更新于 689 天前,其中的信息可能已经有所发展或是发生改变。

记录 frp 穿透 http 以及 ssh 服务的相关配置,以及 nginx 反代理 frp 的 http 到三级域名。

我的环境:

  • 阿里云ECS
  • OS: Ubuntu20.04

1. 服务端

官方 repo: fatedier/frp

下载:

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
# 解压与删除安装包
tar -xzvf frp_0.30.0_linux_amd64.tar.gz && rm frp_0.30.0_linux_amd64.tar.gz
# 删除不需要的客户端程序与配置
cd frp_0.30.0_linux_amd64 && rm -rf frpc*

配置:

[common]
# 服务端地址,客户端连接时需要同一端口
bind_addr = 0.0.0.0
bind_port = 7000

# 虚拟端口,用户访问客户端时的端口号
vhost_http_port = 8080
vhost_https_port = 8443

# dashboard地址,可以查看frp状态
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

# 日志文件目录、过滤等级、最大天数
log_file = ./frps.log
log_level = trace
log_max_days = 3

# token 客户端需要相同的值
token = 12345678

# 允许的端口,逗号间隔,端口区间-间隔???
#allow_ports = 10000-50000

# 每个代理可以创建的最大连接数量,客户端代理中使用 pool_count 指定预创建的连接数量。
max_pool_count = 5

# 每个客户端最大使用端口数量
max_ports_per_client = 0

# 自定义到子级域名
subdomain_host = frp.yourdomain.com

这样如果有客户端连接后,访问其 http 的 url 为:sub.yourdomain.com:8080,如果按下下面配置了 http 的反代理,则 url 为:sub.yourdomain.com,保持默认就好。

上面配置文件修改后还需要在云服务里开放对应的端口入方向,如上面的 7000 和 7500 以及虚拟端口(上面的dashboard端口、虚拟端口都可以通过nginx代理)。

如果使用了二级域名则还需要配置域名解析,将 *.yourdomain.com 解析到服务器公网 ip。

服务端运行:

./frps -c ./frps.ini

以服务运行:

cp systemd/frps.service /lib/systemd/system
systemctl enable frps

2. nginx 反代理 frp 的 http 到三级域名

nginx 反代理 frp 的 http 或者 https 有两个好处:一是不需要在云主机上开启对应的端口的出入规则,二是每次输入 url 时不需要更改默认端口。

由于我主机上二级域名还有 jupyterhub 等服务,所以本次将其反代理到三级域名,过程如下:

新建 nginx 配置文件

# 在 sites-available 下创建配置文件
touch /etc/nginx/sites-available/frpserver.conf
# 创建软连接到 site-enabled
ln -s /etc/nginx/sites-available/frpserver.conf /etc/nginx/sites-enabled/frpserver.conf

# 编辑文件配置如下信息
vim /etc/nginx/sites-enabled/frpserver.conf

配置文件内容:

# 代理 frp dashboard
server {
    listen       80;
    server_name frp.brothereye.cn;

    access_log /var/log/nginx/frpadmin.access.log;
    error_log /var/log/nginx/frpadmin.error.log;

    location / {
        proxy_pass http://127.0.0.1:7445;  # frp web http port
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    if ($http_user_agent ~* ".*spider.*|.*bot.*") {
        return 403;
    }
}

# 代理 frp http 客户端
server {
    listen       80;
    server_name  *.frp.brothereye.cn;

    access_log /var/log/nginx/frp.access.log;
    error_log /var/log/nginx/frp.error.log;

    location / {
#        add_header Content-Type text/plain;  # debug
#        return 200 http://$host:8080;  # debug
        proxy_pass http://127.0.0.1:8080;  # vhost http port
        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_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }

    if ($http_user_agent ~* ".*spider.*|.*bot.*")
    {
        return 403;
    }

}

2. 客户端

官方repo: fatedier/frp release 中下载与服务端相同的版本即可。

http 以及 ssh 配置(官方最全配置:frpc_full.ini),新建文件 frpc_http_ssh.ini写入以下内容:

[common]
# 服务端地址,填自己服务器 ip 和上面服务端设置的端口
server_addr = xxx.xxx.xxx.xxx
server_port = 7000

# 日志文件目录、过滤等级、最大天数
log_file = ./frpc.log
log_level = info
log_max_days = 3

# token 需要与服务端相同
token = 12345678

# 查看客户端连接信息
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

# 预建立的连接数量
pool_count = 2

# 代理名字前缀,实际代理名为 {user}.{proxy}
user = user01

# 首次登陆到服务端失败则终止客户端程序
login_fail_exit = true

# 连接服务端的传输层协议。支持tcp, kcp, websocket
protocol = tcp

[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
# 是否加密流量。开启后可绕过防火墙
use_encryption = false
# 是否压缩,开启后可以压缩报文但消耗 cpu
use_compression = true
# 访问客户端代理的网页时验证
http_user = admin
http_pwd = admin
# 子级域名前缀
subdomain = web01
# 自定义域名,自定义域名不能属于子级域名或者泛域名
#custom_domains = web02.yourdomain.com
# URL 路由,根据此前缀过滤请求转发到客户端,逗号间隔,仅支持http
locations = /
# 更改用户访问到的 host,仅支持 http
#host_header_rewrite = example.com
# 更改用户访问到的请求头
#header_X-From-Where = frp

[ssh]
type = tcp
local_ip = 127.0.0.1 
local_port = 22
remote_port = 2222
use_encryption = true
use_compression = true

注意:

frpc 中的健康检查(health_check开头)有时会无法验证心跳包,导致穿透失败,故不推荐加健 康检查,除非确认过健康检查可用。

运行:

./frpc -c ./frpc_http_ssh.ini

加上上面配置过的反代理,访问的完整 url 为: http://web01.frp.brothereye.cn
如果未配置 nginx 反代理则需要加主机中配置的 vhost_http_port,这里的具体 url 为: http://web01.frp.brothereye.cn:8080

评论

  1. 3年前
    2020-1-19 20:42:11

    其实tmux没有必要…现在下载下来的压缩包解压后有个systemd,更改下frps.service的配置然后把frps.service放到/etc/systemd/system中就可以方便管理了。

    • root 博主
      3年前
      2020-1-20 16:16:16

      好的,谢谢啦。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇