複数の「socat」を実行し、TCPおよびUDPトラフィックを転送する方法は?

複数の「socat」を実行し、TCPおよびUDPトラフィックを転送する方法は?

リモートのWindowsホストが次のようであると仮定し、LinuxサーバーからMicrosoftリモートデスクトップを転送したいと思います。以下を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

シェルでサービスを手動で開始すると正常に動作しますが、を使用してサービスを開始して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/socat2つの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

ドッカー画像: アルパイン/ソキャット

答え2

ターミナルで直接socatコマンドを実行して終了するとき(killall socat?)、与えられたコードはExit 143ですか?最も簡単なダーティ核は、[サービス]でSuccessExitStatus = 143を使用することです。

関連情報