从“局域网自闭”到“公网顶流”:一份让 frp 和 Nginx 都直呼内行的 HTTPS 部署秘籍

一、 架构设计与前期准备:给内网穿上“防弹衣”

直接把你的内网服务(比如 NAS 或开发机)裸奔在公网,就像在大马路上裸奔一样,黑客们可是会流口水的。为了不让你的数据“天体秀”,我们采用 Nginx + frp 这对“黄金搭档”。Nginx 负责在前面当保安,处理 HTTPS 加密和 SSL 证书,把流量“安检”后再交给内网的 frp。这样既安全,又显得你很专业。

1. 端口规划:给流量安排个座次

  • 7000 (TCP):这是 frp 的“生命线”。frps(服务端)和 frpc(客户端)就靠它打电话,必须开放,不然它俩就失联了。
  • 80 / 443 (TCP):门面担当。Nginx 在这里接客,443 负责把 HTTP 变成 HTTPS,给流量穿上加密马甲。
  • 8080 (TCP):frp 的“秘密通道”(vhostHTTPPort)。只听本地(127.0.0.1),外面的人看不见,专门接收 Nginx 递过来的“私活”。
  • 7500 (TCP):frp 的“仪表盘”。用来监控流量和隧道状态,看看谁在偷偷用你的带宽。

2. 环境准备清单:工欲善其事,必先买买买

  • 公网服务器(VPS):建议 2核4G 起步,系统推荐 Ubuntu 20.04 LTS。得有独立公网 IP,不然谁知道你家在哪?
  • 内网设备:你想穿透的那台机器,比如群晖 NAS、树莓派,或者你那台从不关机的办公电脑。
  • 域名与 DNS:买个域名(国内服务器记得备案)。去 DNS 服务商那加个 A 记录,把 *.yourdomain.com(泛域名)指向你的公网 IP。
  • 防火墙策略:云服务商的安全组里,把 7000、80、443、7500 这些端口都放行,别把自家人拦在门外。

二、 服务端部署与配置 (frps):搭建大本营

1. 下载并安装 frp

登录你的公网服务器,找个风水宝地(目录)把 frp 请下来(以 v0.61.0 为例):

# 创建目录并入住
mkdir -p /opt/frp && cd /opt/frp

# 下载解压(看清楚是 amd64 还是 arm64,别下错了)
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
tar -zxvf frp_0.61.0_linux_amd64.tar.gz
mv frp_0.61.0_linux_amd64/* /opt/frp/
rm -rf frp_0.61.0_linux_amd64 frp_0.61.0_linux_amd64.tar.gz

2. 编写服务端配置文件

编辑 /opt/frp/frps.toml,这可是核心机密:

# 基础配置
bindPort = 7000

# 认证配置(密码设复杂点,别用 123456)
auth.method = "token"
auth.token = "Your_Strong_Password_Here_123!" 

# 虚拟主机配置
# 只在本地 8080 端口偷听,别暴露给公网
vhostHTTPPort = 8080 

# 管理面板配置(看看谁在摸鱼)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "Your_Dashboard_Password_456!"

# 日志配置
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 3

3. 配置 Systemd 开机自启:让服务“长生不老”

为了防止服务器重启后 frp 罢工,我们得给它办个“编制”(Systemd 服务),创建服务文件 /etc/systemd/system/frps.service:

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

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

[Install]
WantedBy=multi-user.target

启动并看看它活没活着:

systemctl daemon-reload
systemctl enable frps
systemctl start frps
systemctl status frps

三、 申请 HTTPS 泛域名证书:给网站发个“身份证”

为了让浏览器地址栏那把小锁亮起来,我们用 acme.sh 免费白嫖 Let’s Encrypt 的泛域名证书。

1. 安装 acme.sh

curl https://get.acme.sh | sh -s email=my@example.com
source ~/.bashrc

2. 配置 DNS API 并申请证书(以阿里云为例)

去阿里云控制台搞个 AccessKey ID 和 Secret,这是你的“通行证”。

export Ali_Key="LTAI5t..."
export Ali_Secret="Your_Secret_Key..."

# 申请泛域名证书(*.yourdomain.com 一把梭)
acme.sh --issue --dns dns_ali -d yourdomain.com -d *.yourdomain.com

3. 部署证书到 Nginx 目录

mkdir -p /etc/nginx/ssl/yourdomain.com
acme.sh --install-cert -d yourdomain.com \
--key-file /etc/nginx/ssl/yourdomain.com/key.pem \
--fullchain-file /etc/nginx/ssl/yourdomain.com/fullchain.pem \
--reloadcmd "systemctl force-reload nginx"

四、 Nginx 反向代理与 SSL 配置:流量的“交通指挥官”

创建 Nginx 配置文件 /etc/nginx/sites-available/frp.conf,把 HTTP 流量强行赶到 HTTPS 车道,再转交给 frp 的 8080 端口。

# 1. HTTP 强制跳转 HTTPS(不听话就重定向)
server {
    listen 80;
    server_name *.yourdomain.com;
    return 301 https://$host$request_uri;
}

# 2. HTTPS 反向代理配置(正经干活的地方)
server {
    listen 443 ssl http2;
    server_name *.yourdomain.com;

    # SSL 证书配置(亮出身份证)
    ssl_certificate     /etc/nginx/ssl/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com/key.pem;

    # 安全优化(拒绝老掉牙的协议)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 核心:把流量倒给 frp
    location / {
        proxy_pass http://127.0.0.1:8080;

        # 关键 Header(告诉 frp 客人是谁)
        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_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

激活配置并重载 Nginx:

ln -s /etc/nginx/sites-available/frp.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

五、 客户端部署与配置 (frpc):打通任督二脉

在内网设备(NAS 或电脑)上安装 frpc,让它去连接公网服务器。

1. 编写客户端配置文件

编辑 frpc.toml:

serverAddr = "1.2.3.4" # 你的公网服务器 IP
serverPort = 7000
auth.method = "token"
auth.token = "Your_Strong_Password_Here_123!" # 密码得和服务端对上暗号

# 场景一:映射本地 Web 服务(比如 NAS 管理页)
[[proxies]]
name = "nas-web"
type = "http"
localIP = "192.168.1.100" # 内网设备的 IP
localPort = 5000
customDomains = ["nas.yourdomain.com"]

# 场景二:映射 SSH 服务(TCP 协议,远程敲命令用)
[[proxies]]
name = "ssh-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # 外网访问端口

2. 启动客户端

Linux 下建议让它在后台默默干活:

nohup ./frpc -c ./frpc.toml > frpc.log 2>&1 &

六、 安全加固与运维建议:别做“漏勺”

  1. 强制 TLS 加密:在 frps.toml 里加上 transport.tls.force = true,强制客户端和服务端加密通信,防偷听。
  2. IP 白名单限制:SSH 这种敏感端口(如 6000),最好在云服务商安全组里设置“仅允许自家 IP 访问”,别给黑客留门。
  3. 隐藏版本号:Nginx 配置里把 server_tokens 关掉,别告诉别人你用的什么版本,省得被针对性攻击。
  4. 定期备份与监控:没事看看 frp 的 Dashboard,要是发现流量异常飙升,可能是有人拿你的服务器挖矿呢!

搞定!现在你可以得意地通过 https://nas.yourdomain.com 访问你的内网服务了,享受 HTTPS 小绿锁带来的安全感吧!

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 共8条

请登录后发表评论

    暂无评论内容