LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-14
動作環境
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指定かと思ったが、それは有効ではなかった。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1