1. 为什么要在Unraid上搭建HTTPS内网穿透服务

最近几年,越来越多的家庭用户开始搭建自己的NAS系统。Unraid凭借其出色的Docker支持和灵活的存储方案,成为了很多技术爱好者的首选。但随之而来的问题是:如何安全地在外网访问家里的这些服务?

我自己的Unraid服务器上跑了十多个服务,从密码管理、电子书库到家庭相册。最开始我用简单的端口映射,但很快就发现两个痛点:一是每次访问都要记不同的端口号,二是HTTP明文传输太不安全。后来尝试过各种方案,最终发现Acme.sh + Nginx Proxy Manager的组合是最优雅的解决方案。

这个方案的核心价值在于:

  • 全自动证书管理:Let's Encrypt证书每90天自动续期,完全不用人工干预
  • 统一访问入口:所有服务通过同一个HTTPS端口暴露,只需记住不同子域名
  • 内网穿透兼容:无论是否有公网IP,都能通过内网穿透工具实现安全访问
  • 配置可视化:Nginx Proxy Manager提供了友好的Web界面,告别手动编辑nginx.conf

2. 基础环境准备

2.1 硬件与网络要求

在开始之前,建议先检查你的硬件配置是否满足需求。我的Unraid主机配置如下:

  • CPU:Intel i5-10400(6核12线程)
  • 内存:32GB DDR4
  • 存储:2TB SSD缓存 + 4x4TB HDD阵列
  • 网络:千兆有线连接

虽然这个配置看起来有些过剩,但实际使用中发现当同时运行多个Docker容器时,足够的内存和CPU资源确实能带来更流畅的体验。特别是当Nginx Proxy Manager需要处理大量并发请求时。

网络方面需要特别注意:

  1. 确保路由器支持端口转发(如果需要从公网访问)
  2. 建议为Unraid主机分配静态IP地址
  3. 准备一个域名(可以是免费二级域名如freenom提供的.tk/.ml等)

2.2 必须的Docker应用安装

在Unraid的CA(Community Applications)应用中搜索并安装以下组件:

  1. Nginx Proxy Manager

    • 选择官方镜像jc21/nginx-proxy-manager
    • 端口映射建议:81:81(管理界面)、80:80(HTTP)、443:443(HTTPS)
    • 需要挂载/data和/letsencrypt目录到本地存储
  2. Acme.sh

    • 使用neilpang/acme.sh镜像
    • 需要挂载一个持久化卷用于存储证书文件
    • 根据你的DNS提供商设置对应的API密钥环境变量
  3. User Scripts插件

    • 用于设置自动续期任务
    • 在Unraid的插件市场中搜索安装

安装完成后,建议先不要立即配置,我们会在后续步骤中详细说明每个组件的设置方法。

3. 使用Acme.sh申请SSL证书

3.1 配置DNS API密钥

以阿里云域名为例,首先需要在阿里云控制台获取API密钥:

  1. 登录阿里云控制台 → 鼠标悬停在右上角头像 → 选择"AccessKey管理"
  2. 创建新的AccessKey并妥善保存

然后在Unraid的终端中执行以下命令创建Acme.sh容器:

docker run --rm -itd \
  -v /mnt/user/appdata/acme.sh:/acme.sh \
  -e Ali_Key="你的阿里云Key" \
  -e Ali_Secret="你的阿里云Secret" \
  --net=host \
  --name=acme.sh \
  neilpang/acme.sh

重要提示:不同DNS提供商的环境变量名称不同。比如Cloudflare需要设置CF_Key和CF_Email,DNSPod需要DP_Id和DP_Key等。

3.2 申请通配符证书

执行以下命令申请证书(以example.com为例):

docker exec acme.sh --set-default-ca --server letsencrypt
docker exec acme.sh --issue --dns dns_ali -d example.com -d *.example.com

这里有几个实用技巧:

  • --force参数可以强制更新证书(即使未到期)
  • 如果遇到报错,可以添加--debug 2参数查看详细日志
  • 通配符证书(*.example.com)可以覆盖所有子域名

3.3 安装证书到指定位置

证书申请成功后,需要将其安装到Nginx Proxy Manager能访问的位置:

docker exec acme.sh --install-cert -d example.com \
  --key-file /acme.sh/privkey.pem \
  --fullchain-file /acme.sh/fullchain.pem

这样就会在挂载目录/mnt/user/appdata/acme.sh下生成privkey.pem和fullchain.pem两个关键文件。

4. 配置Nginx Proxy Manager

4.1 初始设置与登录

安装完成后,通过http://你的UnraidIP:81访问管理界面。首次登录使用默认凭证:

  • 邮箱:admin@example.com
  • 密码:changeme

登录后系统会强制要求修改密码,建议使用密码管理器生成并保存强密码。

4.2 导入SSL证书

在管理界面左侧菜单选择"SSL Certificates" → "Add SSL Certificate":

  1. 证书名称填写你的域名(如example.com)
  2. 证书类型选择"Custom"
  3. 私钥(KEY)选择之前生成的privkey.pem文件
  4. 证书链(CERTIFICATE)选择fullchain.pem文件

导入成功后,证书会出现在列表中并显示有效期信息。

4.3 配置反向代理规则

现在可以为你的服务添加反向代理了。以Vaultwarden密码管理器为例:

  1. 点击"Proxy Hosts" → "Add Proxy Host"
  2. 在"Details"标签页:
    • 域名填写vault.example.com
    • Scheme选择http
    • Forward Hostname/IP填写Unraid内网IP
    • Forward Port填写Vaultwarden的容器端口(默认80)
  3. 在"SSL"标签页:
    • 选择之前导入的SSL证书
    • 开启"Force SSL"和"HTTP/2 Support"
  4. 点击保存

实测经验:如果遇到502错误,检查以下几点:

  • 确保后端服务确实在指定端口运行
  • 尝试关闭"Block Common Exploits"选项
  • 检查Nginx Proxy Manager日志获取详细错误信息

5. 实现内网穿透与自动化

5.1 内网穿透方案选择

根据你的网络环境,可以选择不同的穿透方案:

有公网IP的情况:

  1. 在路由器设置端口转发,将443端口映射到Unraid的443端口
  2. 配置DDNS服务动态更新域名解析

无公网IP的情况:

  1. 使用frp等穿透工具
  2. 配置云服务器作为中转
  3. 将域名解析指向云服务器IP

5.2 证书自动续期设置

通过User Scripts插件设置自动任务:

  1. 在Unraid界面进入"User Scripts"
  2. 创建新脚本,粘贴以下内容(根据实际情况修改路径和域名):
#!/bin/bash
# 续期证书
docker exec acme.sh --renew -d example.com --force
# 复制证书到NPM目录
cp /mnt/user/appdata/acme.sh/{privkey,fullchain}.pem /mnt/user/appdata/NginxProxyManager/custom_ssl/npm-1/
# 重启NPM使新证书生效
docker restart NginxProxyManager
  1. 设置定时任务,建议每月执行一次:
    • Cron表达式:0 0 1 * *

5.3 常见问题排查

证书申请失败:

  • 检查DNS解析是否生效(可用dig或nslookup工具)
  • 确认API密钥权限足够
  • 尝试使用acme.sh的--debug模式查看详细日志

NPM无法启动:

  • 检查端口是否被占用(netstat -tulnp)
  • 查看容器日志(docker logs NginxProxyManager)
  • 确保挂载目录有正确权限

HTTPS访问异常:

  • 检查浏览器控制台报错信息
  • 使用openssl s_client -connect命令测试证书链
  • 确认系统时间正确(证书验证依赖准确时间)

6. 安全加固与性能优化

6.1 安全最佳实践

  1. 防火墙规则:

    • 只开放必要的端口(通常只需443)
    • 建议屏蔽来自海外的访问(如果服务仅国内使用)
  2. NPM安全设置:

    • 启用"Access Lists"限制管理界面访问IP
    • 定期检查"Audit Log"中的异常登录
  3. 证书管理:

    • 为不同子域名使用独立证书(减少单点风险)
    • 监控证书到期提醒(可配置Telegram机器人通知)

6.2 性能调优技巧

  1. Nginx参数优化:

    • 在"Advanced"标签页添加以下配置:
      client_max_body_size 100m;
      keepalive_timeout 75s;
      gzip on;
      
  2. 资源限制:

    • 为NPM容器分配固定内存(如512MB)
    • 设置CPU优先级避免资源争抢
  3. 缓存策略:

    • 对静态资源启用浏览器缓存
    • 考虑添加Redis缓存层

这套方案在我自己的Unraid服务器上稳定运行了两年多,期间经历了多次证书自动续期和Nginx版本升级,从未出现过服务中断。最大的收获是再也不用为各种服务的端口号和HTTP安全问题头疼了,现在所有家庭成员都能通过简单的域名访问需要的服务,而且安全性得到了充分保障。

Logo

更多推荐