frp 将内网服务开放到公网

经验 · 2023-08-20

分享一下自己的 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 证书。

homelab frp
Powered by Typecho, theme Jasmine