如何运行多个“socat”并转发 TCP 和 UDP 流量?

如何运行多个“socat”并转发 TCP 和 UDP 流量?

我想在Linux服务器上转发Microsoft远程桌面,假设远程Windows主机是192.168.1.100,我想运行:

socat TCP4-LISTEN:3389,fork TCP4:192.168.1.100:3389
socat UDP4-LISTEN:3389,fork UDP4:192.168.1.100:3389

当我在 shell 中手动启动服务时它工作正常,但我想使用 启动它systemd,并登录到/var/log/socat-rdp.log

经过一些试验后,我可以像这样运行该服务:

[Unit]
Description=Socat RDP Forwarding Service
After=network.target

[Service]
Type=forking
User=root
ExecStart=/bin/sh -c "/usr/bin/socat TCP4-LISTEN:3389,fork TCP4:192.168.3.153:3389 > /var/log/socat-rdp.log 2>&1 & /usr/bin/socat UDP4-LISTEN:3389,fork UDP4:192.168.3.153:3389 > /var/log/socat-rdp.log 2>&1 &"
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

此配置正常启动并运行,但是当我停止该服务时,systemctl stop socat-rdp它返回错误代码 1,尽管socat进程正常被终止。

还有更好的解决方案吗?

答案1

我找到了一种替代解决方案来解决运行多个 socat 实例并转发 TCP 和 UDP 流量的问题。我没有使用 systemd 来管理服务,而是使用 Docker 来实现预期的结果。

我找到了一个 Docker 镜像,并使用 Docker Compose同时alpine/socat运行 TCP 和 UDP 的两个实例。socat这是我的 Docker Compose 文件:

---
services:
  socat_rdp_tcp:
    image: alpine/socat
    container_name: socat_rdp_tcp
    command: "TCP-LISTEN:3389,fork TCP:192.168.1.100:3389"
    ports:
      - 3389:3389

  socat_rdp_udp:
    image: alpine/socat
    container_name: socat_rdp_udp
    command: "UDP-LISTEN:3389,fork UDP:192.168.1.100:3389"
    ports:
      - 3389:3389/udp

Docker 镜像: 阿尔派/索卡特

答案2

当您直接在终端中运行 socat 命令并杀死它们(也许是killall socat?)时,给定的代码是 Exit 143?最简单的 dirtyhack 是在 [Service] 下使用 SuccessExitStatus=143。

相关内容