network > (IP, Port) mapper > socatを使う > sudo socat UDP4-RECVFROM:6000,fork UDP4-SENDTO:192.168.3.141:7000 / eth1指定の場合は sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth1 UDP4-SENDTO:192.168.3.141:7000


動作環境
CentOS 6.8 (64bit)
Windows 8.1 Pro (64bit)

関連 http://qiita.com/7of9/items/b7ef37e77dfd6a921bee

(IP, port)のリレー方法。

何をしたいか

  1. OS Aから送信ポート6000でOS Bにコマンドを送信する
  2. OS Bが送信コマンドのリレーをする
  3. リレー先でコマンド応答処理をする
  4. OS Bが応答のリレーをする
  5. OS Aが応答を受ける

構成

  • OS A
    • Windows 8.1 Pro (64bit)
    • 送信ソフト: UDP/IPテストツール by NonSoftさん
    • 受信ソフト: 自作のUDP echo server (C++ Builder XE4で実装)
  • OS B
    • CentOS 6.8 (64bit)
    • リレー: socat使用 (後述)

方法

socatを使う。

参考 http://mattryall.net/blog/2011/09/udp-port-forwarding-with-socat

実施手順

OS B上で以下を実行しておく。

$ sudo socat UDP4-RECVFROM:6000,fork UDP4-SENDTO:192.168.3.141:7000

ここで192.168.3.141は転送先のOS (この例ではOS Aとしている)。

以下を行う。

  1. OS AにてUDP echo server を起動
    • 7000ポートで受信したものをecho backするようにしておく
  2. OS AからUDP/IPテストツールにて「AAB」を送信
    • リレーが行われecho serverがecho backする
    • リレーが行われecho back文字列がUDP/IPテストツールの受信として処理される

他に試したこと > 失敗

nc (netcat)で以下を試した。

$ nc -u -l 6000 | nc -u 192.168.3.141 7000

OS Bのポート6000に来た文字をOS Aのポート7000にリレーはできた。
問題はecho back文字列がリレーできないこと。
echo back文字列は別のポートになり、そのポート番号が分からない。
色々調べたところ、socatの方が楽だった。

socat > 特定のNICに対する処理

複数のNICがある場合(eth0, eth1)、eth1のポート6000だけ転送するには以下のようにする。

$ sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth1 UDP4-SENDTO:192.168.3.141:7000

参考 http://www.dest-unreach.org/socat/doc/linuxwochen2007-socat.pdf
のp27にbindtodeviceの記載があった。

manなどで見た場合,so-bindtodevice指定かと思ったが、それは有効ではなかった。