分享一下自己的 frp 配置方案,感觉增加一个新服务所需的配置很少,还是比较方便的。
适用的场景:内网机器 I 上有很多不同的服务,监听各种端口;有一台公网服务器 P,希望通过一个域名的不同子域名,访问内网不同的服务。例如,jellyfin.contoso.com 访问内网 jellyfin,uptime.contoso.com 访问内网 uptime kuma。
整体流程
- 域名通配符解析到公网服务器 P 上
- P 上使用 nginx 监听 80 和 443 端口,将域名通配符转发到 frps 。nginx 可以配置上通配符的 ssl 证书,所以所有二级域名也都自带了 https。
- frps 与 内网 frpc 通信,frpc 根据自己的规则,按照域名将请求转发到对应的内网服务
req -> P[ nginx -> frps ] -> I[ frpc -> service A/B/C/D ]
nginx 配置
server {
listen 443;
server_name *.consoto.com;
ssl on;
ssl_certificate /etc/nginx/cert/contoso.cert.pem;
ssl_certificate_key /etc/nginx/cert/contoso.key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:7070;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_redirect off;
proxy_read_timeout 240s;
client_max_body_size 200m;
}
}
7070 是 frps 用来接收请求的端口。
frps 配置
[common]
# 服务器端监听客户端连接请求的端口 - 与 frpc 相对应,同时需要在防火墙开放这个端口
bind_port = 7060
# 服务器端监听http请求的端口 - 与 nginx 相对应
vhost_http_port = 7070
# 服务器用以显示连接状态的站点端口, 如果要看这个站点需要在 nginx 额外配置一条规则转发到 7071 端口哦
dashboard_addr = 0.0.0.0
dashboard_port = 7071
# dashboard对应的用户名/密码
dashboard_user = CONTOSO
dashboard_pwd = CONTOSO
# 客户端连接校验码 - 与 frpc 相对应
privilege_token = CONTOSO
frps 有三个端口,1 个用来和 frpc 连接,1 个用来接收 http 请求,1 个用来展示 frps 的控制面板网页。
frpc 配置
[common]
server_addr = 这里填写公网服务器 P 的 IP 地址
server_port = 7060 # 对应 frps 中的端口
privilege_token=CONTOSO # 对应 frps 中的配置
[service1]
type = http
local_port = 8001
custom_domains = jellyfin.contoso.com
[service2]
type = http
local_port = 8002
custom_domains = uptime.contoso.com
frpc 的配置也并不复杂。通过以上可以看出,如果后面有新的服务需要添加,无需改动公网服务器 P 上的任何内容,只需要在内网机器 I 上面,给 frpc 新增加一条记录就可以了,新的服务便可以通过新的二级域名进行访问,并且带有 https 证书。