Firewalling and Proxy Server HOWTO Mark Grennan, markg@netplus.net v0.4, 8 November 1996 こじまみつひろ isle@st.rim.or.jp(1997/03/26) この文書では Linux でファイアウォールを使う際の基本的な設定について解 説し、Linux を使った PC でパケットフィルタリングとプロキシファイアウォ ールを使う際の設定について多少なりとも詳しい説明を行います。この文書 のHTML版は http://okcforum.org/~markg/Firewall-HOWTO.htmlにあります。 ______________________________________________________________________ 目次 1. はじめに 1.1 フィードバック 1.2 責任の放棄(disclaimer) 1.3 Copyright(著作権表示) 1.4 なぜこれを書いたのか 1.5 やるべきこと 1.6 さらに知りたい人は 2. ファイアウォールとは 2.1 ファイアウォールの種類 2.1.1 IP フィルタリングファイアウォール 2.1.2 プロキシ(代理)サーバ 3. ファイアウォールの設定 3.1 必要なハードウェア 4. ファイアウォール用ソフトウェア 4.1 入手可能なソフトウェア 4.2 TIS ファイアウォールツールキットと SOCKS 5. Linux システムの準備 5.1 カーネルのコンパイル 5.2 2 枚のネットワークカードの設定 5.3 ネットワークアドレスの設定 5.4 ネットワークのテスト 5.5 ファイアウォールの強化 6. IP フィルタリングの設定(IPFWADM) 6.1 フィルタリングファイアウォールの欠点 7. TIS プロキシサーバーのインストール 7.1 ソフトウェアの入手 7.2 TIS FWTK のコンパイル 7.3 TIS FWTK のインストール 7.4 TIS FWTK の設定 7.4.1 netperm-table ファイル 7.4.2 inetd.conf ファイル 7.4.3 /etc/services ファイル 8. SOCKS プロキシサーバ 8.1 プロキシサーバのセットアップ 8.2 プロキシサーバの設定 8.2.1 アクセス許可ファイル 8.2.2 経路制御ファイル 8.3 プロキシサーバを使う 8.3.1 Unix 8.3.2 Trumpet Winsock を使った MS Windows 8.3.3 プロキシサーバと UDP パケット 8.4 プロキシサーバの欠点 9. より進んだ設定 9.1 セキリティを重視した大きなネットワーク 9.1.1 ネットワークの設定 9.1.2 プロキシサーバの設定 ______________________________________________________________________ 1. はじめに Firewall-HOWTO は元々 David Rudder が書きました。バ ージョンアップすることを快く許可してくれた彼に感謝します。 ファイアウォールはインターネットに安全に接続するための究極的な解決策と して、近年、ますます大きな名声を獲得しつつあります。大きな名声を得たも のの例に漏れず、その名声は誤解にもとづいています。この HOWTO ではファ イアウォールとは何か、どのように設定するのか、プロキシ(代理)サーバとは 何か、プロキシサーバの設定方法、この技術を使うためアプリケーションにつ いて解説します。 1.1. フィードバック あらゆる種類のフィードバックを歓迎します。どんな間違いでも、ぜひ教えて ください。 私は誤りを犯しがちな普通の人間です。どんなささいなことで も、間違いがあれば連絡してください。それを修正するのは最優先の課題で す。送ってもらった e-mail には返事をするつもりですが、最近忙しいので、 もし返事を書けなくても気にしないでください。 私の e-mail address は です。 [訳者の e-mail address は です。] 1.2. 責任の放棄(disclaimer) この文書に書いてあることに従った結果生じたいかなる損害にも責任を負いま せん。 この文書はファイアウォールとプロキシサーバがどのように動くかを 紹介するために書かれたものです。私はセキュリティの専門家でもないし、そ のふりをするつもりもありません。私は、普通の人より多少の本を読んで、少 しだけコンピュータが好きな人間に過ぎません.私は人々がファイアウォール やプロキシサーバについて理解するのを助けるためにこの文書を書いているだ けで、この文書の正確さに人生を賭けるようなつもりはありません。 1.3. Copyright(著作権表示) Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions. All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator. In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs. If you have any questions, please contact Mark Grennan at . 別途宣言されていない限り、Linux の HOWTO 文書はそれぞれの著者が著作権 を保持しています。この著作権表示が全てのコピーに添付される限り、Linux の HOWTO 文書は、どのような物理的、電気的な手段でも、全て、あるいは一 部分のみをコピーして再配布することが可能です。商業的な利用も可能です し、推奨しますが、そのような場合には連絡してくださることを期待します。 Linux HOWTO 文書からの翻訳や派生物、あるいは HOWTO 文書を集めたものは 全てこの著作権表示に従います。すなわち、HOWTO から派生した文書に対して この著作権表示以外の追加の制限を加えてはいけません。この規則については 一定の条件のもとで例外もあります; 詳細については後述する Linux HOWTO のコーディネータのアドレスまで問い合わせてください。 簡単に言うと、私たちはあらゆる可能なチャンネルを経由してこの文書が広く 普及することを願っています。しかしながら、私たちは HOWTO 文書を copyright で保護しており、HOWTO 文書を再配布する計画については連絡して くださることを期待しています。 質問があれば Mark Grennan までどうぞ。 [翻訳につい てはこじまみつひろまでお願いします。] 1.4. なぜこれを書いたのか ファイアウォールの設定方法に関する質問が過去一年間ほどの間に繰り返し comp.os.linux.* に投稿されていましたが、設定に必要な情報については見つ けにくい状態でした。この HOWTO の古いバージョンも重要な情報源でした が、いくつか欠けている部分がありました。David Rudder が書いたオリジナ ルの HOWTO を強化したこのバージョンで、誰もがファイアウォールを簡単に 設定できるようになることを望んでいます。 また、私自身、何かを Linux コミュニティに還元したいと思っていました。 1.5. やるべきこと o クライアント側の設定方法について。 o UDP を通す Linux 用のプロキシサーバを見つけること 1.6. さらに知りたい人は 以下の HOWTO や書籍が参考になるでしょう。 o NET-2 HOWTO o Ethernet HOWTO o Multiple Ethernet Mini HOWTO o Networking with Linux o PPP HOWTO o O'Reilly の "TCP/IP Network Administrator's Guide" o TIS ファイアウォール・ツールキットに付属の文書 Trusted Information System(TIS)のウェブページ (http://www.tis.com/)に はファイアウォールとそれに関連した話題についてのドキュメントが豊富に 揃っています。 私は現在、Secure Linux と言うセキュリティについてのプロジェクトに関 わっています。Secure Linuxのウェブページには、私が収集した、安全 なLinux システムを作るための情報や文書、プログラムの全てを登録していま す。興味があれば私に e-mail してください。 2. ファイアウォールとは ファイアウォール(防火壁)とはもともとは自動車業界の用語でした。車にとっ てのファイアウォールとは、エンジンと乗客を隔てる物理的な障壁でした。も し車のエンジンに火がついても、ファイアウォールが乗客を守り、ドライバは ファイアウォール越しにエンジンを制御することができました。 コンピュータの世界でのファイアウォールとは、プライベートなネットワーク を外部のネットワーク(一般的にはインターネット)から守るためのデバイスで す。 これ以降、ファイアウォールの役割を果しているコンピュータのホスト名を "firewall"とします。このホストは内部のプライベートなネットワークとイン ターネットの双方に接続されていなければなりません。しかし、内部のネット ワークからインターネットへは直接接続できないし、インターネットからも内 部のネットワークへ直接は接続できません。 内部のネットワークからインターネットに接続する場合、まず firewall に telnet で接続し、その後、firewall からインターネットに接続することにな ります。 ファイアウォールのもっとも簡単な形式はこのように 2 つのネットワークに 接続したマシンを設ける方法です。内部ネットワークのユーザの全てを信用し ているならば、2 つのネットワークに接続した Linux マシンをセットアップ して(IP forwarding/gatewaying は OFF にして!)、そこに全てのユーザのア カウントを作ればいいでしょう。内部のネットワークのユーザはこのマシンに ログインしてから telnet したり、FTP したり、メールを読んだり、等、あな たの設定した全てのサービスを亨受できるようになります。この設定では、内 部のネットワークにあるコンピュータのうち外の世界のことを知っているのは firewall だけです。内部ネットワークに接続した他のマシンではデフォルト ルートすら設定する必要はありません。 繰り返しますが、上記の設定のファイアウォールがうまく働くためには、内部 のユーザ全てがセキュリティに気を配り、自分のアカウントを安全に管理する 能力を持っていなければいけません。私はこの方法はお勧めしません。 2.1. ファイアウォールの種類 ファイアウォールには大きく分けて 2 つの種類があります。 1. IP(フィルタリング)ファイアウォール: 指定したパケット以外のパケット を通過させません。 2. プロキシサーバ: 専用のネットワーク接続を提供します。 2.1.1. IP フィルタリングファイアウォール IP フィルタリングタイプのファイアウォールはパケットレベルで働きます。 この種のファイアウォールは、それぞれのパケットに登録されている送り元の ポートや宛先のポート、パケットの種類についての情報に基づいて、パケット の流れを制御します。 このタイプのファイアウォールはきわめて安全ですが、有益なログを取る機能 に欠けています。内部のプライベートなシステムにアクセスさせないことは可 能ですが、システムの公開している部分に誰がアクセスしてきたのか、とか、 内部のネットワークから誰がインターネットに接続したのか、という記録を取 ることができません。 フィルタリングタイプのファイアウォールは、いい意味でも悪い意味でも完璧 なフィルタです。外部の誰かに内部のプライベートなサービスを提供しようと 思っても、特定個人のみに使用許可を与えるようなことはできず、外部の誰も がアクセスできるように設定するしかありません。 この種のパケットフィルタリングの機能は 1.3.x 以降のカーネルに組みこま れています。 2.1.2. プロキシ(代理)サーバ プロキシサーバはファイアウォール越しに間接的なインターネット接続を提供 します。いちばん分りやすい例は telnet の場合でしょう。プロキシサーバを 使えば、「いったんファイアウォールマシンにログインして、そこから再度外 部のマシンにアクセスする」という手順を自動的に行えるようになります。ク ライエントとなるソフトウェアがプロキシサーバに接続した場合、プロキシサ ーバは専用のクライエント(プロキシ)ソフトウェアを起動して、あなたが送ろ うとしているデータを目的地へ転送します。 プロキシサーバでは全てのやりとりを二重化しているので、それらの記録を取 ることも可能です。 プロキシサーバの利点は正しく設定すれば完全に安全なことです。プロキシサ ーバは誰も自由に通過させず、直接 IP をルーティングしません。 3. ファイアウォールの設定 3.1. 必要なハードウェア 今回の例では 66MHz の486-DX CPU にメモリ 16M、HDD に 500M の Linux パ ーティションを持つマシンを使います。このシステムは 2 枚のネットワーク カードを持ち、一枚は内部のプライベートな LAN に接続し、もう一つは「非 武装地帯(de-militarized zone 略して DMZ)」と呼ばれる Lan に接続してい るとします。DMZ にはインターネットに接続したルータがあるとします。 これは会社等で一般的に使われている設定でしょう。ネットワークカードは内 部の LAN 用の一枚のみで、インターネットとの接続は PPP を使う、という設 定も可能です。重要な点は、firewall には 2 つの IP アドレスが必要だ、と いうことです。 私の知り合いの多くは自宅に 2、3 台のコンピュータを接続した小さな LAN を持っています。このような場合、2 つのモデムを Linux マシン(多分古い 386 マシンだったりするのでしょう)に接続して、ロード・バランシング経由 で自宅内の LAN をインターネットに接続したくなるかもしれません。この設 定では、だれかがデータをダウンロードしようとした場合 2 つのモデムが速 度を 2 倍にしてくれるはずです :-) [訳注:EQL(ロード・バランシング):Linux カーネルに組みこまれている機能 で、2 つのシリアルポートを同時に使って 2 重に相手と接続しデータの転送 速度を倍増する方法。ただし、回線も 2 つ必要で接続先にもこの機能が無い と使用できない。(よく知らないけど、ISDN なら使える機能なのかも、、)] 4. ファイアウォール用ソフトウェア 4.1. 入手可能なソフトウェア (パケット)フィルタリングファイアウォールが必要ならば、Linux 本体と基本 的なネットワーク用パッケージだけで十分です。一般的なディストリビュー ションに入っていないかも知れないのは IP ファイアウォール管理ツール (ipfwadm)でしょう。 IPFWADMは http://www.xos.nl/linux/ipfwadm/ から入手できます。 プロキシサーバを設定したい場合、以下の示すパッケージのどちらかが必要で す。 1. SOCKS 2. TIS Firewall Toolkit(FWTK) 4.2. TIS ファイアウォールツールキットと SOCKS Trusted Information System(http://www.tis.com)はさまざまなファイアウォ ール関連のソフトウェアをリリースしています。それらのプログラムは基本的 に SOCKS と同じ機能を果しますが、デザイン哲学は違っています。 SOCKS で は一つのプログラムが全てのインターネットとのやりとりをカバーします が、TIS では firewall 越しに使いたいプログラムそれぞれについて専用のソ フトウェアを用意しています。 両者を比較するために、WWW と telnet について見てみることにしましょう。 SOCKS では設定ファイルとデーモンは一つだけです。これらの設定ファイルと デーモンで telnet と WWW を使うように設定しますが、telnet と WWW 以外 でも明示的に禁止しないサービスは利用できます。 一方、TIS ツールキットでは WWW と telnet それぞれに専用のデーモンを用 意し、設定ファイルもそれぞれに必要です。WWW と telnet を使えるようにし ても、それ以外のサービスは、明示的に使用できるように設定していない限り 使えません。(talk のように)専用のデーモンが無い場合、 "plug-in" デーモ ンを使いますが、この方法は他の方法に比べて柔軟性を欠き、設定も複雑で す。 これは大した違いではないように見えるかも知れませんが、根底にある設計思 想には大きな違いがあります。SOCKS は割とルーズな設定が可能です。きちん と設定しない SOCKS サーバを経由して、内部の誰かが予想していないインタ ーネットサービスを利用するかも知れません。TIS ツールキットの場合、内部 の人間はシステム管理者が許可したサービス以外使用することはできません。 SOCKS の方が設定もコンパイルも簡単で、より自由な設定が可能です。TIS ツ ールキットは内部のユーザを規制したい場合はより安全です。双方とも外部か らのアクセスに対しては完全に安全です。 この文書では両者のインストールと設定法について説明します。 5. Linux システムの準備 5.1. カーネルのコンパイル インストールしたばかりの Linux から始めましょう(私は RedHat 3.0.3 を 使っており、以下に示す例もこのディストリビューションのものです)。使用 するソフトウェアが少ないほど穴も小さくてすみ、抜け穴 と/あるいは バグ によるセキュリティの問題も少なくてすみます。ファイアウォールマシンで動 かすアプリケーションは最小限にしましょう。 カーネルは安定したものを選びます。私は 2.0.14 を使いました。このドキュ メントもそのバージョンのカーネルに準じます。 Linux のカーネルを適切な設定でコンパイルします。この際には ``Kernel HOWTO'' や ``Ethernet HOWTO''、``NET-2 HOWTO'' などが有益でしょう。こ れらの HOWTO を読んだことが無ければ、ぜひ目を通すようにしてください。 以下に 'make config' の際に指定すべきネットワーク関連のオプションを示 します。 1. General setup の中の a. Networking Support を ON 2. Networking Options 中の a. Network firewalls を ON b. TCP/IP Networking を ON c. IP forwarding/gatewaying を OFF(IP フィルタリングをしたい場合は ON) d. IP Firewalling を ON e. IP firewall packet loggin を ON(必須ではないが、使う方がいい) f. IP: masquerading を OFF(masquerade についてはこの文書で扱いませ ん) g. IP: accounting を ON h. IP: tunneling を OFF i. IP: aliasing を OFF j. IP: PC/TCP compatibility mode を OFF k. IP: Reverse ARP を OFF l. Drop source routed frames を ON Network device support の中の a. Network device support を ON b. Dummy net driver support を ON c. Ethernet(10 or 100Mbit)を ON d. お使いのネットワークカード用のドライバを選んでください。 これらの設定を終えたらカーネルをコンパイルしてインストールし、再起動し てください。起動時のメッセージで複数枚のネットワークカードが認識されて いることを確認しておきましょう。もしうまくいかない場合、他の HOWTO を 参照してください。 5.2. 2 枚のネットワークカードの設定 2 枚のネットワークカードを装着している場合、/etc/lilo.conf ファイルで append 行に双方のカードの IRQ とアドレスを設定しなければなりません。手 元では以下のように設定しています。 append="ether=12,0x300,eth0 ether=15,0x340,eth1" 5.3. ネットワークアドレスの設定 さぁいよいよ佳境に入ってきました。まずいくつかネットワークの設定を決め なければなりません。内部のネットワークからインターネットへ直接アクセス することは認めないので、内部のネットワークに正式のアドレスを割りあてる 必要はありません。インターネットに接続しないプライベートなネットワーク 用のアドレスはあらかじめいくつか決められているので、それらのアドレスを 使うことにします。インターネットの世界ではアドレスは不足気味です。ま た、これらのプライベートアドレスを使う限り、間違ってインターネットにパ ケットを流してしまっても悪影響は出ないようになっているので、プライベー トネットワークにはこの種のアドレスを使いましょう。 今回の例では 192.168.2.xxx というクラス C のアドレスを使うことにしま す。 プロキシファイアウォールはインターネットとプライベートネットワークの双 方に接続し、両者の間でデータをやりとりします。 199.1.2.10 __________ 192.168.2.1 _ __ _ \ | | / _______________ | \/ \/ | \| Firewall |/ | | / Internet \--------| System |------------| Workstation/s | \_/\_/\_/\_/ |__________| |_______________| パケットフィルタリング式のファイアウォールの場合でもこれらのアドレスを 使うことが可能で、その際には IP masquerade を使うことになります。IP masquerade を使えば、ファイアウォールを越えてインターネットへ送られる パケットのアドレスは自動的に「本物の」 IP アドレス(199.1.2.10)に変換さ れてからインターネットに出て行きます。 インターネットに接続する側(外側)のネットワークカードには正式な IP アド レスを付けなければいけません。一方、内側のネットワークカードには 192.168.2.1 のアドレスを割りあてます。この 192.168.2.1 のアドレスが内 部のネットワークにおけるプロキシ/ゲートウェイの IP アドレスになりま す。これ以外の内部のネットワークに接続したマシンには 192.168.2.xxx と いうアドレスを与えます(192.168.2.2 から 192.168.2.254)。 私は RedHat Linux を使っていますので(誰かその他の設定例を下さい ;-)、 起動時のネットワークカードを設定するために /etc/sysconfig/network- scripts ディレクトリにある 'ifcfg-eth1' ファイルを修正しました。この ファイルは起動時に読みこまれ、ネットワークとルーティングテーブルを設定 するために使われます。 以下に私の ifcfg-eth1 を示します。 #!/bin/sh #>>>Device type: ethernet #>>>Variable declarations: DEVICE=eth1 IPADDR=192.168.2.1 NETMASK=255.255.255.0 NETWORK=192.168.2.0 BROADCAST=192.168.2.255 GATEWAY=199.1.2.10 ONBOOT=yes #>>>End variable declarations 同じディクレトリにあるスクリプトを使ってモデム経由でプロバイダに自動的 に接続することも可能です。そのためには ipup-ppp スクリプトを見てみてく ださい。 インターネットと接続する際にモデムを経由して PPP や SLIP で ISP と接続 する場合、外側(ISP 側)の IP アドレスはプロバイダから自動的に割りあてら れます。 5.4. ネットワークのテスト ifconfig と route コマンドでネットワークをチェックします。2 枚のネット ワークカードを使っている場合、ifconfig の出力は以下のようになるはずで す。 #ifconfig lo Link encap:Local Loopback inet addr:127.0.0.0 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:1620 errors:0 dropped:0 overruns:0 TX packets:1620 errors:0 dropped:0 overruns:0 eth0 Link encap:10Mbps Ethernet HWaddr 00:00:09:85:AC:55 inet addr:199.1.2.10 Bcast:199.1.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 TX packets:0 errors:0 dropped:0 overruns:0 Interrupt:12 Base address:0x310 eth1 Link encap:10Mbps Ethernet HWaddr 00:00:09:80:1E:D7 inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 TX packets:0 errors:0 dropped:0 overruns:0 Interrupt:15 Base address:0x350 経路制御表はこのようになるでしょう: #route -n Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface 199.1.2.0 * 255.255.255.0 U 1500 0 15 eth0 192.168.2.0 * 255.255.255.0 U 1500 0 0 eth1 127.0.0.0 * 255.0.0.0 U 3584 0 2 lo default 199.1.2.10 * UG 1500 0 72 eth0 注意: 199.1.2.0 がインターネット側のアドレスで 192.168.2.0 はプライベ ート側のアドレスです。 ここで firewall からインターネットへ ping してみます。テストには nic.ddn.mil を使いました。これは今でも良いテスト先ですが、以前ほどの信 頼性は無いようです。nic.ddn.mil が動いてない場合、別のインターネット上 のホストで試してみてください。それでもダメな場合は PPP が正しく設定で きていないのでしょう。``NET-2 HOWTO'' を読んで再度チェックしてみてくだ さい。 [国内では www.ntt.co.jp や www.iij.ad.jp あたりが妥当なテスト先でしょ う。] 次に firewall から内部の防御されたネットワーク内のホストへ ping してみ ます。内部のネットワーク上のホスト間では相互に ping できるはずです。も しダメな場合、``NET-2 HOWTO'' を読み直してネットワークの設定をチェック しましょう。 次に内部のネットワークから firewall の外部ネットワーク側のアドレスへ ping してみます(注意:外のアドレスとは、192.168.2.xxx と違う IP アドレ スです)。もし ping できるようならば IP Forwarding が無効になっていませ ん。そういう設定にしたいのか確認してください。IP Forwarding 機能を使う 場合、この文書の IP フィルタリングの節も参照してください。 次にファイアウォールの中(内部のネットワーク上のホスト)からインターネッ ト上のホストへ ping してみます。その際には firewall から ping で確認し たホスト(例えば nic.ddn.mil)を使うのがいいでしょう。IP Forwarding 機能 が無効になっていれば ping は通らないはずです。 IP forwarding を有効にしていて、内部のネットワークに(192.168.2.* とは 違う)「本物の」IP アドレスを付けているにも関わらず、内部からインター ネットへは ping できず、firewall のインターネット側からは ping できる ような場合、firewall の接続先のルータにこちらの内部のネットワークに関 する情報が正しく定義されていないのかも知れません(その設定は接続先のプ ロバイダの仕事かも知れません)。もちろん、内部のネットワークに 192.168.2.* のアドレスを付けている場合、外部からパケットを送ることは できません。 これで基本的な設定は完了しました。 5.5. ファイアウォールの強化 ファイアウォールを設定しているマシンで使わないサービスをそのままにして おくのはよくありません。「悪者」が firewall にアクセスして、それらを悪 用するかも知れないからです。 そのためにも使わないサービスは使用停止にしましょう。/etc/inetd.conf ファイルを見てください。このファイルが「スーバーサーバ」 inetd の設定 ファイルです。このファイルに様々なサービスを行なうデーモンとその起動方 法が記述されています。 netstat, systat, tftp, bootp, finger は忘れずに停止しましょう。サービ スを使用停止にするには、そのサービスの行頭に # を付け加えます。必要な 設定を終えたら、"kill -HUP "( は ined のプロセス番号)を実行 し、 inetd に HUP シグナルを送ります。このシグナルを受けた inetd は設 定ファイル(etc/inetd.conf/)を読みこみ直して再起動します。 inetd を再起動したら、firewall の 15 番のポートへ telnet してみます (telnet firewall 15)。 netstat の出力が見えるようならば inetd が正しく 再起動されていません。 6. IP フィルタリングの設定(IPFWADM) IPフィルタリングタイプのファイアウォールを設定する場合、まず最初にカー ネルに IP Forwarding 機能を組みこんで再構築し、パケットがきちんと転送 されていることを確認しておきます。Linux の IP Forwarding 機能はデフォ ルトでは有効になっているので、経路制御表を正しく設定していればネットワ ークの内でも外でも自由に接続できるはずです。 しかし、ここではファイアウォールを設定しようとしていますので、この状態 から使える機能を制限していくことにします。 私のシステムではさまざまなスクリプトでファイアウォールの forwarding の 設定と accounting の設定を行なっています。これらのスクリプトは /etc/rc.d/ から起動時に呼び出すようにしています。 デフォルトでは Linux の IP Forwarding は全てのパケットを forward する ようになっています。そのため、ファイアウォールを設定するためのスクリプ トでは、まず全ての forward を禁止して、以前に設定された forwarding ル ールを全て消去する必要があります。このスクリプトがその機能を果します。 # # setup IP packet Accounting and Forwarding # # Forwarding # # By default DENY all services ipfwadm -F -p deny # Flush all commands ipfwadm -F -f ipfwadm -I -f ipfwadm -O -f これで完璧なファイアウォールになりました。どんなパケットもこのホストを 通過できません。もちろん、必要なサービスはファイアウォールを通過させる 必要があります。そのためには以下に示すスクリプトが参考になるでしょう。 # 外部からの e-mail が自分のメールサーバへ届くことを許可する ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 192.1.2.10 25 # 外部のメールサーバへ接続を許可する ipfwadm -F -a accept -b -P tcp -S 196.1.2.10 25 -D 0.0.0.0/0 1024:65535 [オリジナルではこうなっていますが、訳者は、この部分の設定は ipfwadm -F -b a accept -b -P tcp -S 192.1.2.10 1024:65535 -D 0.0.0.0/0 25 だと思 います。] # 外部からの Web サーバへの接続を許可する /sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 196.1.2.11 80 # 外部の Web サーバへの接続を許可する /sbin/ipfwadm -F -a accept -b -P tcp -S 196.1.2.* 80 -D 0.0.0.0/0 1024:65535 # DNS のやりとりを許可する /sbin/ipfwadm -F -a accept -b -P udp -S 0.0.0.0/0 53 -D 196.1.2.0/24 ファイアウォールを通過するデータに興味がある場合、次のスクリプトがパ ケットの記録を取るために使えます。必要に応じて記録するアドレスを増す か、システム全体の記録を取るようにしてください。 # 現在のアカウントルールを消去 ipfwadm -A -f # 新しくアカウントを開始 /sbin/ipfwadm -A -f /sbin/ipfwadm -A out -i -S 196.1.2.0/24 -D 0.0.0.0/0 /sbin/ipfwadm -A out -i -S 0.0.0.0/0 -D 196.1.2.0/24 /sbin/ipfwadm -A in -i -S 196.1.2.0/24 -D 0.0.0.0/0 /sbin/ipfwadm -A in -i -S 0.0.0.0/0 -D 196.1.2.0/24 フィルタリングファイアウォールを使う場合はこれで充分です。楽しんでくだ さい :-) 6.1. フィルタリングファイアウォールの欠点 フィルタリング式のファイアウォールの欠点は、インターネットから内部の ネットワークへアクセスできないことです。フィルタリング式のファイアウォ ールではフィルタを通過できるように設定したサービスしかファイアウォール 越しに使うことができません。プロキシサーバを使えば、外部ユーザはファイ アウォールマシンにログインしてから、アクセス可能な内部ネットワークのマ シンに自由にアクセスできるようになります。 新しいネットワーククライエントやネットワークサービスは毎日のように開発 されています。それらのサービスを使う際には、それらのサービスをコントロ ールするための新しい方法を考える必要があります。 7. TIS プロキシサーバーのインストール 7.1. ソフトウェアの入手 TIS FWTK(FireWall ToolKit)は ftp://ftp.tis.com/ から入手できます。 私と同じ失敗をしないように、TIS からファイルを ftp する際には、まず README ファイルを読んでください。TIS fwtk はサーバの隠しディレクトリに 収めてあり、入手するためには fwtk-request@tis.com に本文に SEND とだけ 書いたメールを送る必要があります。サブジェクト行は不要です。メールを送 ると自動的に(12 時間有効な)ソースコードをダウンロードするためのディレ クトリ名が返信されます。 この HOWTO を書いている時点では TIS は FWTK バージョン 2.0(beta)をリリ ースしています。このバージョンは(少しの例外をのぞいて)ちゃんとコンパイ ルでき、手元ではきちんと動いています。以下の説明もこのバージョンを元に します。彼らが最終版をリリースすれば、この HOWTO も update します。 FWTK をインストールするためには fwtk-2.0 というディレクトリを /usr/src ディレクトリに作ります。FWTKのソースコード(fwtk-2.0.tar.gz)をこのディ レクトリに移して展開してください(tar zxf fwtk-2.0.tar.gz)。 FWTK には WWW の SSL をサポートする機能はありませんが、Jean-Christophe Touvet が addon ソフトを書いています。このソフトは ftp://ftp.edelweb.fr/pub/contrib/fwtk/ssl-gw.tar.Z から入手できます。 ただし Touvet はこのコードをサポートしていません。 私は Eric Wedel 作の Netscape secure news servers 用に改造したバージョ ンを使っています。これは ftp://mdi.meridian-data.com/pub/tis.fwtk/ssl- gw/ssl-gw2.tar.Z から入手できます。 以下の例では Eric Wedel 版を使います。 このプログラムをインストールするには、単に /usr/src/fwtk-2.0 の下に ssl-gw ディレクトリを作り、ファイルをそこに置くだけです。 私がコンパイルした時はいくつかの修正が必要でした。 最初の修正は ssl-gw.c に行います。ssl-gw.c では必要なファイルをインク ルードし忘れていました。 #if defined(__linux) #include #endif 二つめの修正は、ssl-gw に Makefile が無いことでした。私は他の gateway ディレクトリにある Makefile をコピーして、gateway 名を ssl-gw に変更す ることでしのぎました。 7.2. TIS FWTK のコンパイル FWTK のバージョン 2.0 は以前のバージョンに比べてずっと簡単にコンパイル できるようになりましたが、BETA 版をきれいにコンパイルするにはまだいく つかの修正が必要でした。最終版までにこれらの修正が行なわれることを期待 しています。 修正するためには /usr/src/fwtk/fwtk ディレクトリに移動して、まず Makefile.config.linux を Makefile.config ファイルにコピーします。 FIXMAKE を動かしてはいけません。 インストラクションには FIXMAKE するよ うに書いてありますが、FIXMAKE すると、それぞれのディレクトリの Makefile が破壊されてしまいます。 私は fixmake を以下のように修正しました。問題は sed スクリプトがそれぞ れの Makefile の include 行に対して '.'と '' を付け加える処理の部分で した。以下のようにしておけば fixmake もちゃんと動きます。 sed 's/^include[ ]*\([^ ].*\)/include \1/' $name .proto > $name 次に Makefile.config ファイルを修正します。このファイルには 2 箇所の修 正が必要です。 付属のドキュメントの著者は自分のホームディレクトリにソースコードを置い ていますが、私たちの例では /usr/src でコンパイルしようとしていますの で、 FWTKSRCDIR を以下のように設定します。 FWTKSRCDIR=/usr/src/fwtk/fwtk 次に、Makefile.config では dbm を使うようになっていますが、いくつかの Linux システムでは gdbm データベースを使うので以下のように設定しまし た。私の環境は RedHat 3.0.3 です。 DBMLIB=-lgdbm 最後の修正は x-gw です。私の試した BETA バージョンには socket.c コード にバグがありました。修正するには、以下の行を削除してください。 #ifdef SCM_RIGHTS /* 4.3BSD Reno and later */ + sizeof(un_name->sun_len)+ 1 #endif ssl-gw が必要ならば、Makefile のディレクトリリストに ssl-gw のディレク トリも加えます。 DIRS= smap smapd netacl plug-gw ftp-gw tn-gw rlogin-gw http-gw x-gw ssl-gw これで make してください。 7.3. TIS FWTK のインストール インストールするには make install してください。 配布時の設定では /usr/local/etc にインストールされますが、これを別のよ り安全なディレクトリに移しても構いません(私はやっていませんが)。私はこ のディレクトリのパーミッションを 'chmod 700' にしました。 後は firewall の設定を行うだけです。 7.4. TIS FWTK の設定 いよいよ佳境に入ってきました。まず、インストールした新しいサービスにつ いてシステムに教え、新しい機能を設定するための表を作らなければいけませ ん。 ここで TIS FWTK のマニュアルを繰り返すつもりはありませんので、以下では 手元で動いた設定を示すと共に、私がぶつかった問題について説明し、どう やって正しい設定を見つけたかを述べます。 TIS FWTK を制御するためのファイルは以下の 3 種です。 o /etc/services o TIS FWTK がどのポートを使うかを指定します。 o /etc/inetd.conf o そのポートにアクセスがあった場合、とのプログラムを起動するか inetd に指示します。 o /usr/local/etc/netperm-table o FWTK に誰に何を許可するか指定します。 FWTK を機能させるためには以上のファイルを逆順に修正しなければいけませ ん。netperm-table や inetd.conf を正しく設定せずに services ファイルを 修正するとシステムが使用不能になる可能性があります。 7.4.1. netperm-table ファイル このファイルは TIS FWTK のサービスを誰が使えるかを指定します。 設定の 際には firewall の両側のネットワークのトラフィックを充分考慮してくださ い。今回はプライベートネットワークの外からアクセスするには自らを認証す るようにして、ネットワークの内側にいる人は自由に外部へアクセスできるよ うな設定にしましょう。 外部の人の認証用に firewall では authsrv というプログラムを使います。 このプログラムはユーザ ID とパスワードのデータベースを使います。 netperm-table の認証セクションはデータベースがどこにあって誰がアクセス できるかを指定します。 私はこの接続を制限する際に多少のトラブルを経験しました。以下に示す permit-hosts 行の '*' では誰でもアクセスできてしまいます。この行の正し い設定は authsrv: permit-hosts localhost でした。 # # Proxy configuration table # # Authentication server and client rules authsrv: database /usr/local/etc/fw-authdb authsrv: permit-hosts * authsrv: badsleep 1200 authsrv: nobogus true # Client Applications using the Authentication server *: authserver 127.0.0.1 114 データベースを初期化するには、su で root になって /usr/local/etc ディ レクトリで ./authsrv コマンドを起動して管理用のユーザレコードを作りま す。以下に例を示します。 ユーザやグループの追加方法については FWTK のドキュメントを読んでくださ い。 # # authsrv authsrv# list authsrv# adduser admin "Auth DB admin" ok - user added initially disabled authsrv# ena admin enabled authsrv# proto admin pass changed authsrv# pass admin "plugh" Password changed. authsrv# superwiz admin set wizard authsrv# list Report for users in database user group longname ok? proto last ------ ------ ------------------ ----- ------ ----- admin Auth DB admin ena passw never authsrv# display admin Report for user admin(Auth DB admin) Authentication protocol: password Flags: WIZARD authsrv# ^D EOT # telnet 用ゲートウェイ(tn-gw)が最も簡単なので、これから設定を始めましょ う。 以下に示す例では、内部のネットワーク上のホストからの telnet は認証無し で許可しています(permit-hosts 196.1.2.* -passok)。一方、その他のユーザ がプロキシサーバを使う場合はユーザ ID とパスワードが必要です (permit- hosts * -auth)。 もう一箇所 196.1.2.202 からのアクセスも認証なしで直接 firewall にアク セスできるようにしています。netacl-in.telnetd のある行がそのための指定 です。この行の詳細については後述します。 telnet のタイムアウトは短めにしておくべきです。 # telnet gateway rules: tn-gw: denial-msg /usr/local/etc/tn-deny.txt tn-gw: welcome-msg /usr/local/etc/tn-welcome.txt tn-gw: help-msg /usr/local/etc/tn-help.txt tn-gw: timeout 90 tn-gw: permit-hosts 196.1.2.* -passok -xok tn-gw: permit-hosts * -auth # Only the Administrator can telnet directly to the Firewall via Port 24 netacl-in.telnetd: permit-hosts 196.1.2.202 -exec /usr/sbin/in.telnetd rlogin など r- 系のコマンドも telnet と同じ設定になります。 # rlogin gateway rules: rlogin-gw: denial-msg /usr/local/etc/rlogin-deny.txt rlogin-gw: welcome-msg /usr/local/etc/rlogin-welcome.txt rlogin-gw: help-msg /usr/local/etc/rlogin-help.txt rlogin-gw: timeout 90 rlogin-gw: permit-hosts 196.1.2.* -passok -xok rlogin-gw: permit-hosts * -auth -xok # Only the Administrator can telnet directly to the Firewall via Port netacl-rlogind: permit-hosts 196.1.2.202 -exec /usr/libexec/rlogind -a FTP などで直接ファイアウォールに接続すべきではないので、ファイアウォー ルではFTP サーバを起動してはいけません。 繰り返しますが、以下の例の permit-hosts 行は内部のネットワークから誰で もインターネット上のホストへ FTP 接続できる一方で、その他のユーザには 認証を求めるという設定です。私は(-log {retr stor })行でやりとりした ファイルの記録をとるようにしています。 FTP の timeout の設定は接続状態が悪い場合などに接続を切るための時間と データをやりとりしないまま接続を開いている時間を制御するために設定して います。 # ftp gateway rules: ftp-gw: denial-msg /usr/local/etc/ftp-deny.txt ftp-gw: welcome-msg /usr/local/etc/ftp-welcome.txt ftp-gw: help-msg /usr/local/etc/ftp-help.txt ftp-gw: timeout 300 ftp-gw: permit-hosts 196.1.2.* -log { retr stor } ftp-gw: permit-hosts * -authall -log { retr stor } Web や gopher、ブラウザ経由の ftp などは http-gw が制御します。以下に 示す例の最初の 2 行で firewall ごしにやりとりした ftp と web の文書を 蓄えておくディレクトリを指定します。私はこれらのファイルをルートの所有 とし、ルートしかアクセスできないディレクトリに置きました。 Web の接続は短く制限すべきです。timeout の設定は反応の無い接続先を待つ 時間です。 # www and gopher gateway rules: http-gw: userid root http-gw: directory /jail http-gw: timeout 90 http-gw: default-httpd www.afs.net http-gw: hosts 196.1.2.* -log { read write ftp } http-gw: deny-hosts * ssl-gw は全てを通過させますので注意が必要です。以下の例では内部のネッ トワークの全てのホストが 127.0.0.* と 192.1.1.* 以外、加えてポート番号 の 443 から 563 の外部のネットワーク全てにアクセスできるようにしていま す。443 から 563 までが SSL が使うポートです。 # ssl gateway rules: ssl-gw: timeout 300 ssl-gw: hosts 196.1.2.* -dest { !127.0.0.* !192.1.1.* *:443:563 } ssl-gw: deny-hosts * 次に示す例が plug-gw を使って news サーバに接続するという場合です。こ の例では、内部のネットワークの誰でもが特定のマシンの news ポートにのみ 自由にアクセスできるようにしています。 3 行めは news サーバからのデータがファイアウォールを越えるためのもので す。 ユーザがニュースを読んでいる間、サーバと接続していることを仮定している ニュースリーダが多いので、ここでの timeout は長めに設定しておきます。 # NetNews Pluged gateway plug-gw: timeout 3600 plug-gw: port nntp 196.1.2.* -plug-to 199.5.175.22 -port nntp plug-gw: port nntp 199.5.175.22 -plug-to 196.1.2.* -port nntp finger のゲートウェイは簡単です。内部のネットワークのユーザはいったん firewall にログインしてから finger を使うようにしています。それ以外の 人が finger しようとしても finger.txt が送られるだけです。 # Enable finger service netacl-fingerd: permit-hosts 196.1.2.* -exec /usr/libexec/fingerd netacl-fingerd: permit-hosts * -exec /bin/cat /usr/local/etc/finger.txt Mail と X-windows 用のサービスは設定していないので例は示しません。誰か うまく行く例をご存知の方は私まで e-mail で連絡してください。 7.4.2. inetd.conf ファイル 以下に /etc/inetd.conf ファイルを示します。不要なサービスは全てコメン トアウトしています。何をコメントアウトして、ファイアウォール上で動かし てもいいサービスは何かを示すために全文を示します。 #echo stream tcp nowait root internal #echo dgram udp wait root internal #discard stream tcp nowait root internal #discard dgram udp wait root internal #daytime stream tcp nowait root internal #daytime dgram udp wait root internal #chargen stream tcp nowait root internal #chargen dgram udp wait root internal # FTP firewall gateway ftp-gw stream tcp nowait.400 root /usr/local/etc/ftp-gw ftp-gw # Telnet firewall gateway telnet stream tcp nowait root /usr/local/etc/tn-gw /usr/local/etc/tn-gw # local telnet services telnet-a stream tcp nowait root /usr/local/etc/netacl in.telnetd # Gopher firewall gateway gopher stream tcp nowait.400 root /usr/local/etc/http-gw /usr/local/etc/http-gw # WWW firewall gateway http stream tcp nowait.400 root /usr/local/etc/http-gw /usr/local/etc/http-gw # SSL firewall gateway ssl-gw stream tcp nowait root /usr/local/etc/ssl-gw ssl-gw # NetNews firewall proxy (using plug-gw) nntp stream tcp nowait root /usr/local/etc/plug-gw plug-gw nntp #nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd # SMTP (email)firewall gateway #smtp stream tcp nowait root /usr/local/etc/smap smap # # Shell, login, exec and talk are BSD protocols. # #shell stream tcp nowait root /usr/sbin/tcpd in.rshd #login stream tcp nowait root /usr/sbin/tcpd in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #talk dgram udp wait root /usr/sbin/tcpd in.talkd #ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd #dtalk stream tcp waut nobody /usr/sbin/tcpd in.dtalkd # # Pop and imap mail services et al # #pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d #imap stream tcp nowait root /usr/sbin/tcpd imapd # # The Internet UUCP service. # #uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l # # Tftp service is provided primarily for booting. Most sites # run this only on machines acting as "boot servers." Do not uncomment # this unless you *need* it. # #tftp dgram udp wait root /usr/sbin/tcpd in.tftpd #bootps dgram udp wait root /usr/sbin/tcpd bootpd # # Finger, systat and netstat give out user information which may be # valuable to potential "system crackers." Many sites choose to disable # some or all of these services to improve security. # # cfinger is for GNU finger, which is currently not in use in RHS Linux # finger stream tcp nowait root /usr/sbin/tcpd in.fingerd #cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd #systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx #netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet # # Time service is used for clock syncronization. # #time stream tcp nowait root /usr/sbin/tcpd in.timed #time dgram udp wait root /usr/sbin/tcpd in.timed # # Authentication # auth stream tcp wait root /usr/sbin/tcpd in.identd -w -t120 authsrv stream tcp nowait root /usr/local/etc/authsrv authsrv # # End of inetd.conf 7.4.3. /etc/services ファイル /etc/services が全ての始まりです。クライアントがファイアウォールの well known port(1024 以下のポート)に接続してきた時、〜例えば telnet な ら 23 番のポートに接続します〜、inetd デーモンがその接続を聞きつけて、 まず /etc/services ファイルで起動すべきサービス名を調べます。次に、そ の名前に従って /etc/inetd.conf ファイルで必要なプログラムを見つけて、 そのプログラムを起動することになります。 全てのサービスが /etc/services ファイルに含まれているわけではありませ ん。いくつかのサービスは自由にポートを割りあてることも可能です。私は、 管理者用の telnet(telnet-a)のポートを 24 番に割りあてましたが、これを 2323 にすることも可能です。telnet-a のポートを 24 番にしておけば、管理 者(あなた)が firewall にアクセスする際には 23 番ではなく 24 番のポート を使うようになります。加えて、私がしているように netperm-table ファイ ルを設定すれば、内部のネットワークからのみこの接続が可能になります。 telnet-a 24/tcp ftp-gw 21/tcp # this named changed auth 113/tcp ident # User Verification ssl-gw 443/tcp 8. SOCKS プロキシサーバ 8.1. プロキシサーバのセットアップ SOCKS プロキシサーバは ftp://sunsite.unc.edu/pub/Linux/system/Network/misc/socks-linux- src.tgz から入手できます。同じディレクトリに設定ファイルのサンプル "socks-conf"も置いてあります。入手したシステムを展開して、指示に従って make してください。私がコンパイルした際はいくつか問題が起きました。ま ず Makefile が正しいか確認することをお勧めします。 一つ重要なことがあります。プロキシサーバは /etc/inetd.conf にエントリ が必要です。以下の行を加えて、inetd がプロキシサーバを起動するように設 定してください。 socks stream tcp nowait nobody /usr/local/etc/sockd sockd 8.2. プロキシサーバの設定 SOCKS プログラムには 2 つの独立した設定ファイルが必要です。一つはアク セス許可を記述するもので、もう一つはリクエストを適切なプロキシサーバに 転送するための設定です。アクセス許可を記述したファイルはサーバに置かね ばなりません。リクエストを転送するためのファイルは SOCKS を使う全ての Un*x マシンに必要です。DOS と、多分 Macintosh も、独自のリクエスト転送 機能を持っているはずです。 8.2.1. アクセス許可ファイル socks4.2 Beta ではアクセス許可を記述するファイルは "sockd.conf"です。 このファイルには最低でも permit(許可)と deny(拒否)の 2 行が必要です。 各行は以下のような 3 つのエントリを持ちます。 o 識別子(permit/deny) o IP アドレス o アドレスの修飾子 識別子は permit か deny のどちらかです。permit と deny の両方が必要で す。 IP アドレスは 4 バイトの一般に使う IP アドレスの記述法で記述します。こ れは 192.168.2.0 のような形式です。 アドレスの修飾子も普通に使う 4 バイトの IP アドレスの書式になり、この 指定がネットマスクのように使われます。この数字を 32 ビットの 1 か 0 の マスクと考えた場合に 1 の部分は IP アドレスフィールドで指定したアドレ スと一致しなければいけません。例えば、 permit 192.168.2.23 255.255.255.255 とした場合、192.168.2.23 という IP アドレスのみを許可することになりま す。もし 192.168.2.3 という IP アドレスも許可したい場合は、 permit 192.168.2.0 255.255.255.0 と設定します。こうすれば 192.168.2.0 から 192.168.2.255 までのクラス C のアドレス全てからのアクセスを許可することになります。 こういう風に設定してはいけません。 permit 192.168.2.0 0.0.0.0 これでは全てのアドレスからの接続を許可することになるので意味がありませ ん。 まず許可したいアドレスを全て記述します。そして残りのアドレスは拒否する ように設定しましょう。192.168.2.xxx からのアクセスのみを許可する場合、 以下のような設定になります。 permit 192.168.2.0 255.255.255.0 deny 0.0.0.0 0.0.0.0 deny 行の最初の "0.0.0.0" に注意してください。アドレス修飾子で 0.0.0.0 を指定しているので、IP アドレスの設定には意味はなく、単にタイプしやす い番号を選んでいるだけです。 これらの設定を複数指定することも可能です。 SOCKS では特定のユーザのみに接続を許可したり拒否したりすることも可能で す。そのためには ident を用いた認証を組み合わせます。Trumpet Winsock も含めて、必ずしも全てのシステムが ident をサポートしているわけではな いので、ここではこれ以上触れません。ident を使う方法は socks に付属の ドキュメントに詳しく記載してあります。 8.2.2. 経路制御ファイル サービスリクエストの転送先を指定する経路制御ファイルは紛らわしいことに "socks.conf"という名前になっていますので、アクセス許可を設定す る"sockd.conf"と混同しないように注意してください。 経路制御ファイルは SOCKS のクライエントにいつ socks を使うべきかを指示 します。例えば、私たちのネットワークでは、192.168.2.3 のアドレスから 192.168.2.1 の firewall へ talk する場合、両者はイーサネットで直結され ていますので socks を使う必要はありません。また、127.0.0.1 というルー プバックアドレスを使って自分自身に接続する場合も socks を使う必要はあ りません。経路制御ファイルにも 以下の 3 つのエントリがあります。 o deny o direct o sockd 拒否(Deny)のエントリでリクエストを拒否する場合を指定します。このエント リには sockd.conf と同様に、識別子、アドレス、修飾子、という 3 つの欄 があります。通常、どういうリクエストを拒否するかの設定は(プロキシサー バに用意した) sockd.conf で処理するので、修飾子の欄は 0.0.0.0 にしてお きます。どこにも接続したくないのであれば、あらかじめここで設定すること も可能です。 direct エントリは socks を使わないアドレスを指定します。ここにはプロキ シーサーバを使わないで接続できる全てのアドレスを指定します。ここにも識 別子、アドレス、修飾子の 3 つの欄があります。私たちの例では以下のよう になります。 direct 192.168.2.0 255.255.255.0 この設定で内部のネットワーク上のホストへは全て直接接続できることになり ます。 sockd のエントリは socks サーバデーモンがあるホストのありかを指定しま す。書式は以下のようになります: sockd @= @= エントリに注意してください。ここにプロキシサーバの IP アドレスを列 挙します。私たちの例では一つのプロキシサーバしか使いませんが、負荷が高 い場合や冗長性を高めるために複数のプロキシサーバを列挙することも可能で す。 IP アドレスと修飾子の欄は他の例と同じで、どのアドレスへはどこを経由し て接続するかを指定します。 8.3. プロキシサーバを使う 8.3.1. Unix プロキシサーバごしにアプリケーションを使うためには、アプリケーションは あらかじめ「SOCKS 化」されていなければなりません。直接接続用とプロキシ サーバ経由用の2 つの telnet コマンドを用意しなければいけないかも知れま せん。SOCKS パッケージには、あらかじめ SOCKS 化されたいくつかのプログ ラムと共に、プログラムを SOCKS 化する方法について解説した文書が付属し ています。直接接続できる相手に SOCKS 化したコマンドを使おうとすれば SOCKS は自動的に直接接続用のコマンドを起動します。このため、全てのコマ ンドを rename して SOCK 化したバージョンで置き替えることも可能です。た とえば"finger"を"finger.orig"にし、 "telnet"を"telnet.orig"にする、な どです。元のコマンドがどこにあるかは include/socks.h で指定します。 自前の経路制御機能と socks 機能をもつプログラムもあります。例えば Netscape もその一つです。Netscape では Proxies オプションの SOCKS フィ ールドにサーバのアドレス(私たちの例では 192.168.2.1)を指定することでプ ロキシサーバを使うことが可能です。プロキシサーバをどのように扱うかに関 係なく、それぞれのアプリケーションごとの設定には多少悩む必要があるかも 知れません。 8.3.2. Trumpet Winsock を使った MS Windows Trumpet Winsock にはプロキシサーバ機能が組みこまれています。 "setup"メ ニュでサーバの IP アドレスを指定して、直接接続できるコンピュータも指定 します。こうしておけば Trumpet は自動的に外部へのパケットをサーバへ送 るようになります。 8.3.3. プロキシサーバと UDP パケット SOCKS パッケージは TCP 用になっており UDP のパケットは通しません。その ため多少不便になっています。talk や archie といったプログラムは UDP を 使っているため SOCKS 経由では使えません。Tom Fitzgerald 作の UDPrelay という UDP パケット用のプロキシサーバも ありますが、残念なことに執筆時点では Linux で使えませんでした。 8.4. プロキシサーバの欠点 プロキシサーバはきわめて安全な仕組みですが、プロキシサーバを使って限定 した IP アドレスにのみインターネットへのアクセスを許可する方法にはいく つもの欠点があります。プロキシサーバを使えば内部のネットワークから外部 へのアクセスはかなり自由に行いながら、外部からのアクセスを完全に遮断す ることが可能です。すなわち、talk や archie といった接続、あるいは内部 のコンピュータへ送られたメールも通さないということです。これらはたいし た欠点ではないように思えるかも知れませんが、こういう風に考えてみてくだ さい。 o 書きかけのレポートをファイアウォール内部のコンピュータに置いてきた 場合、自宅から続きをやろうとしても、ファイアウォール内部のコンピュ ータには接続できません。まずファイアウォールマシンにログインするわ けですが、プロキシサーバにはどこからでもアクセスできるので、あなた 用のアカウントをファイアウォールマシンに作るわけにはいきません。 o あなたのお嬢さんが大学に行きました。彼女に e-mail で連絡したいと思 います。いくつかプライベートな話もあるので、直接あなたのマシンにメ ールを送ってもらいたいこともあるでしょう。でも、ファイアウォール内 部のマシンには直接メールは届きません。もちろん、システム管理者が勝 手にメールを読むことはないと信用してはいますが、それでもプライベー トな話題ですから。 o UDP パケットが通らないことはプロキシサーバの大きな欠点です。この欠 点はできるだけ早くなんとかしたいものです。 FTP もプロキシサーバにとっては問題です。ftp でgetするときや lsすると き、 FTP サーバは接続してきたマシンのソケットをオープンして、そこを経 由して情報を送ります。プロキシサーバはこれを許可しないので、FTP はきち んとうごきません。 プロキシサーバを経由すると接続は遅くなります。プロキシサーバにはかなり オーバヘッドがあるので、あらゆる種類の接続が遅くなります。 基本的に、インターネットに常時接続していても(公式な IP アドレスを持っ ていても)それほどセキュリティにこだわらないならばファイアウォールやプ ロキシサーバを使わないほうがいいでしょう。インターネットに常時接続して いなくて、それほどセキュリティにこだわらないという場合は Term やSlirp, TIA といったシリアル回線で IP 接続をエミュレートするソフトを使えばいい でしょう。Term はftp://sunsite.unc.eduから、Slirp は ftp://blitzen.canberra.edu.au/pub/slirp から、TIA は marketplace.comか らそれぞれ入手可能です。これらのパッケージはプロキシサーバを経由するよ りも速く、より多くのサービスが利用でき、インターネットから内部のネット ワークへ接続することも可能です。プロキシサーバは、内部のネットワーク上 に多数のホストがあって、それぞれのホストからインターネットへ接続したい が、必要な設定は一箇所にまとめて可能な限り少くしたい、という場合に適し ています。 9. より進んだ設定 この文書を終える前に、もう一つの設定をお見せしましょう。今までに紹介し てきた例で大部分の人には十分だと思いますが、より複雑な設定を紹介するこ とで、いくつかの疑問に答えることもできるでしょう。今までの話で疑問点が あったり、プロキシサーバやファイアウォールのより複雑な設定に興味がある 人は読んでみてください。 9.1. セキリティを重視した大きなネットワーク 例えば、あなたは millisha のリーダで、自分のサイトをネットワーク化した いと考えているとします。あなたの手元には 50 台のコンピュータがあり、5 bits のサブネットで区切られた 32の IP アドレスが割りあてられています。 あなたは支持者のレベルに従って違うこと教えているので、ネットワークにも 複数のアクセスレベルを用意して、特定の部分を隠しておく必要があります。 レベルは以下のように設定します。 1. 外部レベル。このレベルは誰にでも見えるレベルです。このレベルで新し い志願者をさまざまな手法を用いて勧誘しましょう。 2. 軍団レベル。外部レベルをクリアした人のレベルです。このレベルの人々 には政府の邪悪さや爆弾の作り方を教えています。 3. 傭兵レベル。このレベルの人々にのみ真の計画が教えられています。この レベルの人々にこそ、どのように第三世界の政府が世界を乗っ取ろうとし ているか、ニュート・ギングリッチやオクラホマシティ、芝の手入れをす る器具などを用いた作戦、エリア 51 のハンガーに何が隠してあるのか、 といったあらゆる秘密が明かされています。 9.1.1. ネットワークの設定 IP アドレスは以下のように割りあてます: o 192.168.2.255 はブロードキャストアドレスで使用できません。 o 用意された 32 の IP アドレスのうち 23 はインターネットに接続可能 な23 台のマシンに割りあてます。 [ 訳注:23 という数字は一部の人にとって神秘的な意味を持つ数字だそう です。] o 余分の IP アドレスを一つ、そのネットワーク上の linux マシンに割りあ てます。 o もう一つ余分の IP アドレスをそのネットワーク上の linux マシンに割り あてます。 o 2 つの IP アドレスをルータに割りあてます。 o 残りの 4 つのIP アドレスには paul, ringo, john, george というドメイ ン名を割りあてて、偽装工作を図ります。 o 2 つの隠されたネットワーク双方はプライベートアドレスである 192.168.2.xxx の IP を割りあてます。 次に隠された 2 つのネットワークをそれぞれ別の部屋に用意します。両者と も赤外線を使ったイーサネットで結ばれているので、部屋の外からはネットワ ークでつながっていることが分りません。幸いなことに赤外線イーサネットも 通常のイーサネットのように使える(と考えます)ので、専用の設定をする必要 はありません。 これらのネットワークはそれぞれ 1 つ余計に IP アドレスを与えた Linux マ シン一台ずつを経由して結ばれています。 2 つの隔離されたネットワークには一台のファイルサーバが用意されていま す。両者に同じファイルサーバを用意するというのも、高位の軍団によって世 界を支配する計画の一部です。ファイルサーバには 2 枚のイーサネットカー ドが用意され、「軍団」レベルのネットワークには192.168.2.17の IP アドレ スを、「傭兵」レベルのネットワークには192.168.2.23の IP アドレスを割り あてます。ファイルサーバマシンでは IP Forwarding は無効 (off)にしてお きます 隔離されたネットワークと接続している 2 台の Linux マシンの IP Forwarding も無効にしておきます。インターネットに接続しているルータ は、明示的に指示されないかぎり、 プライベートアドレスである 192.168.2.xxx 宛のパケットは通さないので、インターネットから隔離された 2 つのネットワークにパケットを送りこむことはできません。IP Forwarding を無効にしている理由は「軍団」ネットワークと「傭兵」ネットワーク間でパ ケットをやりとりしないためです。 NFS サーバ(ファイルサーバ)も、それぞれのネットワークに異なるファイルを 提供します。これはシンボリック・リンクを使えば、多少トリッキーな形です が、両者で共有できるファイルも含めて、簡単に実現できます。ファイルサー バにもう一枚のイーサネットカードを挿せば、このマシンは一台で 3 つの ネットワークに接続されることになります。 9.1.2. プロキシサーバの設定 さて、3つのレベルのネットワークはそれぞれの深遠な目的からインターネッ トを監視しようと考えています。そのためには、3つのネットワークそれぞれ からインターネットに接続できなければなりません。そのためにはプロキシサ ーバを用意する必要があります。「傭兵」レベルと「軍団」レベルのネットワ ークはファイアウォールの背後にありますので、ここにプロキシサーバを用意 しましょう。 この 2 つのネットワークの設定はよく似ており、両者とも同じ IP アドレス を割りあてています。もう少しややこしくするために別の条件を加えてみま しょう。 1. ファイルサーバ経由ではインターネットにアクセスできないようにしま す。ファイルサーバからインターネットに接続すると、ウィルスやその他 さまざまなものに汚染される可能性があります。 2. 「軍団」ネットワークからは World Wide Web にアクセスできないように します。彼らは修行中で、WWW が与えるような各種の情報は悪い影響を及 ぼします。 この場合、「軍団」ネットワーク用のプロキシサーバとなっている Linux マ シンの sockd.conf はこのようになります。 deny 192.168.2.17 255.255.255.255 一方、「傭兵」レベルのネットワークではこうです。 deny 192.168.2.23 255.255.255.255 「軍団」レベルのネットワークのプロキシサーバには WWW を禁止する設定も 追加します。 deny 0.0.0.0 0.0.0.0 eq 80 この設定は、あらゆるマシンからの http のポートである 80 番のポートへの アクセスは拒否する、という意味です。他のポートを利用したサービスは全て 利用でき、Web へのアクセスのみが禁止されます。 両者とも permit には以下の設定をします。 permit 192.168.2.0 255.255.255.0 この設定で、192.168.2.xxx のネットワーク上の全てのマシンは、既に禁止さ れているサービス(ファイルサーバへの接続と「軍団」ネットワークから Web へのアクセス)を除いてこのプロキシサーバを使うことが可能になります。 その結果、「軍団」ネットワークのプロキシサーバの sockd.conf はこのよう になります。 deny 192.168.2.17 255.255.255.255 deny 0.0.0.0 0.0.0.0 eq 80 permit 192.168.2.0 255.255.255.0 「傭兵」ネットワークのプロキシサーバの sockd.conf はこうです。 deny 192.168.2.23 255.255.255.255 permit 192.168.2.0 255.255.255.0 これで全ての設定が終了しました。「軍団」と「傭兵」のネットワークは適切 な程度に交りながらも分離されました。これでみんな幸せになるでしょう。 さぁ、世界の征服を始めましょう!