十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nginx Proxy Manager Stream 完全指南:用 TCP/UDP 四层转发托管游戏、FTP 与 SSH 服务器

Nginx Proxy Manager Stream 完全指南:用 TCP/UDP 四层转发托管游戏、FTP 与 SSH 服务器 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-manager导读本篇技术指南围绕 Nginx Proxy ManagerNPM中的StreamTCP/UDP 端口转发功能展开。它面向需要把非 HTTP 流量游戏服务器、FTP、SSH、数据库等安全暴露到公网的运维与开发场景讲解 Stream 的核心概念、管理界面操作、字段含义并从源码与 Nginx 模板层面剖析其底层工作原理。读完本文你将掌握在 NPM 中创建、配置、启停 Stream理解 TCP/UDP 双协议转发的行为差异并学会通过 REST API 自动化管理流式转发规则。Stream 是什么根据项目自带的帮助文档docsStream 是 Nginx 一个相对较新的功能用于把 TCP/UDP 流量直接转发到网络中的另一台计算机越南语版原文Stream là một tính năng tương đối mới của Nginx, dùng để chuyển tiếp lưu lượng TCP/UDP trực tiếp tới một máy khác trong mạng.与基于域名路由的 Proxy Host七层 HTTP 代理不同Stream 工作在四层传输层它不解析 HTTP 报文而是把到达指定端口的原始 TCP/UDP 数据流原样转发给内网目标主机。正因为如此它不依赖域名而是以端口为路由维度——在 backend/internal/stream.js 的源码注释中明确写着streams arent routed by domain name so dont store domain names in the DBStream 不按域名路由因此不在数据库中存储域名。适用场景什么时候该用 Stream帮助文档给出了最典型的三个使用场景游戏服务器许多游戏如 Minecraft、CS 系列、各类私服使用自定义 TCP/UDP 端口协议通信无法用 HTTP 反代承载FTP 服务器FTP 控制连接与数据连接走独立端口需要原样透传SSH 服务器需要把 22 端口转发到内网机器直接暴露或做端口跳板。从仓库实现看Stream 同样适用于任意基于 TCP/UDP 的自有协议服务数据库、消息队列、RDP 远程桌面等。关键判断标准是只要流量不是 HTTP/HTTPS就应当优先考虑 Stream 而非 Proxy Host。在管理界面中创建 Stream在 NPM 前端导航进入Streams页面点击添加即可打开 Stream 编辑弹窗frontend/src/modals/StreamModal.tsx。该弹窗分为Details详情与SSL两个选项卡。Details 选项卡核心转发参数字段含义取值范围/约束说明Incoming Port入站端口NPM 容器对外监听的端口165535必填即公网客户端连接的端口如8080Forward Host转发主机内网目标主机域名、IPv4 或 IPv61255 字符必填如192.168.1.10或内网主机名Forward Port转发端口内网目标端口165535必填目标服务实际监听的端口如8081TCP Forwarding是否启用 TCP 转发布尔开关至少启用 TCP 或 UDP 之一UDP Forwarding是否启用 UDP 转发布尔开关与 TCP 可同时开启同一端口双协议监听前端通过validateNumber(1, 65535)与validateString(1, 255)frontend/src/modules/Validations.tsx做表单校验后端 OpenAPI 模式backend/schema/components/stream-object.json同样约束incoming_port、forwarding_port最小为 1、最大为 65535forwarding_host支持域名、IPv4 与 IPv6 三种格式双端校验保持一致。一个值得注意的交互细节TCP 与 UDP 开关不能同时关闭。在 StreamModal.tsx 中当用户关闭 TCP 时会自动勾选 UDP反之亦然保证至少保留一种协议的转发能力。SSL 选项卡为 TCP 转发加 TLSSSL 选项卡包含两个部分SSLCertificateField 与 SSLOptionsFieldsSSL Certificate选择已有证书或勾选allowNew后选择新建certificate_id new由系统自动签发SSL 选项forHttp{false}表明此处的 SSL 选项面向非 HTTP 场景且forceDNSForNew与requireDomainNames意味着新建证书时必须提供域名并通过 DNS 校验。SSL 证书只作用于TCP 转发——Nginx 的stream模块在 TCP 连接上做 TLS 终结后将解密后的明文流量转发给后端UDP 转发无法附加证书详见下文模板分析。底层原理从点击保存到 Nginx 生效的完整链路一个 Stream 从保存到真正生效走的是如下调用链前端提交StreamModal通过useSetStreamfrontend/src/hooks/useStreams.ts把表单数据 POST/PUT 到/api/nginx/streams路由鉴权backend/routes/nginx/streams.js 对请求做 JWT 校验后把载荷交给internalStream.create/update权限校验internalStream首先执行access.can(streams:create | streams:update, ...)。根据 backend/lib/access/streams-create.json创建/更新 Stream 需要admin 角色或拥有permission_streams: manage权限的普通用户落库数据写入stream表backend/models/stream.js。模型中tcp_forwarding、udp_forwarding、enabled、is_deleted为布尔字段meta为 JSON 字段存储ipv6等 Stream 特有选项历史迁移 20210423103500_stream_domain.js 曾把forward_ip重命名为forwarding_host佐证了该字段支持域名/IP 的演进审计日志create/update/delete/enable/disable 每个动作都会调用internalAuditLog.add分别记录created、updated、deleted、enabled、disabled五种事件可在审计日志页面追溯操作者与变更内容生成 Nginx 配置核心一步是调用internalNginx.configure(streamModel, stream, row)backend/internal/nginx.js。它会先执行nginx -t语法测试随后基于 backend/templates/stream.conf 渲染出/data/nginx/stream/下的配置文件并热加载 Nginx删除/禁用deleteConfig删除对应配置文件并reload()实现即时生效backend/internal/stream.js。深入解读 Nginx 模板一个 Stream 生成什么配置NPM 的 Stream 配置由 backend/templates/stream.conf 渲染生成其核心逻辑如下已省略模板语法呈现渲染结果# TCP 转发块 server { listen incoming_port reuseport ssl; # 开启 reuseport 与 ssl若绑定证书 listen [::]:incoming_port reuseport ssl; # IPv6 监听默认启用 # 证书指令由 _certificates_stream.conf 注入 ssl_certificate /etc/letsencrypt/live/npm-id/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/npm-id/privkey.pem; proxy_pass forwarding_host:forwarding_port; access_log /data/logs/stream-id_access.log stream; error_log /data/logs/stream-id_error.log warn; include /data/nginx/custom/server_stream[.]conf; # TCP 自定义扩展 include /data/nginx/custom/server_stream_tcp[.]conf; # TCP 专属扩展 } # UDP 转发块与 TCP 块并列 server { listen incoming_port udp reuseport; 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; include /data/nginx/custom/server_stream[.]conf; include /data/nginx/custom/server_stream_udp[.]conf; }这段模板揭示了几个重要事实reuseportNginx 为每个工作进程分配独立的监听 socket配合worker_processes可在多核上提升高并发 TCP/UDP 转发性能TCP 与 UDP 同端口共存模板中 TCP 块与 UDP 块分别渲染tcp_forwarding与udp_forwarding任一为真即生成对应 server 块因此同一个入站端口可以同时监听 TCP 与 UDP例如同时转发 DNSUDP 53与自定义 TCP 服务IPv6 默认开启{% unless ipv6 %}意味着只有当meta.ipv6为假时才注释掉[::]监听默认双栈监听SSL 仅 TCP证书指令backend/templates/_certificates_stream.conf只被注入到 TCP 块。证书来源分两类Lets Encrypt 证书路径为/etc/letsencrypt/live/npm-id/自定义上传证书路径为/data/custom_ssl/npm-id/自定义扩展钩子TCP 专属、UDP 专属、通用三套include钩子允许高级用户在不修改 NPM 生成文件的前提下注入额外 stream 指令如proxy_timeout、proxy_buffer_size。这些生成的server块会被 Nginx 主配置中的stream {}段统一加载docker/rootfs/etc/nginx/nginx.confstream { # Log format and fallback log file include /etc/nginx/conf.d/include/log-stream[.]conf; # Files generated by NPM include /data/nginx/stream/*.conf; # Custom include /data/nginx/custom/stream[.]conf; }可见 NPM 把每个 Stream 渲染为/data/nginx/stream/下的独立配置文件与http {}块完全隔离互不影响。证书的新建流程certificate_id new在前端选择新建证书时前端会传certificate_id: new的特殊值。后端在 backend/internal/stream.js 中专门处理了这个分支先从请求数据中删除certificate_id避免写入数据库调用internalCertificate.createQuickCertificate(access, data)快速签发证书需要域名 DNS 校验对应前端forceDNSForNew/requireDomainNames约束签发成功后通过一次update把certificate_id回填到 Stream 记录上最后重新拉取带certificate、owner展开的数据并触发 Nginx 配置生成。这一流程对创建create和更新update两个操作同样适用实现边建 Stream 边签证书的一体化体验。列表、启停与删除Streams 列表页frontend/src/pages/Nginx/Streams/Table.tsx展示以下列创建者头像、入站端口、目标地址forwardingHost:forwardingPort、协议徽标TCP/UDP、证书、启用状态与创建时间并支持按入站端口搜索与排序。启用/禁用调用POST /api/nginx/streams/{id}/enable|disablebackend/routes/nginx/streams.js。enable会把enabled置 1 并重新渲染 Nginx 配置disable置 0 并删除配置文件后reload()使规则立即从 Nginx 中移除但保留数据库记录方便日后恢复。后端还做了幂等保护对已启用的 Stream 再次启用会抛出ValidationError(Stream is already enabled)反之亦然删除走软删除is_deleted 1随后删除 Nginx 配置并重载记录deleted审计事件列表getAll按incoming_port升序返回未删除记录支持expand展开certificate与owner并支持按入站端口模糊搜索backend/internal/stream.js。通过 REST API 自动化管理 StreamStream 功能拥有完整的 REST APIbackend/routes/nginx/streams.js方便与 CI/CD 或运维脚本集成方法路径说明GET/api/nginx/streams列出全部 Stream支持?expand与?queryPOST/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禁用创建请求的 JSON 结构与 stream-object.json 一致{ incoming_port: 8080, forwarding_host: 192.168.1.10, forwarding_port: 8081, tcp_forwarding: true, udp_forwarding: false, enabled: true, certificate_id: 0, meta: {} }所有接口都需要携带 JWT 令牌并且调用方必须具备permission_streams的manage权限或 admin 角色backend/lib/access/streams-create.json、backend/lib/access/streams-update.json。多用户与可见性从 backend/internal/stream.js 的get/getAll实现可以看到Stream 与 Proxy Host 一样遵循 NPM 的可见性模型当用户权限的permission_visibility不是all时查询会自动追加owner_user_id 当前用户的过滤条件即普通用户只能看到自己创建的 Stream。这与前端HasPermission组件frontend/src/components/HasPermission.tsx配合实现按角色的管理隔离。日志与排障每个 Stream 都会生成独立的访问与错误日志路径由模板 stream.conf 定义访问日志/data/logs/stream-id_access.log使用stream日志格式由 log-stream.conf 定义错误日志/data/logs/stream-id_error.log级别warn。常见排查思路端口未生效确认 NPM 容器已映射对应入站端口Dockerports配置因为 NPM 无法替容器暴露未映射的端口TCP 通但 UDP 不通确认前端同时勾选了udpForwarding并检查目标服务是否监听 UDPSSL 握手失败确认证书已正确绑定且未过期检查/etc/letsencrypt/live/npm-id/或/data/custom_ssl/npm-id/下的证书文件需要额外调优利用模板预留的server_stream.conf/server_stream_tcp.conf/server_stream_udp.conf自定义钩子注入proxy_timeout等指令无需改动 NPM 生成文件。总结Nginx Proxy Manager 的 Stream 功能把 Nginxstream模块的原始 TCP/UDP 转发能力封装成了可视化的管理体验无需手写 Nginx 配置即可完成端口映射、双协议监听、TLS 终结、启用/禁用切换与审计追踪并可通过 REST API 编程化管理。对于游戏、FTP、SSH 等一切非 HTTP 服务Stream 都是 NPM 中与 Proxy Host 互补的必备能力。理解其背后的模板渲染与配置生成链路能帮助你在面对高并发转发、双栈监听和自定义调优需求时从容应对。【免费下载链接】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),仅供参考
返回列表