资讯动态

nginx-proxy-manager Streams 指南:用 TCP/UDP 端口转发打通游戏、FTP 与 SSH 服务

发布时间:2026/9/10 10:31:24 来源:尧图企业网站定制
nginx-proxy-manager Streams 指南用 TCP/UDP 端口转发打通游戏、FTP 与 SSH 服务【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-managerStreams数据流是 nginx-proxy-manager 中面向TCP/UDP 四层流量的端口转发能力它不像 Proxy Hosts 那样按域名路由 HTTP 流量而是把指定监听端口上的原始 TCP/UDP 流量直接转发给网络中的另一台主机。本文以帮助文档的 Streams 主题为骨架结合仓库中的 stream.conf、stream.js 与 StreamModal.tsx 等源码完整讲解 Streams 的适用场景、创建参数、界面操作、底层 Nginx 配置生成原理与 API 调用方式读完后你可以直接在面板中为自己的游戏服务器、FTP、SSH 等服务建立 TCP/UDP 转发并理解其工作原理。Streams 是什么面向四层流量的端口转发在 nginx-proxy-manager 的帮助文档中Streams 被定义为 Nginx 的一项相对较新的能力用于将 TCP/UDP 流量直接转发到网络中的另一台计算机。它与本项目中其它主机类型Proxy Hosts、Redirection Hosts、Dead Hosts的核心区别在于后者工作在 HTTP 应用层、依赖域名与 Host 头进行路由而 Streams 工作在传输层只关心“端口到端口”的转发。对应到 Nginx 本身这对应的是stream {}模块非http {}模块因此 Streams 不会生成虚拟主机式的server_name配置也没有域名概念——这一点在源码中有直接印证backend/internal/stream.js 在创建流时会显式注释 streams arent routed by domain name so dont store domain names in the DB并删除domain_names字段后再入库。典型适用场景帮助文档明确指出以下场景最受益于 Streams游戏服务器Minecraft、Valheim、CS 等游戏服务端多使用自定义 TCP/UDP 端口域名路由完全派不上用场FTP 服务器FTP 依赖 20/21 端口建立控制与数据连接需要纯端口级转发SSH 服务器22 端口或自定义端口的远程登录流量需要原样透传。概括来说凡是“无法用域名区分、只能按端口区分”的四层服务都可以用 Streams 来接入 nginx-proxy-manager 统一管理。需要说明的是帮助文档原文只给出这三类例子本文不延伸其它未经证实的用例。在界面中创建 Stream表单字段与校验规则Streams 的创建入口在 Web 面板左侧导航的Streams页面点击右上角新增按钮后弹出 StreamModal.tsx 所实现的编辑窗口。该弹窗包含两个标签页Details详情与SSL。Details 标签页核心转发参数弹窗表单的核心字段及其约束如下校验规则直接来自前端代码字段说明校验与示例Incoming Port监听端口Nginx 对外监听的端口165535必填占位示例eg: 8080StreamModal.tsxForward Host转发主机流量要转发到的目标主机必填1255 字符StreamModal.tsxForward Port转发端口目标主机上提供服务的内网端口165535必填占位示例eg: 8081StreamModal.tsxTCP Forwarding是否启用 TCP 转发复选框与 UDP 至少勾选一个UDP Forwarding是否启用 UDP 转发复选框与 TCP 至少勾选一个表单在协议选择上做了防呆处理当用户取消勾选 TCP 时代码会强制把 UDP 置为true反之取消 UDP 时强制启用 TCPStreamModal.tsx。也就是说TCP 与 UDP 至少保留其一保证每个 Stream 至少监听一种协议。后端对字段的约束与前端保持一致stream-object.json 规定incoming_port与forwarding_port均为 165535 的整数forwarding_host支持域名、IPv4、IPv6 三种写法tcp_forwarding与udp_forwarding为布尔值创建接口的请求体会被 routes/nginx/streams.js 交给 API 校验器做严格校验后再入库。SSL 标签页为 TCP 流加 TLS对于需要加密的 TCP 服务例如 443 端口的自定义 TLS 应用可以在SSL标签页中为该 Stream 绑定证书。StreamModal.tsx 中 SSL 页签包含SSL Certificate选择已有证书或直接新建allowNew且forHttp{false}SSL OptionsTLS 相关选项forceDNSForNew表示新建证书时强制走 DNS 校验。一旦绑定了证书生成的 Nginx 配置会在listen指令上追加ssl标志并引入 backend/templates/_certificates_stream.conf 加载证书文件Lets Encrypt 证书读取/etc/letsencrypt/live/npm-{certificate_id}/fullchain.pem与privkey.pem自定义证书则读取/data/custom_ssl/npm-{certificate_id}/下的同名文件。同时会包含 ssl-cache-stream.conf 与ssl-ciphers.conf以启用会话缓存与加密套件配置。底层实现一个 Stream 生成什么 Nginx 配置了解界面之后最有价值的是搞清楚 Stream 最终落地为怎样的 Nginx 配置。核心模板为 backend/templates/stream.conf它根据tcp_forwarding与udp_forwarding两个开关分别生成独立的server块。TCP 转发块server { listen {{ incoming_port }} reuseport {%- if certificate %} ssl {%- endif %}; {% unless ipv6 -%} # {%- endunless -%} listen [::]:{{ incoming_port }} reuseport {%- if certificate %} ssl {%- endif %}; {%- include _certificates_stream.conf %} proxy_pass {{ forwarding_host }}:{{ forwarding_port }}; access_log /data/logs/stream-{{ id }}_access.log stream; error_log /data/logs/stream-{{ id }}_error.log warn; # Custom include /data/nginx/custom/server_stream[.]conf; include /data/nginx/custom/server_stream_tcp[.]conf; }要点拆解listen ... reuseport启用端口重用多个 worker 可共享同一监听套接字提升并发吞吐listen [::]:portIPv6 监听模板中通过{% unless ipv6 %}#{% endunless %}决定是否注释掉这一行即默认生成 IPv4IPv6 双栈监听关闭 IPv6 时该行被注释proxy_pass host:port这是整个转发的核心直接完成四层流量透传访问日志与错误日志分别写入/data/logs/stream-{id}_access.logstream日志格式与error.log自定义扩展点允许在/data/nginx/custom/目录下放置server_stream.conf与server_stream_tcp.conf追加指令实现不加改模板的个性化配置。UDP 转发块server { listen {{ incoming_port }} udp reuseport; {% unless ipv6 -%} # {%- endunless -%} listen [::]:{{ incoming_port }} udp reuseport; proxy_pass {{ forwarding_host }}:{{ forwarding_port }}; access_log /data/logs/stream-{{ id }}_access.log stream; error_log /data/logs/stream-{{ id }}_error.log warn; # Custom include /data/nginx/custom/server_stream[.]conf; include /data/nginx/custom/server_stream_udp[.]conf; }与 TCP 块相比差别仅在listen指令上增加udp关键字自定义扩展文件则变为server_stream_udp.conf。当 TCP 与 UDP 同时启用时模板会输出两个server块共享同一监听端口、指向同一转发目标。启用/停用时的配置生命周期Stream 的生命周期动作同样值得关注它们都集中在 backend/internal/stream.js创建create先写库再调用internalNginx.configure(streamModel, stream, row)基于模板生成配置文件如果certificate_id传了new会先通过internalCertificate.createQuickCertificate快速签发证书再回填stream.js更新update校验 ID 一致后patchAndFetchById更新记录随后重新configure重新生成配置stream.js删除delete软删除is_deleted: 1删除 Nginx 配置并internalNginx.reload()重载stream.js启用/停用enable/disableenable 时置enabled 1并重新生成配置disable 时置enabled 0删除配置并 reloadstream.js。值得注意的细节每次变更都会写入审计日志internalAuditLog.addaction 分别为created、updated、deleted、enabled、disabled对象类型统一为stream这与 Audit Log 页面 的事件展示是对应的。数据模型与 APIStream 的持久化与 REST 接口数据库模型Stream 对应的 ORM 模型为 backend/models/stream.js表名stream布尔字段包括is_deleted、enabled、tcp_forwarding、udp_forwarding入库转 0/1出库转布尔。模型与Userowner和Certificatecertificate建立了HasOneRelation关联列表默认按incoming_port升序排列。REST API 一览路由实现在 backend/routes/nginx/streams.js全部接口需要 JWT 认证方法与路径功能GET /api/nginx/streams列出全部 Stream支持expand与query按端口模糊搜索POST /api/nginx/streams创建 Stream返回 201GET /api/nginx/streams/{id}获取单个 Stream支持expandcertificate,ownerPUT /api/nginx/streams/{id}更新 StreamDELETE /api/nginx/streams/{id}删除 StreamPOST /api/nginx/streams/{id}/enable启用 StreamPOST /api/nginx/streams/{id}/disable停用 Stream接口的入参与返回结构以 stream-object.json 为准创建/更新时也会经过 API 校验器校验后再执行保证端口、主机、协议字段的合法性。权限控制所有操作在执行前都会调用access.can(streams:create)、access.can(streams:update)等权限检查在getAll与get中若当前用户的可视范围不是all查询会自动追加owner_user_id 当前用户条件实现按所有者隔离stream.js。前端表格中“启用/停用”与“删除”按钮也被 HasPermission 包裹需要STREAMS MANAGE权限Table.tsx。前端展示Streams 列表页Streams 列表页由 frontend/src/pages/Nginx/Streams/Table.tsx 渲染每行展示以下列所有者Gravatar 头像 用户名Incoming Port监听端口带创建时间提示Destination以forwardingHost:forwardingPort形式展示转发目标Protocol以徽章显示TCP/UDPSSL展示绑定的证书Statusonline/offline 状态。行内下拉菜单提供编辑、启用/停用、删除操作其中启用/停用与删除需要STREAMS的MANAGE权限。列表数据由 useStreams.ts 通过GET /api/nginx/streams拉取。实操建议与注意事项综合文档与源码使用 Streams 时有几点值得注意端口冲突需要自行规避前端只校验 165535 的范围后端源码中创建与更新处的端口冲突检查仍标记为 TODOstream.js、stream.js因此在分配监听端口时应主动避开已在使用的端口包括宿主机上其它服务占用的端口。TCP 与 UDP 至少启用一种界面层会强制保证二者其一为真避免生成空配置。IPv6 默认开启若目标环境不支持 IPv6可在对应选项关闭模板会自动注释掉 IPv6 监听行。高级自定义可在/data/nginx/custom/放置server_stream.conf、server_stream_tcp.conf、server_stream_udp.conf追加 Nginx 指令无需修改仓库模板。配置即时生效创建、更新、启停操作都会触发配置重新生成或删除并 reload操作后无需手动重启 Nginx。总结Streams 是 nginx-proxy-manager 中处理“非 HTTP、按端口路由”流量的核心能力通过面板中简洁的表单即可为游戏服务器、FTP、SSH 等 TCP/UDP 服务建立四层端口转发并可选绑定 TLS 证书与启用 IPv6。其底层由 stream.conf 模板驱动 Nginxstream模块生成配置生命周期由 backend/internal/stream.js 统一管理配合 REST API、审计日志与权限体系让四层流量纳管与 HTTP 虚拟主机一样简单可靠。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价