socatを使ってみる

複数台のWebサーバ(Apache)が動作している環境で、
アクセスログを簡単に集約できないか調べていた。

アクセスログを、netcat(ncコマンド)を利用して、UDPパケットとしてブロードキャストに投げ、
それをログ収集サーバが受け取ることができないか調べていたが、CentOS付属のnetcatでは出来なかった。

※詳しくは調べていないが、UDPで待ちうけるように設定した場合、一回通信が開始されると、その待受けポートがなくなってしまう模様。

代わりのものを調べていたら、socatというnetcatの高機能版のようなツールがあった。
TCP/UDPだけではなく、IP,SCTP,PTY,EXEC等多数のプロトコルを扱える。

EPELにsocatパッケージとして登録されている。

# yum install --enablerepo=epel socat

●利用方法

サーバ側は以下のようにして待受けポートを指定。

# socat UDP-LISTEN:6666 STDOUT 

クライアント側は以下のようにして宛先サーバと宛先ポートを指定する。

# socat STDIN UDP-SENDTO:localhost:6666

すると、クライアント・サーバ間で任意の通信のやり取りが出来る。

ここで、宛先サーバとしてブロードキャストアドレスを指定してあげれば、マルチキャストのように利用できる。
※ブロードキャストアドレスを指定するには broadcastオプションが必要。
※クライアントからサーバ方向への片方向通信に制限するには、サーバ側、クライアント側のどちらかに-uオプションをつける。
※複数回の接続を受け付けるにはforkオプションが必要。

サーバ側

# socat -u UDP-LISTEN:6666,fork STDOUT 

クライアント側

# socat -u STDIN UDP-SENDTO:{ブロードキャストアドレス}:6666,broadcast

socatはシリアル回線からの入出力も可能なため、netconsoleの代わりが出来る。
netconsoleではbondingデバイスで利用できない制限があるが、socatにはその制限がない。

通信負荷がかかるので、なるべくならL3スイッチなどでブロードキャストドメインを小さくしたほうがいいかと思う。

カテゴリー: Technology パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)