Nginx stream套娃实现frps bindPort伪装与proxy_protocol透传

本文最后更新于 2024年7月7日

额我也不知道这算不算是伪装,但最终的效果是将 frps 服务端的访问端口(7000)藏在 nginx 网站的 443 端口后面,通过 ssl_preread 基于域名对 frps 流量进行分流,同时保留 proxy_protocol 的正常工作。(至少你可以不用再对外暴露 7000 端口了 (^_^) )

我的 Nginx 没有 ssl_preread 怎么办?

  1. nginx.conf 中进行以下配置
1
2
3
4
5
6
7
stream {
log_format basic '$remote_addr [$time_local] '
'$protocol $status -> $upstream_addr '
'($bytes_sent $bytes_received $session_time)';
access_log /var/log/nginx/stream-access.log basic buffer=32k;
include /etc/nginx/conf.d/*.stream;
}
  1. conf.d 目录下创建 10-default.stream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
map $ssl_preread_server_name $name_https {
frps.example.com 127.0.0.1:3111; # frps https(proxy)
default 127.0.0.1:8443; # nginx https
}

# 套娃配置是为了吸收掉frps服务端口不兼容的proxy_protocol协议,防止对frp客户端和服务端的握手造成干扰
server {
listen 3111 proxy_protocol;
proxy_pass frps:7000; # frps https
}

server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $name_https;
proxy_protocol on;
ssl_preread on;
}
  1. Web 服务器配置的 https监听端口记得从 443 改到 8443!

具体是否真的能避免 frps 的流量被嗅探出来就不知道了,得分析 frps 的发包是不是有什么特征了~~(本人比较菜分析不出来捏)~~

额,好短!(确实)


Nginx stream套娃实现frps bindPort伪装与proxy_protocol透传
https://blog.jsesnr.top/posts/f0510e3b/
作者
Jesse Senior
发布于
2024年7月7日
许可协议