« 2009年2月 | トップページ | 2009年4月 »

2009年3月

2009年3月 8日 (日)

TCPポートのリダイレクト

サーバのリプレイス等でTCP接続をリダイレクトさせたい場合の方法を調べた。

Linuxにはiptablesというコマンドがあって、
通信を受けたり出したりする時の処理を設定できるらしく、
下記のコマンドでリレーさせることができた。

# iptables -t nat -A PREROUTING -p tcp --dport [port1] -j DNAT --to-destination [hostname:port2]
# iptables -t nat -A POSTROUTING -p tcp -d [hostname] --dport [port2] -j SNAT --to-source [localhost]

元ネタ: http://www.vector.co.jp/soft/unix/net/se304540.html

ところが、上記では何故かうまくいかないケースがあり、
一時的にTCP通信の受け流しをさせたいだけなので
プログラムで中継させたいと思ったのだが、
良さげなソフトが見つからなかった。
(世の中には超便利なのが絶対あると思うんだけど)

ので、自分で作ることにした。

で、できた。-> 「TcpRedirect.tar.gz」をダウンロード
中身は200行ちょっとのC++ソースコード(やっつけ)です。
不具合や改善点などお気づきのことがありましたら、
お気軽にご連絡いただけると幸いです。

● コンパイルの方法

$ tar xzvf TcpRedirect.tar.gz
$ g++ -o TcpRedirect TcpRedirect.cpp

● 使い方

$ ./TcpRedirect [listen port] [destination host] [destination port]

● 実行例

$ ./TcpRedirect 8000 192.168.1.51 80
connect:192.168.1.12         クライアントからの接続
192.168.1.12->:663[byte]    クライアントからの通信
192.168.1.12<-:276[byte]    サーバーからの通信
192.168.1.12<-:-1[byte]      サーバーから切断
disconnect:192.168.1.12      切断処理実施

● 動作環境

Linuxにg++が入っていれば大丈夫だと思います。
CentOS release 5.2で動いています。

初めてソケットプログラミングをしたのが高専の時で、
環境はSonyのNEWSだったのを思い出した。
会社に入ってからWindowsで通信テストのための
プログラムはいくつか書いたけど、
生ソケットでselectとか使ったのは、学生のとき以来ですね。

こういう低レイヤのプログラム、今でも好きだなぁ。
組込みC++開発者からITのマネージャに転職したの
もったいなかったかなぁ。

| | コメント (3) | トラックバック (0)
|

« 2009年2月 | トップページ | 2009年4月 »