2026 年 Nginx Proxy Manager(NPM)IPv6 配置

记录 Nginx Proxy Manager 的 Docker Compose 部署方式:提前创建 matrix 外部网络,并同时监听 IPv4 与 IPv6 HTTPS 端口。

这篇记录一个支持 IPv6 访问的 Nginx Proxy Manager(NPM)部署配置。核心思路很简单:需要被 HTTP/HTTPS 反代的容器统一接入同一个外部 Docker 网络 matrix,NPM 再通过多个宿主机端口把请求转发到容器内部的 443

这种方式适合把 Synapse、JWT、LiveKit 等服务放在同一个 Docker 网络里,让 NPM 作为统一入口处理 HTTPS 代理。

注意,coturn 这类 TURN 服务不建议按普通 Web 服务接入 NPM。coturn 需要直接处理 3478/udp 和大范围 UDP 中继端口,更适合单独使用 network_mode: host,不要接入 matrix 网络,也不要交给 NPM 反代。

一、先创建 matrix 网络

在启动需要接入 matrix 的容器之前,先在宿主机终端手动创建一个供容器之间通信的 Docker 网桥:

docker network create matrix

这个网络只需要创建一次。后续 NPM、Synapse、JWT、LiveKit 等需要互相访问的容器,都统一接入 matrix

可以用下面的命令确认网络是否已经存在:

docker network ls | grep matrix

如果已经能看到 matrix,就可以继续写 Compose 配置。

二、创建 docker-compose.yml

新建并编辑 docker-compose.yml

nvim docker-compose.yml

写入下面的配置:

services:
  app:
    image: 'docker.io/jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      # HTTP 端口
      - '12332:80'

      # 管理后台
      - '81:81'

      # HTTPS 端口:在 Docker 层面做非对称映射
      # 12335 -> 443,Synapse 适用
      - '0.0.0.0:12335:443'
      - '[::]:12335:443'

      # 12336 -> 443,JWT 适用
      - '0.0.0.0:12336:443'
      - '[::]:12336:443'

      # 12337 -> 443,LiveKit 适用
      - '0.0.0.0:12337:443'
      - '[::]:12337:443'

      # coturn 不写在这里。
      # TURN 不是普通 HTTP/HTTPS 服务,不建议通过 NPM 转发。
      # coturn 请单独使用 network_mode: host,直接监听宿主机端口。
      # 下面这些 coturn 端口应在宿主机防火墙/云安全组/路由器里放行,
      # 不要添加到 NPM 的 ports 里:
      # - 3478/tcp
      # - 3478/udp
      # - 5349/tcp
      # - 64000-64099/udp
      # 如果公网入口在 RouterOS 软路由上,
      # 就在 RouterOS 上把这些端口转发到 Docker 主机 10.20.20.8。
      # IPv6 不做 dstnat,需要在 /ipv6 firewall filter 的 forward 链
      # 放行转发到 coturn 的这些端口。为兼容内网访问公网域名,
      # 可以不加 in-interface-list=WAN。

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - matrix

networks:
  matrix:
    external: true
    name: matrix

这里有三个重点:

  • matrix 使用的是外部网络,所以 Compose 不会自动创建它,必须提前执行 docker network create matrix
  • HTTPS 端口同时写了 0.0.0.0[::],分别用于 IPv4 和 IPv6 监听。
  • coturn 不属于 NPM 反代配置的一部分,不要在 NPM 的 ports 里添加 3478534964000-64099/udp

三、启动 NPM

确认配置无误后启动:

docker compose up -d

查看容器状态:

docker ps | grep nginx-proxy-manager

查看日志:

docker logs -f nginx-proxy-manager

管理后台访问地址:

http://服务器IP:81

首次登录后,进入 NPM 后台添加 Proxy Host,并把目标服务地址指向同一个 matrix 网络里的容器名和端口。

四、端口对应关系

这份配置中的端口用途如下:

宿主机端口容器端口用途
1233280HTTP 入口
8181NPM 管理后台
12335443Synapse HTTPS 入口
12336443JWT HTTPS 入口
12337443LiveKit HTTPS 入口

如果服务器防火墙、云安全组或路由器里有限制,需要同步放行这些端口的 IPv4 和 IPv6 入站访问。

五、注意事项

所有需要被 NPM 反代的 HTTP/HTTPS 容器,网络都统一接入 matrix。例如其他服务的 Compose 文件里也应使用类似配置:

networks:
  matrix:
    external: true
    name: matrix

服务本身再挂到这个网络:

services:
  your-service:
    networks:
      - matrix

这样 NPM 后台里就可以直接用容器名作为上游地址,避免跨网络访问失败。

coturn 是例外。它不要写成 ports 大范围映射,也不要挂到 matrix 网络里。单独部署 coturn 时,Compose 里直接写成下面这样:

services:
  coturn:
    image: coturn/coturn:latest
    container_name: coturn
    restart: unless-stopped
    # 这里不要再写 ports,也不要把 coturn 接入 matrix 网络。
    # network_mode: host 会让 coturn 直接使用宿主机网络栈。
    # 容器内监听的 3478、5349 和 64000-64099/udp 就是宿主机上的端口。
    # 需要在宿主机防火墙/云安全组/路由器里放行:
    # - 3478/tcp
    # - 3478/udp
    # - 5349/tcp
    # - 64000-64099/udp
    # 如果公网入口在 RouterOS 软路由上,
    # 就在 RouterOS 上把这些端口转发到 Docker 主机 10.20.20.8。
    # IPv6 不做 dstnat,需要在 /ipv6 firewall filter 的 forward 链
    # 放行转发到 coturn 的这些端口。为兼容内网访问公网域名,
    # 可以不加 in-interface-list=WAN。
    network_mode: host
    volumes:
      - /root/data/docker_data/coturn/etc/coturn/turnserver.conf:/etc/coturn/turnserver.conf
      - /root/data/docker_data/coturn/etc/:/etc/
      - /root/data/docker_data/coturn/var/run/turnserver.pid:/var/run/turnserver.pid

也就是说,NPM 继续处理 Synapse、ntfy、LiveKit 这类 Web 服务;coturn 的 DNS 直接指向宿主机公网 IP,服务器防火墙直接放行 3478/tcp3478/udp5349/tcp64000-64099/udp