特集
» 2009年01月19日 08時00分 UPDATE

Leverage OSS:shd-tcp-toolsを用いたポートフォワーディング、ロードバランシング、レートリミティングの実装 (1/2)

SSHを基にしたネットワーク容量の転送速度制限機能を提供し、可能であればキャパシティの負荷分散も行うshd-tcp-toolsは、個々のポートフォワーディング別に転送速度制限を個別設定したい場合など高度な使い方に応えてくれるツールとなっている。

[Ben Martin,SourceForge.JP Magazine]
SourceForge.JP Magazine

 本稿で紹介するshd-tcp-toolsは、ポートフォワーディング(ポート転送)、ロードバランシング(負荷分散)、レートリミティング(転送速度制限)をTCP接続に施すためのツール群をまとめたものである。これが役立つのは、SSHサービスを提供したいが長時間におよぶ単一のSCPオペレーションがサーバのインターネット接続を食い尽くしてしまわないよう、各ユーザーが利用できる帯域幅に制限を設けておきたいという場合だ。

 ポートフォワーディング機能はSSH自身にも用意されているが、これにshd-tcp-toolsを併用することで、ポート転送に対するレートリミティングが可能となる。ただしshd-tcp-toolsはTCPレベルで動作し、認証および暗号化に関する有効な機能を有していないため、SSHのポートフォワーディング機能をshd-tcp-toolsで置き換えられるという訳ではない。つまりSSHとshd-tcp-toolsは相互補完的な関係にあり、前者はセキュリティ関連の機能を提供し、後者はSSHを基にしたネットワーク容量のレートリミティング機能を提供し、可能であればキャパシティのロードバランシングも行うという住み分けになっているのだ。

 shd-tcp-toolsのパッケージは、Ubuntu、Fedora、openSUSEのリポジトリには収録されておらず、本稿の執筆においてもshd-tcp-toolsの最新版に当たるバージョン0.05のソースを入手した上で、後述する手順による64ビット版Fedora 9マシンを用いたソースからのアプリケーションビルドを行っている。shd-tcp-toolsはautotoolsを使用しないが、設定用のスクリプトは用意されており、そのMakefileもallおよびinstallをターゲットとするため、実質的にはautotoolsプロジェクトと同様のビルドが行える。具体的なインストール手順は後記のようになるが、ここで行う最終ステップはバイナリ群を/usr/local/binにインストールするMakefileの固定シーケンスである。


$ tar xjvf /.../shd-tcp-tools-0.05.tar.bz2
$ cd shd-tcp-tools-*
$ ./configure
$ make
$ sudo make install

 shd-tcp-toolsを構成する主要なツールは、単方向のTCPパイプを作成するtcppipe、TCPでの双方向ポートフォワーディングを可能とするtcp-pf、中間ホストを介したポートフォワーディングをセットアップするためのlistentwoおよびconnecttwoである。

 tcppipeツールの機能は、TCPを用いた単方向のデータ送信または受信において、転送速度に上限を課すことである。このコマンドを使用するには、転送するデータの送信元と受信先をパラメータ指定する必要がある。また送信元と受信先にそれぞれstdinおよびstdoutを用いる場合は、ハイフン記号を用いた省略表記もできる。

 後記に例示した2つのコードブロックは、クライアント側でTCP接続が確立されるまで待機してからサーバプロセスによるデータ送信が始まる場合もあるという想定の下、異なるターミナルから同時に進行させた実行例である。このうち1つ目のブロックがサーバ側で実行したコマンド群、2つ目のブロックがクライアント側で実行したコマンド群であり、ここでは前者で実行する個々のtcppipe転送コマンドの間にギャップを設けて、その間に後者のコマンドブロックにおけるクライアント側からのコマンド送信を行うようにした。

 1つ目のコマンドブロック、つまりサーバブロックで用いた1番目のtcppipeコマンドは、ローカルホストのポート5001に対する受信を開始させるための指定で、ここでは先に触れた-という指定を用いているため、tcppipeに送信されたデータはすべてstdoutへの出力とされる。同じく、2番目のtcppipeコマンドで用いている-pオプションは、進ちょく状況を表示させるための指定だ。ただし、この2番目のサーバコマンド実行例における送信データ量は1Mバイトしかないので、表示すべき進ちょく情報は特になく、最終的な統計情報のみが出力されている。これに対して3番目のサーバコマンドによる実行例ではレートリミティングを施しているため、前回より1桁少ないデータ量しか転送させていないにもかかわらず、転送過程における進ちょく情報が出力されている。


$ tcppipe :5001 -
client connected from 0.0.0.0.0.0.0.0.0.0.0.0.0.0.255.255:57897
hi
$ tcppipe -p :5001 -
client connected from 0.0.0.0.0.0.0.0.0.0.0.0.0.0.255.255:52458
15729 ->: average bandwidth: 10.20 MiB/s
15729 ->: total bytes: 1048576
$ tcppipe -p :5001 -
client connected from 0.0.0.0.0.0.0.0.0.0.0.0.0.0.255.255:52460
->: bandwidth: 14.99 KiB/s	bytes: 30720
->: bandwidth: 10.01 KiB/s	bytes: 61440
->: bandwidth: 10.00 KiB/s	bytes: 81920
->: bandwidth: 9.99 KiB/s	bytes: 102400
15737 ->: average bandwidth: 11.11 KiB/s
15737 ->: total bytes: 102400

 先のサーバ側で用いた各コマンドに対応させる形でクライアント側で実行させたのが、後記に一覧したコマンド群である。ただし1番目のコマンドに関しては-指定で送信元と受信先をそれぞれstdinとstdoutとしたデータコピーを行っているだけなので、対応するサーバコマンドは存在しない。以下、2番目のコマンドはローカルホストのポート5001に対するstdinのコピーを行わせたもの、3番目のコマンドは/dev/zeroからローカルホストのポート5001に対するデータ量1Mバイトのコピーを行わせたもの、4番目のコマンドは--limitというパラメータ指定を用いて転送速度を10KBpsに制限したものである。ただしtcppipeでは若干のネットワークバッファリングが行われるため、この4番目の実行例でもddの処理終了までに要した時間は予想よりも短くなっており、データの書き出し速度も51KBps出ていたと表示されている。


$ echo hi | tcppipe - -
hi
$ echo hi | tcppipe - localhost 5001
$ dd if=/dev/zero  bs=1024 count=1024 | tcppipe - localhost 5001
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0806214 s, 13.0 MB/s
$ dd if=/dev/zero  bs=1024 count=100 | tcppipe --limit 10240 - localhost 5001
100+0 records in
100+0 records out
102400 bytes (102 kB) copied, 2.00108 s, 51.2 kB/s

       1|2 次のページへ

Copyright © 2010 OSDN Corporation, All Rights Reserved.

Loading

ピックアップコンテンツ

- PR -

注目のテーマ