
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 中相对较新的一项功能它借助 Nginx 的 stream 模块把进入指定端口的 TCP/UDP 数据流原样转发到网络中另一台主机让非 HTTP 协议的服务也能统一纳入可视化代理管理。读完本文你将掌握 Stream 的适用场景与局限、Web 界面中的完整配置方法、每个字段的取值约束以及它在后端如何生成 Nginx 配置、通过 REST API 完成增删改查的底层实现原理并了解仓库中用于验证 TCP、UDP、TCPUDP 与 SSL 终止四条链路的自动化测试证据。本文以 前端帮助文档 cs/Streams.md 为主体骨架展开并结合 backend/internal/stream.js、backend/templates/stream.conf、frontend/src/modals/StreamModal.tsx 等源码进行纵深讲解。什么是 Stream按官方帮助文档的定义Stream 是 Nginx 相对较新的一项功能用于把 TCP/UDP 数据流直接转发到网络中另一台计算机。与 nginx-proxy-manager 中其他Host如 Proxy Host不同Stream不做 HTTP 协议解析、也不按域名路由。它工作在传输层第四层只关心哪个端口进来、转发到哪台机器的哪个端口。在 backend/internal/stream.js 的创建逻辑中可以看到一段关键注释// 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 的核心定位不以域名路由因此域名数据根本不会写入数据库。适用场景游戏、FTP 与 SSH 服务器帮助文档明确指出了 Stream 最典型的三种使用场景游戏服务器多数游戏使用自定义 TCP/UDP 端口通信如 Minecraft 的 25565、CS 系游戏的 27015 等协议并非 HTTP普通反向代理无法处理FTP 服务器FTP 控制连接21 端口与数据连接都是原始 TCP 流需要四层透传SSH 服务器SSH22 端口是二进制协议同样需要原样转发。凡是非 HTTP/HTTPS 的 TCP 或 UDP 服务都可以用 Stream 统一入口、集中管理。它的本质是 Nginx 的stream {}模块能力由 nginx-proxy-manager 在前端表单与配置模板中做了封装让用户无需手写 Nginx 配置即可完成端口级转发。Stream 与 Proxy Host 的区别理解两者差异有助于判断何时该用哪种Host对比维度StreamProxy Host工作层次四层TCP/UDP透传原始数据流七层HTTP/HTTPS解析应用协议路由依据端口incoming_port域名domain_names适用协议游戏、FTP、SSH、RDP 等任意 TCP/UDPHTTP、WebSocket 等 Web 服务是否支持 SSL 终止支持TCP 场景支持是否支持访问控制/路径转发不支持支持从数据库模型 backend/models/stream.js 看stream 表的核心字段包括incoming_port、forwarding_host、forwarding_port、tcp_forwarding、udp_forwarding、enabled、certificate_id、meta完全没有域名列进一步佐证了按端口路由的设计。Stream 配置字段详解创建 Stream 时Web 表单StreamModal.tsx与后端校验 stream-object.json 共同定义了以下字段字段类型取值范围说明incoming_port整数165535监听入口端口示例 9090forwarding_host字符串域名 / IPv4 / IPv6目标主机地址示例example.comforwarding_port整数165535目标端口示例 80tcp_forwarding布尔true / false是否启用 TCP 转发udp_forwarding布尔true / false是否启用 UDP 转发enabled布尔true / false是否启用该 Streamcertificate_id整数证书 ID 或 0用于 TCP 的 SSL 终止可选meta对象任意 JSON附加元数据默认{}owner_user_id整数用户 ID归属用户由后端自动写入其中tcp_forwarding、udp_forwarding、enabled、is_deleted是布尔字段在模型层通过convertBoolFieldsToInt/convertIntFieldsToBool在数据库0/1与 APItrue/false之间转换见 stream.js 模型。关于协议开关的交互细节前端表单保证 TCP/UDP 至少启用其一——当你关闭 TCP 开关时UDP 会被自动置为开启反之亦然见 StreamModal.tsx 的onChange逻辑。这是因为一个 Stream 至少要转发一种协议才有意义。通过 Web 界面创建 Stream 的步骤在 nginx-proxy-manager 管理界面中进入Streams页面该页面受STREAMS权限节控制见 pages/Nginx/Streams/index.tsx点击新增即可打开表单包含两个标签页Details详情标签页需要填写Incoming Port入口端口对外监听端口范围 165535例如8080Forward Host转发主机目标机器的主机名或 IP例如内网服务器地址192.168.1.10长度 1255 字符Forward Port转发端口目标端口范围 165535Protocols协议TCP / UDP 两个开关至少开启一个。SSL 标签页可选配置SSL CertificateSSL 证书下拉选择已有证书或现场新建allowNewSSL 选项包括 HTTP/2、HSTS 等针对 TCP 流场景的 TLS 选项forHttp{false}表明这是为四层流量而非 HTTP 场景准备。保存后前端通过useSetStream调用后端 API 完成创建或更新见 StreamModal.tsx成功后会弹出提示并关闭弹窗。底层原理生成的 Nginx 配置长什么样Stream 的配置由模板 backend/templates/stream.conf 渲染生成。当enabled为真时按协议开关分别生成两个独立的server块# 入站端口 TCP: 1 UDP: 1 server { listen {{ incoming_port }} reuseport {%- if certificate %} ssl {%- endif %}; # listen [::]:{{ incoming_port }} reuseport ssl; # 启用 IPv6 时取消注释 # SSL 相关配置_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; }UDP 块结构类似但listen指令带有udp关键字server { listen {{ incoming_port }} udp reuseport; proxy_pass {{ forwarding_host }}:{{ forwarding_port }}; }几个值得注意的实现细节reuseport允许同一端口上的多个 worker 进程共享监听 socket提升并发接入能力IPv6模板默认注释掉[::]监听仅当ipv6参数启用时才会写入 IPv6 地址可扩展性模板预留了/data/nginx/custom/server_stream[.]conf、server_stream_tcp[.]conf、server_stream_udp[.]conf三个自定义 include 点高级用户可以注入额外的 Nginx 指令日志分离每个 Stream 独立记录stream-{id}_access.log与stream-{id}_error.log便于问题排查。当为 TCP Stream 配置了证书后backend/templates/_certificates_stream.conf 会被引入根据证书类型写入证书路径Lets Encrypt 证书引用/etc/letsencrypt/live/npm-{{ certificate_id }}/fullchain.pem与privkey.pem并 includessl-cache-stream.conf与ssl-ciphers.conf自定义证书引用/data/custom_ssl/npm-{{ certificate_id }}/下的 fullchain 与 privkey。这意味着TCP Stream 支持 TLS 终止SSL 终结在 Nginx 上与后端之间仍是明文或自选协议UDP Stream 不支持 SSL。后端实现创建、更新、启停与审计backend/internal/stream.js 是 Stream 的后端业务核心围绕数据表操作与 Nginx 配置同步实现了完整生命周期create先做streams:create权限校验剥离域名数据后insertAndFetch入库若certificate_id new会先走internalCertificate.createQuickCertificate快速签发证书再回填随后调用internalNginx.configure(streamModel, stream, row)重新生成 Nginx 配置最后写入审计日志action 为createdupdatestreams:update权限校验 → 查回原记录做 ID 一致性兜底 → 更新数据库 → 重新 configure 并刷新meta→ 审计日志updateddelete软删除is_deleted: 1随后internalNginx.deleteConfig(stream, row)删除配置并reload()重载 Nginx审计日志记录deletedenable / disable更新enabled标志启用时重新生成配置停用时删除配置并重载 Nginx分别记录enabled/disabled审计动作getAll按incoming_port升序返回全部未删除 Stream支持expand如owner、certificate与按端口模糊搜索。值得留意的两点软删除设计is_deleted标志而非物理删除所有查询get / getAll / getCount都带where(is_deleted, 0)过滤端口冲突预检的 TODOcreate 与 update 流程中都有 existing ports should have been checked 的 TODO 注释说明业务层显式端口占用预检仍留待完善实际冲突会在配置写入与 Nginx 重载环节暴露。REST API 一览路由定义在 backend/routes/nginx/streams.js全部接口需要 JWT 鉴权方法路径说明GET/api/nginx/streams列出所有 Stream支持expand、query参数POST/api/nginx/streams新建 Stream返回 201GET/api/nginx/streams/:stream_id获取单个 StreamPUT/api/nginx/streams/:stream_id更新 StreamDELETE/api/nginx/streams/:stream_id删除 StreamPOST/api/nginx/streams/:host_id/enable启用 StreamPOST/api/nginx/streams/:host_id/disable停用 Stream以创建一个 TCP Stream 为例等价于发送如下请求字段与 Streams.cy.js 测试中的 payload 一致{ incoming_port: 1500, forwarding_host: 127.0.0.1, forwarding_port: 80, certificate_id: 0, meta: {}, tcp_forwarding: true, udp_forwarding: false }自动化测试如何验证 Stream 可用性仓库在 test/cypress/e2e/api/Streams.cy.js 中为 Stream 提供了完整的端到端验证是理解功能行为的直接证据TCP Stream端口 1500创建后执行curl --noproxy -- http://website1.example.com:1500断言返回默认站点内容yay it works证明 TCP 转发链路真实可用UDP Stream端口 1501创建tcp_forwarding: false, udp_forwarding: true的组合并断言响应字段TCPUDP 双协议端口 1502两个开关同时为 true随后同样用 curl 验证 TCP 通路SSL TCP Stream端口 1503先上传自定义证书provider: other/upload接口再创建绑定该证书的 Stream最后调用testssl.sh对website1.example.com:1503做 TLS 安全检查验证 SSL 终止配置正确。这些测试同时也验证了 API 响应符合 Swagger SchemavalidateSwaggerSchema即前后端契约一致。使用注意事项结合源码与测试使用 Stream 时建议留意每个端口对应一个 Stream由于按端口监听同一入口端口不能被多个 Stream 复用测试中 15001503 各自独立端口范围受限于 165535且监听端口不能与容器内其他服务冲突UDP 不支持 SSL只有 TCP 块支持证书终止Stream 不做协议级处理没有重写、路径转发、访问列表等七层能力如需这些功能应改用 Proxy Host高级定制可在/data/nginx/custom/下放置server_stream.conf、server_stream_tcp.conf、server_stream_udp.conf注入自定义 Nginx 指令模板会自动 include。综上Stream 是 nginx-proxy-manager 面向四层流量场景的关键能力。无论是把游戏服、FTP、SSH 暴露到公网还是为内网非 HTTP 服务统一入口它都能以可视化表单 自动生成 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),仅供参考