socat/netcat能否实现端口转发同时记录连接数据?
TCP端口转发+双向数据记录解决方案
你的问题出在管道的单向性:原命令只能处理客户端到服务器的正向流量,服务器返回的反向流量无法通过管道回传给客户端,导致通信异常。以下是几种可行的解决方法:
方法一:嵌套socat+tee实现单命令双向日志
直接用socat的EXEC选项调用shell命令,同时捕获双向数据流并写入日志:
socat TCP-LISTEN:8888,reuseaddr,fork EXEC:'sh -c "tee -a tcp_session.log | socat - TCP4:192.168.1.10:1234 | tee -a tcp_session.log"'
- 第一个
tee记录客户端→服务器的流量 - 第二个
tee记录服务器→客户端的流量 - 所有数据会追加到
tcp_session.log文件中
如果需要分开记录双向流量,只需修改日志文件名:
socat TCP-LISTEN:8888,reuseaddr,fork EXEC:'sh -c "tee -a client_to_server.log | socat - TCP4:192.168.1.10:1234 | tee -a server_to_client.log"'
方法二:专用Shell脚本实现灵活转发与日志
如果需要自定义日志格式或添加额外逻辑,可编写一个简单的脚本(比如tcp_proxy.sh):
#!/bin/bash # 配置参数 REMOTE_IP="192.168.1.10" REMOTE_PORT="1234" LOG_FILE="tcp_session.log" # 创建临时双向管道 mkfifo pipe_in pipe_out # 转发客户端数据到远程,同时记录日志 tee -a "$LOG_FILE" <&0 > pipe_in & # 转发远程返回数据到客户端,同时记录日志 tee -a "$LOG_FILE" < pipe_out >&0 & # 建立与远程服务器的双向连接 socat - TCP4:"$REMOTE_IP":"$REMOTE_PORT" < pipe_in > pipe_out # 清理临时管道 rm pipe_in pipe_out
使用步骤:
- 给脚本添加执行权限:
chmod +x tcp_proxy.sh - 启动转发服务:
socat TCP-LISTEN:8888,reuseaddr,fork EXEC:./tcp_proxy.sh
方法三:利用socat内置tee地址(正向流量记录)
如果只需要记录客户端到服务器的正向流量,可直接使用socat的tee地址选项,语法更简洁:
socat TCP-LISTEN:8888,reuseaddr,fork TCP4:192.168.1.10:1234,tee:forward_traffic.log,tee-append
tee:forward_traffic.log:将收到的正向流量写入日志文件tee-append:以追加模式写入(避免覆盖原有日志)
内容的提问来源于stack exchange,提问作者tinkerbeast
相关产品推荐
相关产品推荐

