我想在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。