
Nginx Proxy Manager Stream 端口转发用 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-managerStream端口转发是 Nginx Proxy Manager 中面向非 HTTP 流量的一组核心功能它利用 Nginx 较新的 Stream 模块将 TCP/UDP 数据流直接转发到网络中的另一台计算机。本指南将以仓库中的 Streams 帮助文档为主线结合 后端实现、Nginx 配置模板 与 前端表单 源码完整讲解端口转发的概念、配置字段、操作步骤与底层生成原理帮助你为游戏服务器、FTP、SSH 等四层服务快速建立可视化转发入口。Stream 是什么为四层协议而生的转发通道Stream 是 Nginx 的一个相对较新的功能用于将TCP/UDP 数据流直接转发到网络上的另一台计算机。与 HTTP 反向代理按域名、路径进行路由不同Stream 工作在传输层L4它只关心“从哪个入站端口进来、转发到哪个目标地址与端口”不解析上层协议内容。这一点在源码中有直接体现backend/internal/stream.js 在创建 Stream 时有一段注释与逻辑// streams arent routed by domain name so dont store domain names in the DB const data_no_domains structuredClone(data); delete data_no_domains.domain_names;即Stream 不以域名路由因此数据库中不存储域名。这也是它与 Proxy Host、Redirection Host 最大的差异所在。典型适用场景原帮助文档明确指出如果你正在运行游戏服务器、FTP 或 SSH 服务器这个功能会非常有用。归纳起来包括游戏服务器Minecraft、CS、Valve 系等基于 TCP/UDP 自定义协议的服务端无法用 HTTP 反代暴露FTP / SFTP 服务器传统 21 端口或被动模式端口段需要按端口直通SSH 服务器将公网某端口映射到内网 SSH 服务实现远程管理其他任意 TCP/UDP 服务数据库直连、自定义二进制协议、VoIP 等。核心配置字段与取值范围通过 Stream 弹窗表单见 frontend/src/modals/StreamModal.tsx与数据模型backend/models/stream.js可以归纳出完整字段字段含义取值范围 / 说明incoming_port入站监听端口165535必填列表默认按此字段升序排列forwarding_host转发目标主机1255 字符必填可为 IP 或内网主机名forwarding_port转发目标端口165535必填tcp_forwarding是否启用 TCP 转发布尔值默认开启udp_forwarding是否启用 UDP 转发布尔值默认开启certificate_id关联 SSL 证书可选见下文“SSL 加密”一节enabled启用状态布尔值0/1meta扩展元数据JSON 对象用于存放附加配置如自定义 Nginx 指令ipv6是否监听 IPv6模板中以注释开关控制[::]:监听行前端对入站与目标端口均使用validateNumber(1, 65535)校验StreamModal.tsx并在输入框上设置min1 max65535。后端数据模型中tcp_forwarding、udp_forwarding、enabled、is_deleted被统一声明为布尔字段并做入库转换backend/models/stream.js。值得一提的是协议开关的联动逻辑在表单中取消勾选 TCP 时UDP 会被自动勾选反之亦然StreamModal.tsx确保TCP/UDP 至少启用其一避免创建出空转发的无意义条目。操作步骤从界面到 API界面操作登录 Nginx Proxy Manager 管理界面进入左侧Streams菜单点击Add Stream新建端口转发在 “Details” 页签填写入站端口、转发目标主机与转发端口勾选 TCP/UDP 协议开关在 “SSL” 页签可为 TCP 转发选择已有证书或新建证书SSLCertificateField允许allowNew见 StreamModal.tsx保存后后端会立即重新生成并校验 Nginx 配置随后重载 Nginx。创建成功后Streams 列表页会以卡片表格展示每条转发的入站端口、目标host:port、协议徽标TCP/UDP、SSL 状态与在线/离线状态frontend/src/pages/Nginx/Streams/Table.tsx并支持编辑、启停与删除操作。REST API 操作所有操作都有对应的 REST 接口路由定义在 backend/routes/nginx/streams.js方法路径作用GET/api/nginx/streams列出全部 Stream支持?expandcertificate,owner与?query搜索入站端口POST/api/nginx/streams新建 Stream成功返回 201GET/api/nginx/streams/{id}获取单个 StreamPUT/api/nginx/streams/{id}更新 StreamDELETE/api/nginx/streams/{id}删除 StreamPOST/api/nginx/streams/{id}/enable启用POST/api/nginx/streams/{id}/disable停用例如新建一条 TCP 转发curl -X POST https://npm-host/api/nginx/streams \ -H Authorization: Bearer token \ -H Content-Type: application/json \ -d { incoming_port: 2222, forwarding_host: 10.0.0.5, forwarding_port: 22, tcp_forwarding: true, udp_forwarding: false }调用需要具备streams:create等权限根据 backend/lib/access/streams-create.json管理员角色可直接创建普通用户则需具备permission_streams: manage权限。底层原理Nginx 配置模板如何生成保存 Stream 时后端调用internalNginx.configure(streamModel, stream, row)生成配置backend/internal/stream.js。最终写入 Nginx 的配置由模板 backend/templates/stream.conf 渲染核心逻辑如下# {{ incoming_port }} TCP: {{ tcp_forwarding }} UDP: {{ udp_forwarding }} {% if tcp_forwarding 1 or tcp_forwarding true -%} 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; } {% endif %} {% if udp_forwarding 1 or udp_forwarding true -%} 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; } {% endif %}几个值得注意的实现细节TCP 与 UDP 是两段独立的server块勾选哪个协议就渲染哪一段二者可同时启用reuseport指令让内核在多个 worker 之间负载均衡同一端口的连接/数据报是高并发四层转发的基础IPv6 开关模板通过{% unless ipv6 -%} # {%- endunless -%}决定是否注释掉[::]:监听行独立日志每个 Stream 拥有独立的stream-{{ id }}_access.log与stream-{{ id }}_error.log便于排查自定义扩展点支持在/data/nginx/custom/下放置server_stream.conf、server_stream_tcp.conf、server_stream_udp.conf注入额外指令。SSL 加密若为 Stream 关联了证书模板会 include _certificates_stream.conf根据证书来源渲染不同的证书路径Lets Encrypt 证书ssl_certificate /etc/letsencrypt/live/npm-{{ certificate_id }}/fullchain.pem自定义证书ssl_certificate /data/custom_ssl/npm-{{ certificate_id }}/fullchain.pem。同时TCP 转发块中的listen会追加ssl关键字从而实现 TCP 层的 TLS 终结。注意 SSL 仅对 TCP 转发生效_certificates_stream.conf只被 TCP 块引用UDP 块不渲染证书相关指令。生命周期管理启用、停用与删除每条 Stream 都支持完整的生命周期操作实现在 backend/internal/stream.js创建create写入数据库 → 若选择“新建证书”则通过createQuickCertificate快速签发 → 重新获取关联数据 → 生成 Nginx 配置 → 写入审计日志更新update校验 ID 一致性 → 更新数据库 → 重新生成配置并返回最新的meta含 Nginx 校验输出启用enable若已启用则抛出Stream is already enabled置enabled1后重新生成配置无需 reload因为只是恢复已存在的配置停用disable置enabled0后删除 Nginx 配置并执行internalNginx.reload()删除delete软删除is_deleted1删除配置文件并 reload最后写入审计日志。所有的创建、更新、启停、删除操作都会写入审计日志object_type: stream与项目整体的审计体系保持一致数据库模型通过软删除字段is_deleted过滤已删除条目backend/models/stream.js并在列表接口中按incoming_port升序排列。注意事项与最佳实践端口冲突入站端口不能与 Nginx 自身监听的 HTTP/HTTPS 端口默认 80/81/443或其他已占用端口冲突源码中create与update均留有 TODO 注释提示应做端口占用检查backend/internal/stream.js因此在创建前请自行确认端口空闲TCP/UDP 至少一个表单已强制保证至少启用一种协议转发目标可达性forwarding_host可以是内网 IP、主机名务必保证 Nginx 容器网络能直达该地址协议选择对基于 UDP 的语音、游戏同步数据如部分联机游戏务必勾选 UDP仅开 TCP 会导致数据丢失自定义配置高级用户可通过/data/nginx/custom/下的三个server_stream*.conf文件注入proxy_timeout、proxy_buffer_size等 Stream 模块指令实现超时控制、缓冲调优。小结Stream 是 Nginx Proxy Manager 面向非 HTTP 流量的可视化转发方案它把 Nginx Stream 模块的listen/proxy_pass配置封装为“入站端口 → 转发目标”的简洁模型支持 TCP/UDP 双协议、SSL 终结、IPv6、独立日志与自定义指令注入。无论是游戏服务器、FTP 还是 SSH都可以通过 StreamModal 表单或 Streams API 在几分钟内完成配置并由 stream.conf 模板 自动渲染出可运行的 Nginx 四层转发配置。【免费下载链接】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),仅供参考