本笔记详细介绍了如何结合使用 FRP (Fast Reverse Proxy) 和 Nginx Proxy Manager (NPM) 来实现内网穿透,并通过域名反向代理访问内网服务。这对于在外网安全地访问家庭网络中的设备(如NAS、个人服务器等)非常有用。

服务端配置 (FRPS)

在您的公网服务器上,部署 FRP 服务端 (frps)。

1. 创建 docker-compose.yaml

version: "3.7"
services:
  frps:
    restart: always # 容器总是重启
    container_name: frps
    image: fatedier/frps:v0.34.1 # 使用指定版本的frps镜像
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间
      - /etc/timezone:/etc/timezone:ro   # 同步宿主机时区
      - ./frps.ini:/app/frps.ini:ro      # 挂载frps配置文件
    command: frps -c /app/frps.ini # 启动命令
    ports:
      - 9870:9870   # FRP客户端连接端口 (bind_port)
      - 7890:7890   # FRP管理面板端口 (dashboard_port)
      - 30000:30000 # 客户端服务映射端口范围
      - 30001:30001
      - 30002:30002
      - 30003:30003
      - 30004:30004
      - 30005:30005
    logging: # 日志配置
        driver: "json-file"
        options:
          max-size: "1m"

2. 创建 frps.ini 配置文件

在与 docker-compose.yaml 同级的目录下创建 frps.ini 文件。

[common]
bind_port = 9870
token     = ************

dashboard_addr = 0.0.0.0
dashboard_port = 7890
dashboard_user = mulyzhou
dashboard_pwd  = ************

3. 防火墙设置

确保您的服务器防火墙已放行以下端口:

  • 7890 (FRP管理面板)
  • 9870 (FRP客户端连接)
  • 30000-30005 (用于映射客户端服务的端口范围)

4. Nginx Proxy Manager (NPM) 配置 (用于 FRPS Dashboard)

为了通过域名访问 FRP 服务端的管理面板,您可以在 Nginx Proxy Manager (NPM) 中添加一个反向代理:

  • Domain Names (域名): frp.example.cn (替换为您自己的域名)
  • Scheme (协议): http
  • Forward Hostname / IP (转发主机名/IP): 172.17.0.1 (这是Docker默认桥接网络的网关IP,通常指向宿主机)
  • Forward Port (转发端口): 7890 (对应 frps.ini 中的 dashboard_port)

客户端配置 (FRPC)

在您需要穿透的内网设备(如NAS、树莓派、本地PC等)上,部署 FRP 客户端 (frpc)。

1. 创建 docker-compose.yaml

version: "3.7"

services:
  frpc:
    restart: unless-stopped # 除非手动停止,否则总是重启
    image: fatedier/frpc:v0.34.1 # 使用指定版本的frpc镜像
    volumes:
      - /etc/localtime:/etc/localtime:ro # 同步宿主机时间
      - /etc/timezone:/etc/timezone:ro   # 同步宿主机时区
      - ./frpc.ini:/app/frpc.ini:ro      # 挂载frpc配置文件
    logging: # 日志配置
      driver: "json-file"
      options:
        max-size: "1m"

2. 创建 frpc.ini 配置文件

在与 docker-compose.yaml 同级的目录下创建 frpc.ini 文件。

[common]
server_addr = 118.11.11.118
server_port = 9870
token       = ************

[synology-nas]
type        = tcp
remote_port = 30003
local_ip    = 192.168.50.8
local_port  = 5000
  • server_addr:填写您 FRP 服务端的公网 IP 地址。
  • server_port:填写 FRP 服务端的通信端口,需与 frps.ini 中的 bind_port 保持一致。
  • token:填写与服务端设置一致的认证令牌。
  • [synology-nas]:这是一个代理名称,您可以根据实际服务自定义,例如 [my-web-server]
  • type:代理类型,通常为 tcp
  • remote_port:服务端映射出来的端口,客户端通过此端口连接。请从服务端 docker-compose.yaml 中暴露的 30000-30005 端口范围中选择一个未被占用的端口。
  • local_ip:您要穿透的本地内网服务的局域网 IP 地址。
  • local_port:您要穿透的本地内网服务的端口。

3. Nginx Proxy Manager (NPM) 配置 (用于客户端服务)

为了通过域名访问您的内网服务(例如NAS),在 Nginx Proxy Manager (NPM) 中添加另一个反向代理:

  • Domain Names (域名): nas.example.cn (替换为您自己的域名)
  • Scheme (协议): http (或 https,取决于您的NAS服务是否支持HTTPS)
  • Forward Hostname / IP (转发主机名/IP): 172.17.0.1 (同样是Docker默认桥接网络的网关IP)
  • Forward Port (转发端口): 30003 (对应 frpc.ini 中为该服务设置的 remote_port)

总结

完成以上配置后,您就可以通过 nas.example.cn 域名从外网访问您的本地NAS服务了。此方法同样适用于其他需要内网穿透的 TCP 服务,只需在 frpc.ini 中添加新的代理配置,并在 NPM 中设置相应的域名反代即可。