実践で学ぶ、一歩進んだサーバ構築・運用術

第 5 回 stone (前編)


パケットを中継する stone

拙作の「stone」は, TCP,あるいは UDP のパケットを中継する, アプリケーション・レベルのパケット・リピータです。 特定のホストの特定のポートに対する TCP 接続を, 他のホストの特定のポートへ中継できるので, 便利です。 stone は Linux をはじめとする UNIX 系 OS のほか, Windows NT や Windows98/95,OS/2 の上でも走らせることができます。 stone の公式ホームページは, http://www.gcd.org/sengoku/stone/Welcome.ja.html です。

● TCP の中継

例えば, GCD*6 の内部 LAN 上のホスト「takatsu」は プライベート・アドレスであるため, 外部からアクセスできません。 外部から GCD のゲートウエイ「asao」へアクセスすることはできますし, asao から takatsu へアクセスすることもできます。 このような場合, asao で stone を走らせてパケットを中継することにより, 外部から takatsu へアクセスすることが可能になります(図 1)。

stone を使うことにより,外部から社内 LAN 上のマシンにアクセスできるようになる
図 1 stone を使うことにより, 外部から社内 LAN 上のマシンにアクセスできるようになる

外部から takatsu へ telnet でアクセスしたい場合は, 図 2 のように asao 上で stone を実行して, asao のポート「10023」*7 に対する TCP 接続を, takatsu のポート「23」(つまり,telnet のポート)へ中継します。


% stone takatsu:23 10023 &
May 29 23:55:15 start (2.1) [22287]
May 29 23:55:15 stone 3: takatsu.gcd.org:telnet <- 10023

図 2 stone の実行例

ゲートウエイの asao 上で stone を実行して, asao のポート「10023」に対する TCP 接続を, takatsu のポート「23」へ中継する。

/etc/services に登録されているサービスに関しては, ポート番号を数字で指定する代わりに, サービス名を用いて, 図 3 のように実行することもできます。


% stone takatsu:telnet 10023 &
図 3 /etc/services に登録されているサービス名を用いても実行できる

このように stone を実行しておくと, asao のポート 10023 にアクセスすることによって, takatsu へ telnet することができるようになります(図 4)。


% telnet asao.gcd.org 10023
Trying 210.145.125.162...
Connected to asao.gcd.org.
Escape character is '^]'.

login: sengoku
Password: XXXXXXXX
Last login: Mon May 29 21:31:22 on tty1
takatsu:/home/sengoku %

図 4 stone を実行しておくと, asao のポート 10023 へアクセスすることにより, takatsu へ telnet できる

内部 LAN がプライベート・アドレスではなかったとしても, 多くのファイアウオールは原則としてパケットを通しません。 そのような場合に stone をファイアウオール上で走らせて パケットの中継を行うことにより, ファイアウオールを越えたアクセスが可能になります。

大手企業などでは, 複数のファイアウオールが設置されている場合が多いようです(図 5)。 このような場合でも, それぞれのファイアウオールで stone を走らせることが可能なら, stone を「飛び石」づたい*8 にして, 内部のホストにアクセスすることが可能になります。

複数のファイアオールを飛び石づたいに,外部から内部のマシンにアクセスできる
図 5 複数のファイアオールを飛び石づたいに,外部から内部のマシンにアクセスできる

stone が中継できるパケットは, telnet に限りません。 例えば, X プロトコルを中継すれば, ファイアウオールの外のマシンで走らせた X クライアントを, ファイアウオール内の X サーバーに表示させたり, 逆にファイアウオール内のマシンで走らせた X クライアントを, ファイアウオールの外の X サーバーに表示できます。

X クライアントを実行する外部のマシンのホスト名を「outer」, ファイアウオールを「fwall」, X サーバーである内部のマシンのホスト名を「inner」とすれば, まずファイアウオール上で次のように stone を走らせます。


stone inner:6000 6001 &

ポート 6000 番は, X サーバーのディスプレイ番号 0 に対応します。 以下同様に, ポート 6000+n 番は, ディスプレイ番号 n に対応します。 つまり, ファイアウオールの外のマシンで, 「DISPLAY」環境変数に「fwall:1」を設定して X クライアントを実行すれば, X サーバーの inner に表示されます。

ここでは, ディスプレイ番号 1 を中継しましたが, ファイアウオール上で X サーバーを実行していなければ (普通は実行しませんね), ディスプレイ番号 0 を使うこともできますし, 逆にディスプレイ番号 n まで使用済であれば, n+1 を使えば OK です。

stone を実行する際, 環境変数「DISPLAY」が設定済み(例えば「inner:0」)であれば, 引数を次のように省略して指定することも可能です。 引数「1」はディスプレイ番号「1」を意味します。


stone 1 &

さて, 任意のホストから X サーバーにアクセスできてしまうと, セキュリティ上かなり問題*9 なので, アクセス可能なホストを制限した方が良いでしょう。

ホスト outer からのみ接続を許可するには, 次のように stone を実行します。


stone inner:6000 6001 outer &

接続を許可したいホストは, 空白文字で区切ることにより複数指定できます。 また, IP アドレスが一定の範囲のすべてのホストからの接続を許可することもできます。 例えば, IP アドレスが「192.168.1.*(*は任意の数字) であるホストからの接続を許可する場合には, 「192.168.1.0/255.255.255.0」と指定します。

● UDPの中継

stone は UDP パケットを中継することもできます。 例えばファイアウオールの内側に NTP(ネットワーク・タイム・プロトコル)サーバーがなくても, ファイアウオールの fwall で stone を


stone outer:ntp/udp ntp/udp & *10

のように実行して外部の NTP サーバー outer へ中継させることにより, ntpdate コマンドで時計を合わせられるようになります。


ntpdate fwall
*6
筆者が運営する任意団体です。 個人で引いた OCN エコノミーの費用の一部を賄うために, さまざまなサービスを提供しています。 本連載では,この GCD でのサーバー構築, 運用法を例に挙げています。
*7
もちろん 10023 番でなくても未使用ポートであれば何番でも良いのですが, 覚えやすい番号の方がより良いでしょう。
*8
これが「stone」の名前の由来です。
*9
例えば, 画面に表示している文字などを盗み読みされたり, キーボードで打った文字列を盗聴されたりする危険があります。
*10
「ntp/udp」はUDPのポート123番です。

(stone の引数の書式)


banner 本稿は日経Linux 2000 年 8 月号に掲載された、 実践で学ぶ、一歩進んだサーバ構築・運用術, 第 5 回「stone (前編)」を日経BP 社の許可を得て転載したものです。

Copyright(C)2000 by 仙石浩明 <sengoku@gcd.org>
無断転載を禁じます

| home | up |

sengoku@gcd.org