使用netcat或socat转发流量时如何添加HTTP头
解决方案
问题原因
sed卡死问题来自两层缓冲机制:
- sed默认使用行缓冲模式,遇到无换行符结尾的HTTP payload时会持续等待输入结束,不会向下游传递内容
- ncat默认的I/O缓冲也会阻塞管道数据传递,导致内容卡在最后一段无换行的payload处
方法1:调整缓冲参数的ncat+sed方案
通过stdbuf关闭进程缓冲,配合sed的无缓冲参数即可解决卡死问题,示例为插入X-Forwarded-For: 1.2.3.4头:
stdbuf -i0 -o0 ncat -lk localhost 1234 | stdbuf -i0 -o0 sed -u '0,/^\r$/s//X-Forwarded-For: 1.2.3.4\r\n/' | stdbuf -i0 -o0 ncat -v localhost 2345
参数说明:
stdbuf -i0 -o0:关闭对应进程的输入、输出缓冲sed -u:启用sed的无缓冲模式,实时处理输入内容0,/^\r$/:限定仅匹配HTTP头末尾的第一个空行(HTTP协议规定头与payload之间通过仅含\r的空行分隔),仅在该位置插入自定义头不会修改payload内容
方法2:更简洁的socat方案
如果可以使用socat,无需手动调整缓冲参数,天然支持多并发连接,配置更简单:
socat TCP-LISTEN:1234,fork SYSTEM:"sed '0,/^\r$/s//X-Custom-Header: test\r\n/' | ncat localhost 2345"
其中fork参数支持同时处理多个连接请求,比原生ncat单连接模式适用性更强。
注意事项
- 以上示例为向HTTP请求中插入请求头,若需要向返回的响应中插入头,需要调整匹配逻辑或配置socat的双向过滤规则
- 若转发的是HTTPS加密流量,需要先完成TLS卸载后再执行头插入操作,无法直接修改加密后的流量内容
- 自定义头内容需要遵循HTTP协议规范,末尾必须带
\r\n,避免引发接收端解析错误
内容的提问来源于stack exchange,提问作者David Kennedy
相关产品推荐
相关产品推荐

