如何配置NGINX在访问特定路径时发送TCP重置包?
解决NGINX反向代理TCP重置路径时502 Bad Gateway的问题
问题背景
需要配置NGINX(或其他反向代理),当访问网站特定路径(如www.mysite.com/tcp-reset)时发送TCP重置包,强制浏览器重新解析域名用于DNS重绑定攻击。尝试将该路径指向Python Socket服务器(直接访问端口可正常触发TCP重置),但通过NGINX访问时客户端收到502 Bad Gateway错误。
问题原因
你的Python脚本仅接受连接后直接关闭,但NGINX作为HTTP反向代理,会向后端发送完整的HTTP请求,并期望后端返回合法的HTTP响应。脚本未读取NGINX发送的HTTP请求数据就直接断连,NGINX会认为后端服务异常,因此返回502错误。
解决方案
方案1:修改Python Socket脚本
调整脚本,先读取NGINX发送的HTTP请求数据,再设置SO_LINGER选项关闭连接:
import socket import struct with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("127.0.0.1", 1234)) s.listen(5) while True: conn, addr = s.accept() print(f"Connection from {addr}") # 读取HTTP请求内容(无需处理,仅消耗数据) try: conn.recv(4096) except Exception as e: print(f"Recv error: {e}") # 设置SO_LINGER,关闭连接时发送TCP重置包 l_onoff = 1 l_linger = 0 conn.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger)) conn.close()
修改后NGINX配置保持不变,此时NGINX会在发送请求后收到连接关闭信号,将TCP重置包传递给客户端,不再返回502。
方案2:直接用NGINX内置指令(推荐)
NGINX 1.19.10及以上版本支持直接发送TCP重置包,无需依赖后端服务器,配置更简洁高效:
location /tcprst/ { # 直接发送TCP重置包 return reset; }
如果使用旧版本NGINX,可使用return 444,该指令会让NGINX直接关闭连接不返回HTTP响应,部分环境下也会触发TCP重置:
location /tcprst/ { return 444; }
验证方法
使用curl测试:
curl -v https://www.mysite.com/tcprst/
若输出中包含Connection reset by peer,说明TCP重置包已成功发送。
内容的提问来源于stack exchange,提问作者zaki98
相关产品推荐
相关产品推荐

