You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

使用步骤:

  1. 给脚本添加执行权限:chmod +x tcp_proxy.sh
  2. 启动转发服务: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:39:53