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

» 2009年01月19日 08時00分 公開
[Ben Martin,SourceForge.JP Magazine]
SourceForge.JP Magazine
前のページへ 1|2       

 こうしたtcppipeが役立つのは1度行えば終わりといった単方向の転送であるが、次に解説するtcp-pfコマンドを用いると、双方向のポートフォワーディングをセットアップできる。SSHのポートフォワーディング機能にtcp-pfを併用することで得られるメリットの1つは、-rオプションの指定によりポートフォワーディングの速度制限ができることだ。

 後記に掲載したtcp-pfの実行例では、SSHデーモンに対するポートフォワーディング接続を確立させている。ここでは--rateオプションによるネットワーク転送速度を毎秒1024バイトと指定しているが、これによりSSHシェルは相当分の低速化をするはずだ。-sオプションは、ローカルホストのポート10022をポートフォワーディングの送信元とする指定で、同様に-dは、ローカルホストのポート22をポートフォワーディングの送信先とするための指定である。ローカルホストのポート22でSSH接続が行える限り、この tcp-pfコマンドを実行することでローカルホストのポート10022を用いたSSH接続が確立されて、レートリミティングを施したセッションが利用可能となる。なお最後に指定している-wオプションは、tcp-pfがサーバにアクセスして接続を確立するまでに待機させる時間(秒)の設定であり、わたしの経験でもこうした短めの遅延時間をtcp-pf側で設けておかないとSSH接続が正常に行われないようだ。


$ tcp-pf --rate 1024 -s 10022 -d 127.0.0.1:22 -w 1
client connected from 0.0.0.0.0.0.0.0.0.0.0.0.0.0.255.255:50715 => accept
16408 ->: bandwidth: 624.63 B/s	bytes: 1268
16408 <-: bandwidth: 888.23 B/s	bytes: 1804
16408 ->: bandwidth: 536.28 B/s	bytes: 2724
...
16408 ->: average bandwidth: 168.63 B/s
16408 ->: total bytes: 3524
16408 <-: average bandwidth: 860.33 B/s
16408 <-: total bytes: 17980
client handled

 なお、-aまたは--allowオプションを用いると、tcp-pfの送信元ポートへの接続を許可するホスト群の明示的な指定ができる。このオプションを用いた接続対象ホスト群の指定は何度も行えるが、逆に-aオプションの指定がない場合は任意のホストが接続可能となる。

 利用可能なApache Webサーバが幾つか存在するなど、同一のサービスが複数のサーバから提供されている場合は、tcp-pfの有す接続先サーバの自動選択機能を用いたロードバランシングが使用できる。その際の接続先ポート指定に用いるのは-pまたは--dportオプションである。こうしたサーバのIPアドレス群を登録したファイルについては、その名前を-lまたは--listオプションで指定すればいい。このロードバランシングを用いる場合、各アドレスごとに割り当てられた負荷の大きさ(バイト単位)はtcp-pfコマンドが自動管理するので、ユーザーが行うべき作業は該当するIPアドレスを1つのファイル中に記述しておくことだけだ。そしてこのファイルに登録したサーバ群に対しては、tcp-pfが送信したバイト量が各サーバのIPアドレスに続けて記録されていき、送信元のポートに新規のクライアントが接続すると、その段階で送信量が最低のサーバがtcp-pfによって選択され、これがポートフォワーディングの対象サーバとされていくのである。

 最後に解説するlistentwoとconnecttwoは、ファイアウォールで隔たれたホストへのポートフォワーディングを行うためのツールである。先に見たtcp-pfに対してconnecttwoの有す最大の相違点は、ローカルホスト以外の送信元ポートを指定できることだが、わたしが確認した限りの話においてこれらのツールは、デフォルト設定下および-hというコマンドラインオプションの使用に関する情報を何も提示してくれないのだ。またこれらは、レートリミティングもロードバランシングもサポートしていない。これらのツールを用いた基本的なTCPポートフォワーディングの設定法は複数存在するが、その詳細についてはshd-tcp-toolsに付属するreadmeファイルを参照して頂きたい。

 ポートフォワーディング用のコマンド群はSSHとの併用も行える。先に触れたように、SSH固有のポートフォワーディング機能を介してshd-tcp-toolsのポートフォワーディングを利用することは一見奇妙に感じられるかもしれないが、両者の組み合わせはshd-tcp-toolsのレートリミティング機能を利用可能とするし、1つしかない既存のSSHポート転送を基にしたポートフォワーディングを新規に複数セットアップすることも可能になるのだ。

 例えば「tcppipe :2002 -」というコマンドで、サーバのstdoutにポート2002から任意の配信を可能とした後、後記に示した2つのコマンドをクライアント側で実行したとしよう。このうちsshコマンドは、ローカルマシンのポート2001からサーバマシンのポート2002に向けてSSHによるポートフォワーディングを行わせるためのもので、その次のtcppipeコマンドは先に実行したものとよく似ているが、こちらはSSHのポートフォワーディングを介してポート2001のトラフィックをサーバ側のポート2002に送信するようにしている。


$ ssh -N -L 2001:localhost:2002 ben@server.example.com
$ echo hi | tcppipe - localhost 2001

 このサンプルコードだけを見る限り、メインの処理を賄っているのはSSHだけであり、shd-tcp-toolsを併用するメリットは何もないと感じる方もおられるかもしれないが、実は--limitオプションを用いることで、本来は1つしかないSSHポートフォワーディング接続を基にして複数のポートフォワーディングを構築し、これらの各ポートフォワーディングごとに異なるレートリミティングを施すことが可能となるのだ。

 通常shd-tcp-toolsはあらゆるネットワークインタフェースに接続できるが、特定のネットワークインタフェースのみに制限することも可能で、それにはexport INADDR_DEFAULT="pyx.example.com"のようにして環境変数INADDR_DEFAULTをエクスポートすればいい。

まとめ

 shd-tcp-toolsに属すツール群の間では、使用可能なコマンドラインオプションの一部に不整合性が見られる。例えばレートリミティングの指定にtcp-pfでは--rateオプションを使うのに対し、tcppipeでは--limitオプションを使うとreadme.txtには記述されている。ところが実際には--limitだけでなく--rateもtcppipeコマンドは受け付けるので、これら2つのツールに共通した転送速度制限の指定オプションとしては後者を使えばいいのである。また送信元と転送先の指定情報についても、tcppipeではコマンドラインの最終引数として記述するのに対し、tcp-pfでは-sおよび-dパラメータを用いた指定をしなくてはならない。

 これらの不備は、バージョン番号を見る限りβ版とみなしていい段階のツールであることを考えると、さまつな問題だといえるだろう。実際これらのユーティリティは、いずれも正常に機能して所定の目的を果たしてくれるのである。SSHでのアクセスを許可すると同時に、1人のユーザーが利用可能とするネットワーク帯域幅を制限したいという場合に、個々のポートフォワーディング別にレートリミティングを個別設定できるというshd-tcp-toolsの存在が役に立つはずだ。

Ben Martinは10年以上にわたってファイルシステムに取り組んでおり、博士課程の修了後、現在はlibferris、ファイルシステム、検索ソリューションを中心としたコンサルティング業に従事している。


あなたのシステムをさらに高度なものするアイデアが詰まった「Leverage OSS」コーナーにどうぞ


前のページへ 1|2       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ