Nginx Proxy Manager Streams 指南:使用 Nginx 流代理转发 TCP/UDP 流量

发布时间:2026/9/10 21:18:38
Nginx Proxy Manager Streams 指南:使用 Nginx 流代理转发 TCP/UDP 流量 Nginx Proxy Manager Streams 指南使用 Nginx 流代理转发 TCP/UDP 流量【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager导读Streams流是 Nginx Proxy ManagerNPM中用于转发 TCP/UDP 流量的核心功能它不关心 HTTP 层协议而是直接把四层网络连接原样转发到局域网内的另一台计算机。本文以 Nginx Proxy Manager 官方帮助文档中关于 Streams 的说明为骨架结合本仓库的源码、Nginx 配置模板与前端表单实现系统讲解 Stream 的定义、适用场景、Web 界面配置、底层 Nginx 配置生成原理、SSL 支持以及 API 操作方式帮助你真正掌握如何用 NPM 托管游戏服务器、FTP、SSH 等非 HTTP 服务。Stream 是什么What is a Stream? A relatively new feature for Nginx, a Stream will serve to forward TCP/UDP traffic directly to another computer on the network.Stream 是 Nginx 相对较新的一个特性对应 Nginx 的ngx_stream_core_module模块。与常规的 HTTP 反向代理Proxy Host不同Stream 工作在传输层四层它将进入 NPM 指定端口的 TCP/UDP 流量原样转发给网络中的另一台计算机而不解析、修改或缓存应用层内容。如果你在运行游戏服务器、FTP 或 SSH 服务器这一功能会非常实用——因为这些服务并不使用 HTTP 协议普通的域名反代如 80/443 端口无法处理它们而 Stream 可以场景为何需要 Stream游戏服务器如 Minecraft、CS使用自定义 TCP/UDP 端口通信无法走 HTTP 反代FTP 服务器21 端口非 HTTP 协议需要四层转发SSH 服务器22 端口需要直连转发不能经过 HTTP 层解包自定义 UDP 服务如 DNS、NTP、语音UDP 是面向数据报的协议只能四层转发核心配置参数在 NPM 中一个 Stream 对象由以下核心参数组成数据模型见 stream.js接口 Schema 见 stream-object.json参数类型取值范围说明incoming_portinteger1–65535监听端口NPM 收到该端口流量后转发forwarding_hoststring域名 / IPv4 / IPv6目标主机地址forwarding_portinteger1–65535目标主机端口tcp_forwardingbooleantrue/false是否启用 TCP 转发udp_forwardingbooleantrue/false是否启用 UDP 转发enabledbooleantrue/false是否启用该 Streamcertificate_idinteger0 或证书 ID关联的 SSL 证书0表示无证书见迁移 20240427161436_stream_ssl.jsowner_user_idinteger用户 ID创建该 Stream 的所有者其中forwarding_host在 stream-object.json 中支持三种形式域名、IPv4 地址、IPv6 地址。注意tcp_forwarding与udp_forwarding为布尔值但数据库中以整型存储模型在读写时通过convertBoolFieldsToInt/convertIntFieldsToBool自动转换见 stream.js。一个 Stream 可以同时监听 TCP 和 UDP从配置模板可以看出tcp_forwarding与udp_forwarding可以同时开启此时模板会生成两个独立的server块分别监听 TCP 和 UDP见 stream.conf。前端表单中也通过两个开关控制且保证至少开启其中一个见 StreamModal.tsx。如何创建一个 Stream在 NPM 管理界面中进入Streams页面点击Add Stream按钮对应前端页面 Streams/index.tsx 与表单 StreamModal.tsx。表单包含两个页签Details详情页签Incoming Port入站端口1–65535 的整数例如8080Forward Host转发主机目标服务器地址域名或 IP例如192.168.1.10Forward Port转发端口目标端口例如8081TCP / UDP 开关选择转发的协议类型。SSL 页签选择已有的 SSL 证书或新建证书allowNew对应 SSLCertificateField配置 SSL 选项对应 SSLOptionsFields。提示由于 Stream 不按域名路由后端在创建时会将domain_names字段从数据中移除见 stream.js 注释 streams arent routed by domain name so dont store domain names in the DB因此 Stream 不支持按域名区分流量。表单校验规则前端表单使用validateNumber(1, 65535)和validateString(1, 255)进行校验见 StreamModal.tsx端口必须落在 1–65535 之间转发主机为 1–255 个字符。后端 API 在 stream-object.json 中同样对端口与主机格式做了严格校验。底层 Nginx 配置生成原理当创建、更新或启用一个 Stream 时后端会调用internalNginx.configure(streamModel, stream, row)生成对应的 Nginx 配置文件见 stream.js最终渲染自模板 stream.conf。以 TCP 转发为例生成的 Nginx 配置结构如下# ------------------------------------------------------------ # 8080 TCP: 1 UDP: 0 # ------------------------------------------------------------ server { listen 8080 reuseport; listen [::]:8080 reuseport; # 若配置了 SSL 证书此处会 include 证书模板 proxy_pass 192.168.1.10:8081; access_log /data/logs/stream-1_access.log stream; error_log /data/logs/stream-1_error.log warn; # Custom include /data/nginx/custom/server_stream[.]conf; include /data/nginx/custom/server_stream_tcp[.]conf; }模板中值得注意的细节listen ... reuseportNginx 使用reuseport参数以支持多进程共享同一端口的高效负载均衡IPv6 支持模板根据ipv6变量决定是否启用listen [::]:port若未启用则整行被注释掉stream.conf协议独立监听TCP 与 UDP 分别生成独立的server块UDP 块使用listen ... udp reuseportstream.conf自定义扩展点TCP 和 UDP 分别支持server_stream_tcp[.]conf与server_stream_udp[.]conf自定义配置文件方便高级用户注入额外指令stream.conf独立日志每个 Stream 有独立的stream-{{ id }}_access.log与stream-{{ id }}_error.log便于排障。Stream 的 SSL 支持若为 Stream 关联了证书stream.conf 会在listen指令后追加ssl参数并通过 _certificates_stream.conf 引入证书配置# Lets Encrypt SSL include conf.d/include/ssl-cache-stream.conf; ssl_certificate /etc/letsencrypt/live/npm-1/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/npm-1/privkey.pem;Lets Encrypt 证书与自定义证书的路径分别位于/etc/letsencrypt/live/npm-{{ certificate_id }}/与/data/custom_ssl/npm-{{ certificate_id }}/。这得益于迁移 20240427161436_stream_ssl.js 为stream表新增了certificate_id字段。注意由于 Stream 不按域名路由新建证书时需要通过 DNS 验证等方式签发前端 SSL 表单中forceDNSForNew与requireDomainNames即为此设计。生命周期操作与 APIStream 的完整生命周期由 stream.js 实现对应 REST API 路由见 streams.jsHTTP 方法路径说明GET/api/nginx/streams列出所有 Stream支持expand、query搜索POST/api/nginx/streams创建 StreamGET/api/nginx/streams/{id}获取指定 StreamPUT/api/nginx/streams/{id}更新 StreamDELETE/api/nginx/streams/{id}删除 StreamPOST/api/nginx/streams/{id}/enable启用 StreamPOST/api/nginx/streams/{id}/disable禁用 Stream各操作的后端行为创建create校验权限streams:create见 streams-create.json、写入数据库移除 domain_names、可选新建证书、调用 Nginx 重新生成配置、写入审计日志更新update校验streams:update权限更新数据库后重新生成 Nginx 配置并清理证书 metacleanRowCertificateMeta启用enable将enabled置 1 并重新生成 Nginx 配置若已启用则抛出ValidationError(Stream is already enabled)禁用disable将enabled置 0删除 Nginx 配置文件并reloadNginx删除delete软删除is_deleted 1删除 Nginx 配置并 reload同时写入审计日志。权限说明streams:list与streams:get受permission_visibility约束非all可见性时仅能操作自己创建owner_user_id的 Stream见 stream.js。创建示例使用POST /api/nginx/streams{ incoming_port: 25565, forwarding_host: 192.168.1.20, forwarding_port: 25565, tcp_forwarding: true, udp_forwarding: false, enabled: true, certificate_id: 0 }创建时的端口冲突提示在 stream.js 与 stream.js 中可以看到// TODO: At this point the existing ports should have been checked注释说明端口占用检查尚未在创建/更新流程中完整实现配置重复入站端口时需自行留意。在 Streams 页面查看与运维Stream 列表页面Table.tsx展示以下列所有者头像、入站端口、目标地址forwardingHost:forwardingPort、协议标识TCP/UDP 徽章、SSL 证书、状态在线/离线以及编辑、启用/禁用、删除等操作。列表默认按入站端口升序排列对应后端orderBy(incoming_port, ASC)见 stream.js。小结Nginx Proxy Manager 的 Streams 功能将 Nginx 强大的四层流代理能力封装成了可视化的管理界面只需填写入站端口、目标主机与端口、选择 TCP/UDP 协议即可完成游戏服务器、FTP、SSH 等非 HTTP 服务的端口转发与 TLS 加密。通过本文对 stream.conf、stream.js 与 StreamModal.tsx 等源码的分析你可以清楚地了解每个配置项的作用、底层 Nginx 配置的生成方式以及 Stream 的完整生命周期管理从而在实际部署中高效使用这一功能。【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考