Nginx 四层(stream)反向代理 + DNS 负载均衡
一、实验目标
用 Nginx(IP:192.168.65.135)做四层反向代理,将 53/udp 请求轮询转发到两台权威 DNS:
192.168.65.131
192.168.65.132
验证:外部查询
dns.xiaott.org
时,135 端口返回的结果在 131/132 之间切换,且均带 aa(权威)标志。
──────────────────────────────────
二、实验拓扑
Client ──UDP/53──► 192.168.65.135 (Nginx stream)├─► 192.168.65.131:53 (BIND) └─► 192.168.65.132:53 (BIND)
──────────────────────────────────
三、环境信息
角色 | IP | 软件/版本 | 备注 |
---|---|---|---|
Nginx Proxy | 192.168.65.135 | nginx-1.24.0 --with-stream | 已启用 stream 模块 |
DNS-1 | 192.168.65.131 | bind-9.16.23 | 权威域:xiaott.org |
DNS-2 | 192.168.65.132 | bind-9.16.23 | 权威域:xiaott.org |
Client | 192.168.65.x | dig 9.16.23 | 用于测试 |
──────────────────────────────────
四、DNS 权威服务器配置(131 & 132)
区域文件
/var/named/xiaott.org.zone
(两台内容一致,仅 serial 不同,便于观察)
$TTL 1D
@ IN SOA dns.xiaott.org. root.xiaott.org. (2025072801 ; serial on 1311D 1H 1W 3H )IN NS dns.xiaott.org.
dns IN A 192.168.65.131 ; <-- 131 上
bbs IN A 192.168.65.131
$TTL 1D
@ IN SOA dns.xiaott.org. root.xiaott.org. (2025072802 ; serial on 1321D 1H 1W 3H )IN NS dns.xiaott.org.
dns IN A 192.168.65.132 ; <-- 132 上
bbs IN A 192.168.65.132
启动并验证
systemctl enable --now named
named-checkzone xiaott.org /var/named/xiaott.org.zone
dig @127.0.0.1 dns.xiaott.org +short
返回各自 IP 表示权威服务器正常。
──────────────────────────────────
五、Nginx 四层反向代理配置(135)
目录结构
/usr/local/nginx/
└── tcp.d/└── dns.conf
内容:
/usr/local/nginx/tcp.d/dns.conf
stream {upstream dns_cluster {server 192.168.65.131:53 max_fails=3 fail_timeout=5s;server 192.168.65.132:53 max_fails=3 fail_timeout=5s;}server {listen 53 udp; # 四层 UDPproxy_pass dns_cluster;proxy_responses 1; # 等待 1 个 DNS 响应proxy_timeout 1s;}
}
引入主配置
在nginx.conf
的include
区域添加:
include /usr/local/nginx/tcp.d/*.conf;
启动 Nginx
nginx -t # 语法检查
systemctl reload nginx
ss -unlp | grep 53 # 确认 135 正在监听 udp/53
──────────────────────────────────
六、测试与现象记录
序号 | 客户端命令 | 返回 IP | 来源服务器 | 备注 |
---|---|---|---|---|
1 | dig @192.168.65.135 dns.xiaott.org | 192.168.65.131 | DNS-1 | aa 标志 |
2 | 再次执行 | 192.168.65.132 | DNS-2 | 轮询到第二台 |
3 | 关闭 131 的 named | 仅 132 返回 | DNS-2 | 故障转移 |
4 | 重启 131 | 131/132 交替出现 | 负载均衡恢复 |
抓包验证(135 上):
tcpdump -i any -nn udp port 53 and host 192.168.65.135
可看到源端口 53 的报文交替发往 131 与 132。
──────────────────────────────────
七、结论
Nginx 成功以四层 UDP 反向代理将 53 端口请求轮询到后端两台权威 DNS。
通过
max_fails
与fail_timeout
实现健康检查与故障摘除。客户端始终感知单一入口(192.168.65.135),无需关心后端变化。