Winsock Programmer's FAQ
第7章: 論説記事: ファイヤウォールとの付き合い方

ファイヤウォールとの付き合い方

Warren Young 著

ファイヤウォールはどこにでもあります。最近ではどこの会社の LAN でもインターネットに接続されていると思われますし、それらの会 社のほとんど全てにおいては、彼らの LAN を注意深く、何らかのファ イヤウォールの後ろに置いているでしょう。つまり、あなたの書いたク ライアントもしくはサーバは、いつの日か誰かがファイヤウォール越し に使おうとするに違いありません。数々の要因に依存して、これは何の 問題も無く動作することもあれば、これを動作させようとして数々の困 難にぶつかることもあるでしょう。この記事ではこれらの問題と、いく つかの対処方法について議論します。

プロトコルはファイヤウォールにどのように作用するか

ファイヤウォールを越えて動作させるために、できるだけトラブル を避けるようにするには、一本の単純な TCP ベースのプロトコルを使 うようにしたほうが良いです。つまりクライアントからサーバに接続し、 そのコネクション上でデータの送信および応答の受信を行って、終了し たらそのコネクションをクローズする、というものです。

ファイヤウォールで問題を引き起こすプロトコルの例として、FTPを 考えてみましょう。FTP は二つのコネクション、すなわち制御コネクショ ンとデータコネクションを持っています。制御コネクションは常に存在 していますが、データコネクションはサーバからクライアントにデータ を一括送信する必要が出てきたとき、例えばディレクトリのリスティン グやファイルの内容を転送するときにのみ張られます。

従来からある「アクティブ」モードでは、データコネクションを確 立するときは、サーバからクライアントに向かって接続し直します。こ のとき問題になるのは、クライアントはサーバに向かって、何番のポー ト番号でデータコネクションを listen しているかを伝えなくてはなら ないということです。クライアントがファイヤウォールの後ろにある場 合は、サーバはそのファイヤウォールマシンと接続していると思ってい るので、listen していないのにも関わらず、そのファイヤウォール上の ポートに対して接続しようとしてしまうのです。そしてサーバは接続を 拒否され、クライアントはサーバから接続されるのを永遠にじっと待ち つづけてしまうのです。

この問題には二つの解決法があります。一つ目はクライアント側で 「パッシブ」モードを使うことです。これは、データコネクションをサー バからクライアントに向かって張るのではなく、クライアントがサーバ に向かって接続する、というモードです。もう一つの解決法は、ファイ ヤウォール側で FTP プロトコルを理解するようにさせ、ファイヤウォー ルがFTPデータコネクションのポート番号を認識してファイヤウォール が利用できるポート番号に書き換え、そしてそのポートで listen する という方法です。FTPサーバがファイヤウォールに対して接続してきた ときは、ファイヤウォール内部のFTPクライアントと接続してデータの 中継を開始することができるわけです。

既知のプロトコルのクライアントを作っているのでない限り、でき るだけファイヤウォールがパケットを転送するためにあなたのプロトコ ルを知らなくても良いように作るべきです。RealAudio のクライアント は長年の間、ファイヤウォール内部にあると動作しませんでした。それ は Real Networks がそのプロトコルを独自に設計していたからです。 今日ではこれは問題ではなくなりましたが、ファイヤウォールベンダ達 にこのプロトコルをサポートしてもらえるようになるまでは「本当に」 年月がかかったのです。

マスカレード型ファイヤウォール内のクライアント

仮にあなたのクライアントが単純な単一のTCPコネクションベースの プロトコルを使っているとしましょう。しかしその先にはまだ問題が存 在しています。ファイヤウォールの種類によってはあなたのクライアン トに影響を与えることがあります。

クライアントプログラムの観点から見て、最も単純な種類のファイ ヤウォールはマスカレード型のファイヤウォールです。これらはファイ ヤウォール内部のホストから見ると、単純なインターネットへのゲート ウェイに見えます。

マスカレード型ファイヤウォールは、技術的な観点からみるとかな りトリッキーなものです。Internet 向けのパケットがマスカレード型 ファイヤウォールに入っていくと、外向きのパケットの内部IPアドレス とソースポート番号は、ファイヤウォールマシンのIPアドレスと新たに 割り当てられたポート番号に書き換えられます。そしてファイヤウォー ルは、このパケットを外のインターネットに投げて、その応答を待ちま す。応答が帰ってきたら、ファイヤウォールはその割り当てたポート番 号を認識し、そのポートとIPアドレスを「内部の」値に変換して、LAN 内にあるホストに向かって投げます。

もしあなたのプロトコルが単純なものであれば、あなたのプログラ ムはマスカレード型ファイヤウォールを超えて、特に問題なく動作する はずです。もし何か問題にぶつかるとすれば、ファイヤウォールが特定 のポート以外の外向きコネクションをブロックしている場合です。この 場合には、ファイヤウォール管理者に必要なポートを開けてもらうよう にお願いしなくてはなりません。これについては、以下の「ファイヤ ウォール、政治と偏執狂」の節でより詳細に議論しています。

SOCKS ファイヤウォール内のクライアント

ファイヤウォールがマスカレードを行っていないのであれば、SOCKS プロトコルを通し てクライアントにファイヤウォールを超えさせるようにすることもよく あります。SOCKS は、保護された内部ネットワーク上のクライアントプ ログラムが、内部ホストとファイヤウォール外のホストとの間の中継を 行うように、ファイヤウォールに要求できるようにするものです。

SOCKS バージョン4は「基本」プロトコルです。マスカレード型と SOCKS v4 の主な違いは、マスカレード型は透過的であるのに対し、 SOCKS はあなたのプログラムを、SOCKS にファイヤウォールを越えさせ る要求を行うように修正する必要があるということです(SOCKS v4 には 他にも、単純プレーンテキスト認証など、マスカレードが行わない機能 をいくつか持っていますが、これはあまり重要な問題ではありません)。

SOCKS バージョン5 はこれをベースに、UDPサポート、エンド・エン ド間の暗号化、セキュアなログインを追加したものです。後者二つの機 能は、SOCKS v4 やマスカレード型よりもずっと安全な通信を行うこと がができるので、非常に広く使われるようになってきています。ファイ ヤウォールを越えるために暗号化を要求するものはあまりありませんが、 SOCKS v4 ログインを要求するファイヤウォールは数多くあります。ファ イヤウォールを越えて rogue プログラムを実行させないためですね。

SOCKSについてさらに詳しくは、以下のリンクで見つけられるでしょ う。

NEC の SOCKSCap は、ほぼ全てのWinsock プログラムを、アプリケーショ ンへの修正を行うことなしに、SOCKS ファイヤウォールを越えて動作させるこ とができるようにするものです(他のベンダでもSOCKS化プログラムを提供して いるところがあります。またMicrosoft以外の Winsock スタックには SOCKS化 されているものもあります)。SOCKSCap の問題は、SOCKSCap の設定をユーザ が手で行う必要があることと、アプリケーションプログラムをSOCKS化プログ ラムを通して実行しなければならないことです。SOCKS プロトコルを あなたのプログラム内に実装したほうがよりユーザフレンドリーでしょう。

SOCKS によって、マスカレード型ファイヤウォールによって強制さ れる制限をいくつか回避することができます。例えば「リモート bind」、 つまりファイヤウォールに、あるポートを listen してもらい、そのコ ネクションをプログラムに渡してもらう、ということができるようにな ります。SOCKS v5 の UDP サポートも有用なことがあるでしょう。ただ し、SOCKS ファイヤウォールを持ってしても、設計上の制限が発生する ことがある、ということは忘れないでください。

「ファイヤウォール、政治と偏執狂」

技術系の人間はファイヤウォールのことを、技術的な問題に対する 技術的な解決方法としか見ていません。しかし実際は、ファイヤウォー ルとは政治的な構成物なのです。国境のように、組織の領土を侵入者か ら守るために存在しているものなのです。ファイヤウォールにどれだけ の透過性を持たせるかは、ファイヤウォールを制御している人たちの偏 執度レベルに依存します。今日のインターネットでは、偏執狂的になら ざるを得ないことがたくさん存在するからです。

多くのファイヤウォールでは、ごく僅かのポートを除いて全ての外 部コネクションをブロックするように設定されています。例えば、ポー ト番号 80、21、25(ウェブ、FTP、電子メール)のみの外部コネクション を許可するように設定されていることがあります。もしあなたの作った アプリケーションが、ファイヤウォールがブロックしているポートを使っ ているのであれば、ネットワーク管理者を説得して、彼らが管理す るファイヤウォールのポートを開けてもらわなくてはなりません。 ネットワーク管理者は彼らのファイヤウォールについて縄張り意識が非 常に強いことがよくあります。あなたの目的を達成するには、ある程度 政治的な策略を弄する必要が出てくるでしょう。

このようなサイトの管理者は、新たなセキュリティリスクが発見さ れたとき初めてにそのポートをブロックするのではなく、ケースバイケー スでポートを開けていくという方法をとった方が良いと考えています。 あなたはその管理者達を、自分のためのポートを開けるさせるように説 得しなければならないのです。私の提案は、あなたのプログラムは何を するもので、なぜそれが必要で、そして潜在的なリスクを分析した議論 を文書で用意しておくことです。この議論をでっちあげてごまかしては いけません。完全に正直に、オープンにすべきです。またアプリケーショ ンの有用性については分けて考えるべきです。管理者達にそのプログラ ムを使ってもらうよう納得させているのではないのですから、そのネッ トワークにいるユーザ達にとって便利なアプリケーションであると言う ことを示しましょう。これらのユーザからネットワーク管理者に直接掛 け合ってもらって後押ししてもらうのも良いです。

なぜ議論を文書にするのかって? それは一つにはプロ意識を示すた めでもあるし、一つにはあなたが直接管理者と話ができないかもしれな いということがあるし、もう一つにはそれによってあなたの考えが理路 整然と明確化されるからです。もし単に管理者を電話で呼び出して口頭 で議論しようとするだけでは、あなたは単なる議論好きだとい う印象を与えるだけでしょう。また、もし結局管理者と直接口頭で話す ことになったとしても、論拠を文書化しておくことは、申し立てを行う 際の参照用として手助けになるでしょう。

また、別の方策を提案する人もいます。どんなに制限の強いファイ ヤウォールであっても必ず開けているポートを使って、パケットを送出 するようにプログラムを変更する、という方法です。ある種のファイヤ ウォールでは、パケットの中身を調べてそれが正当なものであることを 確認するものもあるので、そのポートで通常使われているプロトコルの 中に自分のデータを隠蔽してしまうように提案する人もいます。具体例 としては、データを送出するために80番のポートを使って、HTTP パケッ トのペイロード領域に自分のプログラムのデータを入れてしまう、とい うことも可能です。

「政治」のたとえを用いれば、この方法は「密輸」みたいなもので す。この方法は、実世界の密輸と同じく大問題とされることがありえま す。これによって牢屋に入れられるとまでは言いませんが、あなたのプ ログラムに対して敵対心を持たれる可能性はあります。ネットワーク管 理者という連中は、彼らに迷惑がかかるプログラムに対しては、一致団 結して禁止するような連中なのです。

ファイヤウォールの内側のサーバ

例えばあなたがサーバプログラムを書いたとしましょう。特に問題 なく動いていましたが、あるとき、クライアントが別のファイヤウォー ルの中にあるのに、ファイヤウォール越しに使おうとする人が出てきま した。こういう状況は、サーバがどこかの LAN 上で動いているのに、 広大なインターネットを越えてそのサーバにアクセスしたいというとき によく起こる状況です。

最も簡単な解決法はそのサーバをファイヤウォールの外側に移すこ とですが、ほとんどのネットワーク管理者はものすごく嫌がるでしょう。 よくある理由としては、

  1. 大部分のユーザはファイヤウォールの内側にいる。外側の ユーザは例外であり、ルールに則っていない。
  2. ファイヤウォールの設定で、ファイヤウォールの外側には 何も置くことができない。
  3. ファイヤウォールは、会社と契約しているISPといった別 の組織により管理されていて、彼らがファイヤウォールの外側 にサーバを設置することを許可してくれない。
  4. サーバをファイヤウォールの内側に設置できれば、ファイ ヤウォールもそのサーバへのアクセスを制御することができる。 これは、あなたのサーバを巨大で邪悪なインターネットから守 るための、もう一つの防護壁なのである。
  5. どうしても必要なもの以外は、外部に対してサービスを公 開するべきでないということは自明である。ネットワーク管理 者によっては、あなたがどんな論点を持ち出そうとも、それが いかに論理的であろうとも、上記の論拠を頑固に持ち出す人も いるだろう。

このような状況に陥った場合の解決法として、ファイヤウォール管 理者に「ネットワークアドレス変換」(NAT)を設定してもらうという方 法もあります。NAT はいくつかの関連している技術を指す用語ですが、 サーバをファイヤウォールの外側に見えるようにするためには、ポート フォワーディングとアドレスフォワーディングの二つがあります。

NATを理解するために、次の LAN 構成を考えてみましょう。LAN内部 のホストは、プライベートIPアドレスブロック 10.x.x.x を使っている ものとします。あなたのサーバを動作させているホストは内部アドレス 10.1.2.3 を持っているとしましょう。あなたの組織は、ISPからグロー バルなIPサブネット 123.4.5.{1-15} を割り当てられているとします。 ファイヤウォールは少なくとも二つのアドレスを持ちます。例えば外向 けに 123.4.5.1 、内向けに 10.1.1.1 としましょう。

上記の二つの方法のうち、アドレスフォワーディングは単純ですが リスクもより大きいものです。アドレスフォワーディングを上記の例の LANにおいて設定するためには、ファイヤウォールはあなたのサーバに 123.4.5.2 を割り当てる、ということを行います。このアドレスに対す る要求が入ってくると、宛先アドレスをこっそりと 10.1.2.3 に、発信 元アドレスを 10.1.1.1 に変換してから、そのパケットをLANの内側に あるあなたのサーバへと渡します。サーバが応答を返すときは、 10.1.1.1 のファイヤウォールに向かって応答します。ファイヤウォー ルは応答パケットを受け取り、発信元アドレスを 123.4.5.2 に、宛先 アドレスを最初の要求を行ったホストのアドレスに変換します。そして パケットをインターネット側に送り出し、ルータによってクライアント へと応答が返っていくわけです。

このアドレス変換の問題点は、もしあなたのサーバホストが何らか のセキュリティホールを持っている場合、ファイヤウォールは、外部の 何者かがこのセキュリティホールを通して侵入することを許してしまう のです。あなたのサーバに侵入されてしまうということは、実質的に内 部LANに侵入されたと同じことになり、ファイヤウォールによる保護が 全く意味がなくなってしまいます。

より安全な NAT 技術はポート変換です。例えばあなたのサーバがポー ト番号 1234 を使っているとしましょう。ファイヤウォールにおいてポー ト変換を設定したとすると、ファイヤウォールはその番号でパケットを listen し、ファイヤウォール内にあるあなたのサーバに転送し始めま す。外部の世界には一つのポートしか公開していないので、こちらの方 がより安全です。

アドレス変換とポート変換は組み合わされることもあります。例え ばファイヤウォールには利用できる外部IPアドレスが一つしかなく、同 じポートを使うサーバがLANの中にいくつか存在しているという場合が あります。ファイヤウォールのNAT機能によっては、ポート番号2000か ら2007までのポートで listen し、それぞれのポートに入ってきたパケッ トをLAN内の別々のサーバの同じポート、例えばあなたのサーバであれ ば 1234 に変換する、ということが可能です。

これら全ての選択肢が全てのファイヤウォール上で利用できるわけ ではなく、またあったとしてもネットワーク管理者がこれらの機能の使 い方を知らないかもしれません。あるいは、単に管理者は、あなたのサー バをファイヤウォールの外側に見えるようにしたくないだけかもしれま せん。上記のクライアントの議論で述べた政治的問題のように、ファイ ヤウォール管理者が許可を与えてくれない限り、「認可された」ポート とプロトコル上に独自のプロトコルを便乗させたくなる誘惑に耐えなく てはならないのです。

結論

このレビューにおけるファイヤウォール技術、問題点、解決方法は 私の経験の範囲のものです。もしあなたが他の種類のファイヤウォール や、他のファイヤウォールを越えるための問題点にぶつかったら、その 問題の内容を添えて私にお 知らせください。この記事においてその問題を回避するための情報 を追加するよう努力します。

Copyright © 2000 by Warren Young. All rights reserved.


<< プロセス間でのソケットの受け渡し Winsock for Non-Windows Systems >>
Last modified: $Id: firewalls.html,v 1.5 2002/11/09 20:40:33 ksk Exp $ Go to the original FAQ page
< Go to the main FAQ page << Go to the Home Page