nginx stream模块支持tcp dns转发与负载均衡,需启用with-stream模块、配置listen 53(tcp)、upstream及超时参数,并开放防火墙tcp 53端口;mosdns专注dns高性能转发,支持doh/dot、缓存与过滤;redsocks2则用于udp→tcp协议转换,实现无感升级。

用 TCP 代理承载 DNS 流量做高性能域名转发,核心不是“替代 UDP”,而是补足 UDP 的短板——提升可靠性、规避运营商干扰、支持加密演进(如 DoT),同时借助连接级控制实现更稳的负载与调度。Nginx stream 模块和专用工具(如 mosdns、redsocks2)是两条主流路径,适用场景不同。
用 Nginx stream 做 DNS TCP 转发与负载均衡
适合已有 Nginx 环境、需统一四层流量入口、强调稳定性和运维一致性的中大型部署。
- 确认已启用 stream 模块:运行
nginx -V 2>&1 | grep with-stream,无输出需重编译并加--with-stream --with-stream_ssl_module - 在
nginx.conf的events块后添加stream配置,例如:stream { upstream dns_servers { hash $remote_addr consistent; server 8.8.8.8:53 weight=2; server 1.1.1.1:53 weight=2; server 114.114.114.114:53 backup; } server { listen 53; proxy_pass dns_servers; proxy_timeout 4s; proxy_responses 1; # UDP 才需此项,TCP 可省略 } } - 注意:监听
53(不带udp)即为 TCP;若需兼容,再加一个listen 53 udp的 server 块 - 务必开放系统防火墙的 TCP 53 端口,并确保 Nginx 进程有权限绑定特权端口(通常需
setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx或以 root 启动)
用 mosdns 构建专注 DNS 的高性能转发器
适合追求极致 DNS 性能、需要过滤、缓存、DoH/DoT 上游、或部署在边缘/路由器等资源受限环境。
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 直接下载编译或使用预编译二进制,配置简洁,YAML 格式示例:
plugins: - name: sequence args: - exec: cache - exec: forward args: upstream: - addr: https://dns.google/dns-query # DoH - addr: tls://1.1.1.1 # DoT - addr: 8.8.8.8:53 # TCP fallback - 内置缓存插件可显著降低上游压力;支持基于域名、IP、地理位置的条件转发,比纯 TCP 代理更灵活
- 单进程多协程模型,实测万级并发下 CPU 占用低于 10%,内存常驻约 20–40 MB
用 redsocks2 实现 UDP→TCP 协议转换
适合终端侧轻量改造,比如在 OpenWrt 路由器上把全网 DNS 请求“无感”升级为 TCP,规避本地 DNS 劫持。
- redsocks2 启动后监听本地 UDP 端口(如
127.0.0.1:5353),接收传统 DNS 查询 - 内部将 UDP 报文封装为 TCP 连接,发往可信上游(如
8.8.8.8:53或自建 DoT 服务) - 响应原路返回,对客户端完全透明,无需修改任何设备 DNS 设置
- 配合 iptables 或 nftables 的 DNAT 规则,可将局域网所有 UDP 53 流量重定向至此端口
关键注意事项
无论选哪种方式,以下三点直接影响效果:
-
TCP DNS 必须被允许:RFC 7766 明确要求解析器和服务端必须支持 TCP,但部分老旧防火墙或 ISP 仍拦截 TCP 53,建议提前测试连通性(
nc -zv 8.8.8.8 53) - 超时设置要合理:UDP DNS 通常设 1–2 秒超时,TCP 因握手+传输略长,建议 3–4 秒;过短易误判失败,过长拖慢整体响应
- 避免单点故障:上游至少配置两个不同网络的 DNS 服务器(如一个公网 DoH + 一个内网递归),并启用 backup 或 failover 机制










