复用公网服务器进行内网穿透的一种方案

最近更新于 2024-09-24 19:25

Table of Contents

场景

我这个博客是部署在一台云服务器上的,因为一些原因需要再部署一个网盘(Nextcloud),也放在这台服务器上,实际部署后发现,内存吃紧和CPU满载的问题很严重。本身这台服务器配置就低,只部署博客的时候还有余,再部署 Nextcloud 就很吃紧了。
于是,我改变策略,在本地来部署 Nextcloud,通过内网穿透(frp)映射到博客用的服务器上,就能实现公网访问了。
但这里面就产生了一个问题,这台运行博客的公网服务器上 Nginx 已经占用了 https 443 端口,如果 frp 要映射就不能使用 443 端口了,使用非标的端口在访问的时候就需要在链接上加上端口,不是那么方便。
昨天我进行了整套实践,花了一天时间,完成了 Nextcloud 的本地搭建以及映射到公网,复用 443 端口(在运行博客的服务器上,已经解析实现了 https://iyatt.comhttps://blog.iyatt.com

实现

本地部署好 Nextcloud,服务器软件用的 nginx,监听 443 端口,配置好域名和证书文件

server {
    listen 443 ssl http2; # IPv4
    listen [::]:443 ssl http2; # IPv6
    server_name drive.iyatt.com; # 自己的域名

    // 域名证书文件路径
    ssl_certificate     /etc/nginx/cert/drive.iyatt.com.pem;
    ssl_certificate_key /etc/nginx/cert/drive.iyatt.com.key;

    ......

本地端 frp 使用的配置文件 frpc.toml

serverAddr = "公网服务器IP"
serverPort = 8079 # 自定义的公网服务器开放的用于接受 frp 连接的端口号

[[proxies]]
name = "web"
type = "https"
localIP = "localhost"
localPort = 443 # 本地网站服务使用的端口号,和 Nginx 监听的对应
customDomains = ["drive.iyatt.com"] # 自己的域名

为 frpc 创建服务,在 /etc/systemd/system 下创建 frpc.service,写入(参考)

[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/root/frp/frpc -c /root/frp/frpc.toml

[Install]
WantedBy=multi-user.target

配置启动

# 重新加载配置
sudo systemctl daemon-reload

# 重启 frpc.service 服务
sudo systemctl restart frpc

# 设置开机自启
sudo systemctl enable frpc

公网服务器 frp 使用的配置文件 frps.toml

bindPort = 8079 # 自定义的公网服务器开放的用于接受 frp 连接的端口号
vhostHTTPSPort = 8080 # 内网穿透后可以访问的端口号,如果云服务防火墙开放 8080 端口,此时就可以通过 8080 端口访问本地的服务,即这里的 https://drive.iyatt.com:8080

为 frps 创建服务,在 /etc/systemd/system 下创建 frps.service,写入(参考)

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/root/frp/frps -c /root/frp/frps.toml

[Install]
WantedBy=multi-user.target

配置启动

# 重新加载配置
sudo systemctl daemon-reload

# 重启 frpc.service 服务
sudo systemctl restart frps

# 设置开机自启
sudo systemctl enable frps

这就不是我期望的效果,我期望的效果是访问 https://drive.iyatt.com 而不是 https://drive.iyatt.com:8080
于是在公网服务器的 Nginx 上配置

server {
    listen 443 ssl http2; # 公网服务器监听的端口号
    server_name drive.iyatt.com; # 自己的域名

    # 域名证书文件路径,和本地配置一样
    ssl_certificate /etc/nginx/cert/drive.iyatt.com.pem;
    ssl_certificate_key /etc/nginx/cert/drive.iyatt.com.key;

    location / {
        proxy_pass https://127.0.0.1:8080; # 8080 是内网穿透后可以公网访问的端口号
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_ssl_server_name on;
        proxy_ssl_name drive.iyatt.com; # 自己的域名
        proxy_pass_header X-Accel-Buffering;
    }
}

Nginx 反向代理本地的 8080 端口转到 443 端口,Nginx 是支持多域名同端口的服务的,在每个 server 配置中 server_name drive.iyatt.com 这里就区别了域名,不同域名都使用 443 端口,最后访问不同的域名就是被分流到对应的 server 配置中。
这个 Nginx 配置本身就是实现反向代理本机 https 服务的方案。

复用公网服务器进行内网穿透的一种方案
Scroll to top