Firewall And Proxy Server HOWTO Mark Grennan, mark@grennan.com v0.83, August 21, 2000 日本語訳: JF Project (jf@linux.or.jp) v1.0.0j Sep. 22, 2001 この文書はファイアウォールの基礎を説明すると共に、 Linux ベースの システムでフィルタ及びプロキシファイアウォールを構築するための詳細な情報を、 幾つか紹介します。 この文書の HTML バージョンは http://www.grennan.com/Firewall-HOWTO.html にあります。 紹介

David Rudder さんがこの Firewall-HOWTO のオリジナルの文書を書きました。 4年前、そして今も作品を引き継ぐことを許してくれた彼に感謝します。 親切にも、この失読症の筆者を手伝ってくれた Ian Gough さんにも感謝します。 ファイアウォールは、今までインターネット上での究極のセキュリティと しての地位を得て来ました。 今日、ファイアウォールは殆どのネットワークデバイスの一部になって います。 他の最新の話題と同様、しばしば誤解されがちです。 この文書では、ファイアウォールの実体と、構築方法を見ていきます。 私はカーネル 2.2.14 と RedHat 6.1 をこの文書の作成に使っており、 それ故に文中の例はこのディストリビューションを元にしております。 もし、あなたのディストリビューションとの相違点がありましたら、 email をください。この howto を更新します。 フィードバック

どんなフィードバックでも歓迎します。 この文書の間違いを教えて ください!! 私は人間ですから間違いをしがちです。 何か間違いを見つけたら私に知らせてください。 全ての e-mail に返答したいのはやまやまなのですが、忙しいので、 返事をしなくても怒らないでください。 私の email アドレスは です。 責任放棄

時が経ちました。 この部分は以前は、``私はセキュリティーのエキスパートではなく、また、 そうなる気もありません。'' となっていました。 今や、私はエキスパートになってしまいました. 私の公式の肩書はセキュリティーアナリストです。 もしかすると、私は、以前より少しはまともな事を書いているかもしれません。 でもわかって欲しいのは、この文書はあくまでも皆さんがこの分野を探求する 際の助けになることを目指しているものなのです。 私はこの文書の精度を上げる為に自分の人生を賭けるつもりはありません。 もし、あなたのファイアウォールの知識の全てがこの文書に基づくもので あるならば、仕事をファイアウォールに賭けないでください。 私は、この文書に基づいた行動で負った全ての損害に対しての責任を 負いません。 著作権

特に記述が無い限り、 Linux HOWTO 文書は、それぞれの著者に著作権が有ります。 それは私です。 Linux HOWTO 文書は、この著作権表示が入っているならば、一部または全部を 再編集し、電子的或は物理的な方法にかかわらず配布することができます (むしろ、それが望ましい)。 商用配布も歓迎されます。 もし、この文書を配布する場合は、私にメールで知らせてください。 (印刷物に自分の名があるのを見るのが好きなもので)。 翻訳や、派生した作品、Linux HOWTO 文書への集約はこの著作権表示に したがって行わなければなりません。 これは、配布物に新たな制限を追加してはいけないということです。 このルールに沿っていることを確信できる場合以外は、Linux HOWTO コーディネータに連絡を取ってください。 要するに、我々は可能な限りの手段を通じて、この情報が広く行き渡ることを 望んでいます。 しかし、我々は HOWTO ドキュメントの著作権を保持したいと共に、再配布の 計画を知らされたいとも思っています。 ただ、この著作権表記を残していれば、質問等なしに使ってかまいません。 何か疑問がありましたら、私にメールで知らせてください。(上記参照のこと) この文書を書く理由

数年前、オクラホマ州で&dquot;インターネット管理者&dquot;として 働いていたときに、ただで&dquot;州をインターネットにつなげてくれ&dquot;と 頼まれました。 (注意: そのときは、そのような肩書きはありませんでした。 私はただの単なる何でも屋だったのです。) これを実現する最良の方法は、可能な限りの多数のフリーソフトと ジャンクハードウェアを使うことでした。 Linux と、沢山の古い 486 マシンだけが、実現させるための道具でした。 Linux だけが希望でした。 当時 (そして今も) 、商用のファイアウォールはどこでも高価な物です。 私が見つけた、全てのファイアウォールの動作を詳述した文書は、その殆どが 最高機密でした。 その結果、ファイアウォールを自らの手で作り上げるのは殆ど不可能なのだと 思いました。 次の American Floral Services (AFS) では、ファイアウォールを 動かすことを頼まれ、その時点ではファイアウォールのソースコードが カーネルに組み込まれていました。 そして再び、ただで Linux を使ってファイアウォールを建てました。 六ヶ月後、ファイアウォールは完成し、この文書が更新されました。 今、あれから6年を経て、私は沢山のファイアウォールで仕事をしています。 例えば CheckPoint Firewall-1, Cisco Pix, そして沢山の ルータのファイアウォールと、全てのバージョンの Linux ベースの ファイアウォールです。 私は、 Linux が現在の最良のファイアウォールだと思います。 でも、その設定は最も複雑なものであるかもしれません。 更に読みたい人は

【訳注: 上記 URI は無効です。】

【訳注: 上記 URI は無効です。 現在は、 に変更されています。】

【訳注: "smurf" とは、 DoS 攻撃の一種を行う 攻撃プログラムの名前です。 詳しくは、 や、 等を参照してください。】 ファイアウォールを理解する

防火壁とは、延焼を避けることを意図した建築構造です。 建築物には煉瓦でできた防火壁があり、建築物の区画を完全に分離します。 車の防火壁は金属性の壁で、エンジンと乗客の室内とを区切ります。 インターネットのファイアウォールは、あなたのプライベート LAN に インターネットの地獄の炎を侵入させないことを意図しています。 或は、あなたの LAN 内のメンバーが、邪悪なインターネット上の誘惑に対して行う アクセスを禁止し、彼らを純粋且つ純潔に保つためのものです。 ;-) 初期のコンピュータファイアウォールは、二つの異なるネットワークに 接続されている、経路制御を行わない Unix ホストでした。 片方のネットワークカードはインターネットに接続され、もう片方は プライベート LAN に接続されていました。 プライベートネットワークからインターネットへ到達するには、 ファイアウォール (Unix) サーバにログオンしなければなりませんでした。 次にインターネットにアクセスする為にそのサーバのリソースを使います。 例えば、ファイアウォールシステム上の Netscape のブラウザを動作させて、 あなたのマシン上で動作する X Window System のディスプレイ上に表示できます。 ファイアウォール上で動作するブラウザは両方のネットワークにアクセス できます。 【訳注: このエピソードについては、例えば にてもかいま見ることができます。】 この類の「デュアルホームシステム (dual homed system)」 (2つのネットワークに接続されているシステム) は、あなたのネットワーク上の ユーザ全てが信頼できるなら、それは素晴らしいものです。 単純に Linux システムをセットアップして、インターネットへアクセスしたい 人全てにアカウントを発行すれば良いのですから。 この設定によって、あなたのプライベートネットワーク上にあって、 外の世界についてあらゆることを知るコンピュータは、ファイアウォールだけと なります。 プライベートネットワーク内の人は誰も自分自身のワークステーションへ インターネットから直接ダウンロードすることはできません。 最初にインターネットからファイアウォールへファイルをダウンロードしてから、 次にファイアウォールから自分自身のワークステーションへダウンロード しなければなりません。 最重要 - 全ての侵入の 99% は、攻撃対象のシステムに対してアカウントレベルの アクセスを得ることから始まります。 ですので、この種のファイアウォールはお薦めしません。 また、このファイアウォールは制限もきつ過ぎます。 ファイアウォールのポリシー

ファイアウォールマシンこそあなたが望むものの全てであると信じるべきではありません。 先ず、ポリシーを設定しましょう ファイアウォールは 2つの用途に使われます。 人 (ワーム / クラッカー) を締め出す為。 人 (従業員 / 子供達) を閉じ込める為。 私がファイアウォールに取り組んでいた頃、私が働いていた会社は彼らの ネットワークからクラッカーを締め出すことよりも、従業員をスパイ することにより興味を持っていたことにとても驚きました。 少なくとも私の州 (オクラホマ) では、雇用者は従業員に断りさえすれば、 彼らの電話の会話とインターネットの利用状況を監視する権利を持っていました。 独裁的だったのは政府ではなく、巨大企業だったのです。 誤解しないでください。 人々は勤務時間中は働いていて、遊んではいなかった筈です。 そして私は勤務倫理が蝕まれることを感じていました。 しかしながら、私はまた"管理者側"こそ彼らが設定したルールの最も悪質な 権利乱用者であることを監視していました。 通勤バスの経路を探す為にインターネットを使ったことで時間給労働者が 経営者に懲戒されたと同時に、まさにその懲戒を行った経営者が、見込みのある 顧客を連れていくための上等なレストランやナイトクラブを、 勤務時間中に何時間もネットサーフィンしていたのを見てきました。 勤務上の管理の為のスパイ行為は、 Monster.com で仕事探しをしている人を 見つけることでもありました。 でも、私は経営者が労働者の昇格条件に "エイズにかかっているかも知れない" かどうかをチェックする為に彼/彼女が健康管理サイトに訪れたことがあるか 否かを見ている時に、これは非倫理的であることに気付きました。 セキュリティの仕事は恐ろしいことになりかねません。 もしあなたがファイアウォールの管理者なら、あなたの背後にご注意あれ。 セキュリティポリシーの作成方法

私は今までセキュリティポリシーの作成方法に関する「ホントに仰々しい」 文書を幾つか見てきました。 そんなのを信じてはいけません。 セキュリティポリシーを作ることはとても単純なのです。

与えるものを書き出す あなたがサービスを提供する人のグループを書き出す 各々のグループが必要とするアクセスはどのサービスなのかを書き出す 各々のグループへのサービス毎に、どのように安全を確保するかを書き出す 他のかたちを取るアクセスは、全てセキュリティ違反である旨の宣言文を書く あなたのポリシーは時と共により複雑になるでしょうけれども、 何もかもをカバーしようとはしないでください。 単純で明解にすることを心がけてください。 ファイアウォールの種類

ファイアウォールには 2 種類あります。 フィルタリングファイアウォール - 選択したネットワークパケットを ブロックします。 プロキシサーバ (しばしばファイアウォールと呼ばれます) - ネットワークへの接続を提供します。 パケットフィルタリングファイアウォール

パケットフィルタリングは Linux カーネルに組み込まれるタイプの ファイアウォールです。 フィルタリングファイアウォールはネットワークレベルで動作します。 ファイアウォールルールが許可した時だけ、データはシステムから 出ていくことを許されます。 到達したパケットは、各々のパケットに含まれている種類、発信アドレス、 宛先アドレス、そしてポートの情報によってフィルタリングされます。 多くのネットワークルータはある程度のファイアウォールサービスを 実現する機能を持っています。 フィルタリングファイアウォールはそれらの類のルータと同等と考えられます。 このため、これを動作させるにあたって IP パケットの構造に対する 深い理解を必要とします。 解析・記録されるデータは非常に小さいので、フィルタリングファイアウォールは CPU 負荷を殆ど必要としませんし、ネットワークの遅延も殆ど生じません。 フィルタリングファイアウォールはパスワード制御を行いません。 ユーザは自分を認証させることはできません。 ユーザを識別する唯一の方法は、ワークステーションに割り当てられた IP アドレスです。 このことは DHCP (Dynamic IP assignments: 動的 IP 割り当て) の使用を 意図している場合に問題をひき起こす可能性があります。 ルールは IP アドレスを手がかりにしているので、新たな IP アドレスが 割り当てられる度毎にルールを調整しなければならなくなります。 私はこれを自動化する術を知りません。 フィルタリングファイアウォールはユーザにとってより透過的です。 ユーザはインターネットへアクセスする為に使用するアプリケーションに ルールを設定する必要がありません。 殆どのプロキシサーバでは設定の必要があります。 プロキシサーバ

プロキシは殆どの場合、外部へのトラフィックを制御または監視する為に 使われます。 要求されたデータをキャッシュするアプリケーションプロキシも存在します。 このことによって必要とされるネットワークのバンド幅を低下させ、 次のユーザに対して同じデータへのアクセスを低下させます。 それと共に何が転送されたのかを動かぬ証拠として提供します。 プロキシサーバには 2種類あります。 アプリケーションプロキシ - あなたの為に仕事をしてくれます。 SOCKS プロキシ - クロスワイヤポートです。 アプリケーションプロキシ

最も良い例は、ある人が他のコンピュータへ telnet 接続してから、その コンピュータから外界へ telnet 接続することです。 アプリケーションプロキシサーバは、この手順を自動化します。 あなたが外界へ telnet 接続すると、先ずクライアントはあなたをプロキシへ 送り出します。 プロキシは次にあなたが要求する (外界の) サーバへ接続し、データをあなたへ 返します。 プロキシサーバは全ての接続を処理するので、(あなたを含めて)アクセスする 全ての挙動をログ記録することができます。 HTTP (web) プロキシにおいては、あなたが閲覧するサイトの URL そのものが 含まれます。 FTP プロキシにおいては、あなたがダウンロードした全てのファイルが含まれます。 あなたが訪れるサイトから &dquot;不適当な&dquot; 言葉さえも排除したり、 ウィルススキャンもできます。 アプリケーションプロキシサーバはユーザ認証ができます。 外からの接続が行われる前に、サーバはユーザに対して最初にログインを催促します。 web ユーザにおいては、全てのサイトにおいてログインを要求されるように見えます。 SOCKS プロキシ

SOCKS サーバは旧型のスイッチボードに大変良く似ています。 これは単に、あなたの接続を別の外部の接続にシステム上で繋ぎ換えます。 殆どの SOCKS サーバは TCP タイプの接続でのみ動作します。 そしてフィルタリングファイアウォールと同様、ユーザ認証の機能は 装備されていません。 しかしながら、ユーザがどこに接続したのかを記録することはできます。 ファイアウォールのアーキテクチャ(基本設計)

ファイアウォールを用いてシステムを防御するようなネットワーク構成には、 様々な種類があります。 ルータを通じてインターネットへ専用線接続しているなら、 ルータを直接ファイアウォールシステムに接続してもいいでしょう。 あるいはハブをかませてファイアウォールの外側にサーバ群を置き、 それらにフルアクセスを提供するかたちでもいいでしょう。 ダイヤルアップアーキテクチャ

きっと読者は ISDN 回線のようなダイヤルアップサービスを利用している ことでしょう。 この場合、第三のネットワークカードを用いてフィルタリングされた DMZ 【訳注: Demilitarized Zone: 非武装化地帯】を作り出すのもいいかもしれません。 こうすればインターネットサービスを完全にコントロールできますし、 かつそれらを通常のネットワークからは切り離しておけます。 __________ _/\__/\_ | ファイア | __________________ |インター| | ウォール | (LAN) | | / ネット \----| システム |--(ハブ)--|ワークステーション| \_ _ _ _/ |__________| |__________________| \/ \/ \/ | (DMZ) (ハブ) 単一のルータのアーキテクチャ

あなたのマシンとインターネットの間にルータやケーブルモデムがある場合を 考えましょう。 そのルータがあなたの所有物なら、そのルータに強固なフィルタルールを 設定できるでしょう。 ルータが ISP の所有なら、必要なコントロールを行うことは多分できないでしょう。 ISP にフィルタを設定するように頼むことはできるかもしれません。 _________ __________ _/\__/\_ | ルータ | | ファイア | _______________ |インター| | 又は | (DMZ) | ウォール | (LAN) | ワーク | / ネット \----|ケーブル |--(ハブ)--| システム |--(ハブ)--| ステーション | \_ _ _ _/ | モデム | | |__________| |_______________| \/ \/ \/ |_________| | (外部) (サーバ) プロキシサーバを伴うファイアウォール

ネットワーク上のユーザのアクセスをモニタする必要があり、ネットワークの 規模が小さいならば、ファイアウォールにプロキシサーバを統合できます。 ISP によっては、これを行ってユーザのリストを作り、マーケティングを 行っている代理店に売っているようなこともあります。 __________ _/\__/\_ |プロキシ/ | ______________ |インター| | ファイア | (LAN) | ワーク | / ネット \----| ウォール |--(ハブ)--| ステーション | \_ _ _ _/ | システム | |______________| \/ \/ \/ |__________| プロキシサーバは、LAN にも好きなように設置できます。 この場合、そのプロキシサーバが提供しているサービスについては、 プロキシサーバだけがインターネットに接続できるようにするべきです。 こうすればユーザはプロキシサーバを通してしかインターネットに 接続できなくなります。 __________ _/\__/\_ | ファイア | _______________ |インター| | ウォール | (LAN) | ワーク | / ネット \----| システム |--(ハブ)--| ステーション | \_ _ _ _/ |__________| | |_______________| \/ \/ \/ | ______________ | | | +----|プロキシサーバ| |______________| 冗長なインターネットの設定

YAHOO や SlashDot のようなサービスを稼働させるつもりなら、冗長なルータと ファイアウォールを用いてシステムを構築したくなることでしょう。 (High Availability HowTo をご覧になってください。) 【訳注: Linux High Availability HOWTO は にあります。 High Availability は「高可用性」を意味します。】 1つの URL と複数の ISP から複数の web サーバへのアクセスを提供する、 round-robin DNS の技術を使えば、単一の URL に対するアクセスを 複数の web に捌くことができます。 そして High availability 技術を使っている ISP・ルータ・ファイアウォールを 複数用いることによって、 100% フル稼働のサービスを実現できます。 【訳注: round-robin とは、円形に署名した請願書を意味します。 ここでは DNS にある一つの URL に対して複数のサーバの対応関係を列挙し、 多数のクライアントの要求に対してそのリストを順番に使用することにより、 負荷分散を実現する手法です。 DNS の最後のエントリに到達したら最初に戻って使い回す有り様を round-robin という言葉で説明しています。】 _/\__/\_ _/\__/\_ | | | | / ISP #1 \______ (WAN)______/パートナー\ \_ _ _ _/ | (ハブ) \_ _ _ _/ \/ \/ \/ | ___|____ \/ \/ \/ __|___ |_______ | _/\__/\_ |_____ | |ファイア|| ______ | | | || (DMZ) |ウォール|| (LAN) | | / ISP #2 \--|ルータ||--(ハブ)--|システム||--(ハブ)--| WS/s | \_ _ _ _/ |______| | | (VPN) | | |______| \/ \/ \/ | |________| | ________ | (外部) | | | | ------ | (サーバ) (共有) +-----|プロキシ| | WS/s | | (サーバ) |________| | VPN |-+ |______| ネットワークはすぐにあなたの手に負えなくなるものです。 全ての接続を把握し続けてください。 ユーザがモデムを持っていて、そのモデムから LAN に侵入されたら、 LAN は危機に陥ります。 Linux フィルタリングファイアウォールを設定する

最低限必要なハードウェアの条件

フィルタリングファイアウォールに高級なハードウェアは不要です。 単純なルータに毛が生えたようなもので用が足ります。 必要なものは - 486DX2 66MHz と 32 MB メモリ 250MB のハードディスク (500MB 以上がお薦めです) ネットワーク接続 (LAN カード、シリアルポート、ワイヤレス?) モニタとキーボード 【訳注: 勿論、今時こんなロースペックなハードウェアを揃えるのは却って困難です。 現時点で入手できるハードウェアのうちで安価なもので十分でしょう。 但し、安定して稼働する実績を持つものが望まれることは言うまでもありません。 また、もしも中古品を購入するつもりなら、ハードディスクのような寿命の 短いものには注意してください。 それと、このリストにはビデオカードが抜けています。 OSのインストールの際には必要と思われるフロッピーディスクドライブや CD-ROM ドライブも抜けています。ご注意を。】 システムによってはシリアルポートコンソールを使用することで、モニタと キーボードを省略することも可能です。 【訳注: シリアルコンソールのサポートはカーネル 2.2 系以降となっています。】 膨大なトラフィックを捌くプロキシサーバを必要とするなら、入手し得る限りで 最強のハードウェアスペックが必要になります。 何故なら、ユーザが接続を行う度毎にプロセスが発生するからです。 50人以上同時に接続するような場合は、以下のようなスペックが必要かと 思います - ペンティアム II と 64MB メモリ 全てのログを記録する為の 2GB のハードディスク 2つのネットワークへの接続 モニタとキーボード 【訳注: この文書を翻訳している時点では、上記スペックはもう最強では ないですね。:-)】 ネットワーク接続はあらゆる種類が想定されます (NIC, ISDN, モデムの場合もあるかもしれません)。 必要なソフトウェア

カーネルの選択

フィルタリングファイアウォールを構築する為に特別なソフトウェアは要りません。 Linux が行います。 この文書を書いている時点で、私は RedHat 6.1 を使っています。 Linux に組み込みのファイアウォールは何度か変更されてきました。 古いカーネル(1.0.x もしくはそれより古いもの)を使っているなら、新しいものを 入手してください。 これら古いカーネルは にあるipfwadm を使っており、 もうサポートされていません。 【訳注: お使いのカーネルのバージョンと Ipfwadm のバージョンに注意してください。 を確認してください。】 2.2.13 以降を使っているなら、 で開発された ipchains を使用できます。 最新の 2.4 カーネルを使っているなら、より新しい仕様のファイアウォール ユーティリティがあります。 近いうちにそれについて書きます。 プロキシサーバを選択する

プロキシサーバの設定をしたいなら、次のパッケージのどれか一つが必要です。 Squid The TIS Firewall Toolkit (FWTK) SOCKS 【訳注: プロキシサーバプログラム DeleGate もあります。 DeleGate については次のところを参考にしてください。

Squid はとても素晴らしいパッケージで Linux の透過プロキシ (Transparent Proxy) 機能と共に動作します。 このサーバを設定する方法について書こうと思います。 この文書を書いている時点で、 と Trusted Information System's (TIS) は合併しています。 変更についての詳細情報に関する web サイトに注意しておきましょう。 一方、ツール類はまだ次のところにあります。 Trusted Information System は ファイアウォールの設定を簡単にするように 設計されたプログラム群を提供しています。 これらのツール類を使うことで、それぞれのサービス (WWW や telnet など) を 一つのデーモンに設定できます。 【訳注: Trusted Information System については次のところを参考にしてください。 Linux システムを準備する

できるだけ小さい規模で、Linux システムをインストールします。 私がインストールをするときは、まずサーバの設定を行い、次いで /etc/inetd.conf で不必要なサービスを外します。 更にセキュリティを高めたいなら、不必要なサービスは アンインストールしてしまいましょう。 殆どのディストリビューションは自分の目的に応じたカーネルに なっていませんから、自分の目的にあったカーネルに コンパイルしなければいけません。 ファイアウォール以外のコンピュータでコンパイルができるなら、 それが一番良い方法です。 C コンパイラなどのユーティリティをファイアウォールに インストールしてしまった場合は、カーネルの設定が完了した後で 削除しましょう。 カーネルのコンパイル

お使いになる予定の Linux ディストリビューションの最小限度のインストールから 始めてください。 ソフトウェアを減らせば、お使いのサーバでのセキュリティ問題の原因になる セキュリティホールやバックドア (不正な手段での侵入) 、或はバグなどが より少なくなります。 安定版のカーネルを入手してください。 私のシステムではカーネル 2.2.13 を使っています。 この文書はその環境での設定を基本にしました。 適切なオプションで Linux のカーネルをコンパイルしなければいけません。 カーネルの再構築をした経験がないなら、実行する前に Kernel HOWTO, Ethernet HOWTO, NET-2 HOWTO を読みましょう。 次にネットワーク関連の設定を示します。これが動作することは確認してあります。 いくつかの項目には ? という印をつけています。 このような設定を使うつもりなら、チェックをいれて選択してください。 カーネルの設定の為に、私は "make menuconfig" を使っています。 【訳注: 個々の項目については、Configure.help の日本語版も参考にしてください。 <*> Packet socket [ ] Kernel/User netlink socket [*] Network firewalls [ ] Socket Filtering <*> Unix domain sockets [*] TCP/IP networking [ ] IP: multicasting [*] IP: advanced router [ ] IP: kernel level autoconfiguration [*] IP: firewalling [?] IP: always defragment (required for masquerading) [?] IP: transparent proxy support [?] IP: masquerading --- Protocol-specific masquerading support will be built as modules. [?] IP: ICMP masquerading --- Protocol-specific masquerading support will be built as modules. [ ] IP: masquerading special modules support [*] IP: optimize as router not host < > IP: tunneling < > IP: GRE tunnels over IP [?] IP: aliasing support [*] IP: TCP syncookie support (not enabled per default) --- (it is safe to leave these untouched) < > IP: Reverse ARP [*] IP: Allow large windows (not recommended if <16Mb of memory) < > The IPv6 protocol (EXPERIMENTAL) --- < > The IPX protocol < > Appletalk DDP < > CCITT X.25 Packet Layer (EXPERIMENTAL) < > LAPB Data Link Driver (EXPERIMENTAL) [ ] Bridging (EXPERIMENTAL) [ ] 802.2 LLC (EXPERIMENTAL) < > Acorn Econet/AUN protocols (EXPERIMENTAL) < > WAN router [ ] Fast switching (read help!) [ ] Forwarding between high speed interfaces [ ] PU is too slow to handle full bandwidth QoS and/or fair queueing ---> 全ての設定をしてから、再コンパイルし、カーネルを再インストールし、 再起動します。 次のようなコマンドで行います - 1行のコマンドで全部を行うには、次のようにします。 make dep;make clean;make bzlilo;make modules;make modules_install;init 6 二枚のネットワークカードを設定する

コンピュータに二枚のネットワークカードを挿しているなら、IRQ と二枚の カードのアドレスを /etc/lilo.conf ファイルに append を使って明示的に 加えなければならない場合があります。 私の lilo の append 行は次のようになっています - append=&dquot;ether=12,0x300,eth0 ether=15,0x340,eth1&dquot; 【訳注: ネットワークカードの設定は、次のような文書も参考にしてください。

ネットワークアドレスの設定

さて、構築作業も面白いところにきています。 この文書では LAN を設定する方法について深くは説明しません。 この件についてのあなたの問題を解決するには、 Networking-HOWTO を 読んでください。 【訳注: Networking-HOWTO の日本語訳は、次のところにあります。 あなたの目的は、フィルタリングファイアウォールを通して、二つの ネットワーク接続を提供することです。 インターネット上に一つ(安全でない側)と LAN (閉じた側) に一つということに なります。 とにかく、いくつかのことを決定しなければなりません。 本物の IP 番号を使いますか、それとも LAN には適当な番号を指定しますか。 あなたの ISP から割り当てられる番号を使いますか、 それとも、静的な IP 番号を使いますか。 プライベートなネットワークにインターネットからのアクセスを 許可したくないわけですから、 &dquot;本物のアドレス&dquot; を使う必要は ありません。 プライベート LAN に対して適当なアドレスを振ることはできますが、 これはお勧めできません。 データが LAN からある経路を通って漏れてしまったら、どこかのシステムの ポートまで届いてしまいます。 プライベートネットワーク用に取りわけられている幾つかの インターネットアドレスの範囲があります。 192.168.1.xxx もこの中に入っていて、この文書ではこれを例に使います。 この数値を使う為には IP マスカレードを使う必要があります。 この方法で ファイアウォールはパケットをフォワードして、 インターネット上で &dquot;本物の&dquot; アドレスに変換します。 このようなルーティングできない IP アドレスを使えば、あなたのネットワークは より安全になります。 インターネットルータは、このようなプライベートアドレスのついたパケットを 通しません。 この件に関しては、次の文書を読んだほうがよいでしょう。 【訳注: IP Masquerade HOWTO の日本語訳は、次のところにあります。 24.94.1.123 __________ 192.168.1.1 _/\__/\_ \ | ファイア | / _______________ |インター| \| ウォール |/ | ワーク | / ネット \--------| システム |------------| ステーション | \_ _ _ _/ |__________| |_______________| \/ \/ \/ お使いのインターネット用ネットワークカードに割り当てるための &dquot;本物の&dquot; IP アドレスを持っていなければいけません。 このアドレスは、あなたに永続的に割り当てられたもの (静的な IP アドレス) でもいいですし、 PPP プロセスによるネットワークへの接続時に 割り当てられたものでもかまいません。 内側の IP 番号を割り当てます。 たとえば LAN カードに対して 192.168.1.1 のようにします。 これはゲートウェイアドレスになります。 保護されたネットワーク (LAN) にいる他の全てのマシンには、 192.168.1.xxx の範囲 (192.168.1.2 から 192.168.1.254 まで) の番号を 割り当てることができます。 私は RedHat Linux を使用しています。 起動時にネットワークを設定するため、私は /etc/sysconfig/network-scripts というディレクトリにある ifcfg-eth1 ファイルに記述を追加しています。 このディレクトリに ifcfg-ppp0 や ifcfg-tr0 というファイルもあるはずです。'ifcfg-' というファイルは、 RedHat で、起動時にネットワークデバイスを 設定し、使用可能にする為に使われています。 接続のタイプによって名前がつけられています。 これが ifcfg-eth1(二つ目のイーサネットカード)の例です - DEVICE=eth1 IPADDR=192.168.1.1 NETMASK=255.255.255.0 NETWORK=192.168.1.0 BROADCAST=192.168.1.255 GATEWAY=24.94.1.123 ONBOOT=yes ダイアルアップ接続をするつもりなら、ifcfg-ppp0 と chat-ppp0 を見なければ なりません。 これらは PPP 接続を制御します。 この場合の ifcfg ファイルは次のようになります - DEVICE=&dquot;ppp0&dquot; ONBOOT=&dquot;yes&dquot; USERCTL=&dquot;no&dquot; MODEMPORT=&dquot;/dev/modem&dquot; LINESPEED=&dquot;115200&dquot; PERSIST=&dquot;yes&dquot; DEFABORT=&dquot;yes&dquot; DEBUG=&dquot;yes&dquot; INITSTRING=&dquot;ATZ&dquot; DEFROUTE=&dquot;yes&dquot; HARDFLOWCTL=&dquot;yes&dquot; ESCAPECHARS=&dquot;no&dquot; PPPOPTIONS=&dquot;&dquot; PAPNAME=&dquot;LoginID&dquot; REMIP=&dquot;&dquot; NETMASK=&dquot;&dquot; IPADDR=&dquot;&dquot; MRU=&dquot;&dquot; MTU=&dquot;&dquot; DISCONNECTTIMEOUT=&dquot;&dquot; RETRYTIMEOUT=&dquot;5&dquot; BOOTPROTO=&dquot;none&dquot; ネットワークを試してみる

ifconfig と route コマンドを使ってみましょう。 二枚のネットワークカードを使っているなら、次のように表示されます。 #ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:3924 Metric:1 RX packets:1620 errors:0 dropped:0 overruns:0 TX packets:1620 errors:0 dropped:0 overruns:0 collisions:0 txqueuelan:0 eth0 Link encap:10Mbps Ethernet HWaddr 00:00:09:85:AC:55 inet addr:24.94.1.123 Bcast:24.94.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1000 errors:0 dropped:0 overruns:0 TX packets:1100 errors:0 dropped:0 overruns:0 collisions:0 txqueuelan:0 Interrupt:12 Base address:0x310 eth1 Link encap:10Mbps Ethernet HWaddr 00:00:09:80:1E:D7 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1110 errors:0 dropped:0 overruns:0 TX packets:1111 errors:0 dropped:0 overruns:0 collisions:0 txqueuelan:0 Interrupt:15 Base address:0x350 更に経路テーブルは次のようになります - #route -n Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface 24.94.1.0 * 255.255.255.0 U 1500 0 15 eth0 192.168.1.0 * 255.255.255.0 U 1500 0 0 eth1 127.0.0.0 * 255.0.0.0 U 3584 0 2 lo default 24.94.1.123 * UG 1500 0 72 eth0 注意 - 24.94.1.0 は、このファイアウォールのインターネット側で、 192.168.1.0 はプライベート( LAN )側になります。 LAN 上にある全てのコンピュータが、ファイアウォールシステムの内側の アドレスに ping できるかどうかを調べましょう (ここでは 192.168.1.1 を例にしています)。 うまくできないなら、再度 NET-2 HOWTO を見てください。 そして、もう少しネットワークについて調べてください。 次に、ファイアウォールからインターネットシステムに ping を試してみます。 私はテストポイントとしてwww.internic.net を使っています。 もしこれがうまく動かなければ、お使いの ISP でのサーバを試してみます。 これがうまく動かなければ、あなたのインターネット接続のどこかがきちんと 設定されていません。 ファイアウォールからは、インターネットのあらゆる場所に接続できなければ なりません。 デフォルトのゲートウェイの設定を見直してください。 ダイアルアップ接続を使っているなら、ユーザ ID とパスワードを 見直してください。 Net-2 HOWTO をもう一度読んでから再度試してください。 あなたの LAN 上にあるコンピュータから、ファイアウォール(24.94.1.123) の 外側のアドレスに ping を試してみます。 これは動かないはずです。 もし ping できるなら、あなたはマスカレードを行っているか、 IP フォワーディングを使っているか、あなたは既に何らかの パケットフィルタリングを設定しているのです。 それらを無効にして再度試してください。 フィルタリングが正しい状態にあることを確認しなければなりません。 2.1.102 より新しいカーネルに対しては、以下のコマンドが使えます - echo "0" > /proc/sys/net/ipv4/ip_forward (何故かは分かりませんが) 古いカーネルを使っているなら、フォワードを 無効にしてカーネルを再コンパイルしなければいけないでしょう (カーネルのアップグレードをするのにちょうどいい機会です)。 再度ファイアウォール (24.94.1.123) のアドレスの外側に向けて ping を 試します。 動いてはいけないのです。 ここまでを確認したところで、IP フォワーディング及び/又は IP マスカレードを 有効にします。 あなたの LAN 上のどんなシステムからインターネット上のどのような場所にも ping が可能になるはずです。 echo "1" > /proc/sys/net/ipv4/ip_forward 重要な注意 - もし、あなたが LAN 上で、 (192.168.1.* ではない) &dquot;本物の&dquot; IP アドレスを使っていて、 インターネットへ ping できないが、あなたのファイアウォールの インターネット側には ping できる場合は、接続先の ISP が あなたのプライベートネットワークのアドレスからのパケットを ルーティングしているかどうか確認してください。 【訳注: ここではユーザのマシン全てにグローバル IP を割り当てている 場合を説明しています。】 この問題をテストするには、インターネット上の誰か (例えばローカルのプロバイダを使っている友人に頼んで) に、あなたの ネットワークに traceroute してもらうことです。 traceroute による経路探索が、あなたが使っているプロバイダのルータで 停止するなら、プロバイダはあなたのトラフィックを転送していないのです。 動きましたか? 素晴らしい。難しい場所は終わりました。:-) ファイアウォールを安全にする

ファイアウォールは、それが動作しているシステムそのものが、攻撃に対して 広く開けっ放しになったままだと、なんら意味をなしません。 &dquot;悪い奴ら&dquot; は ファイアウォール以外のサービスを通して アクセスしてしまいますし、好き勝手に変更してしまいます。 不要なサービスはどれも無効にしなければなりません。 /etc/inetd.conf ファイルを見てください。 これは &dquot;super server&dquot; として知られる inetd を設定する ファイルです。 inetd は沢山のサーバデーモンを制御し、&dquot;well known&dquot; ポート への要求パケットが到着すると、それらをスタートさせます。 【訳注: well known port は、 TCP/UDP ポート番号 1024 番以下のポートを 指します。】 echo, discard, daytime, chargen, ftp, gopher, shell, login, exec, talk, ntalk, pop-2, pop-3, netstat, systat, tftp, bootp, finger, cfinger, time, swat そして linuxconfig 等は全て無効にしましょう。 サービスを変更するには、サービス行の最初の文字に # を置きます。 これが済んだら &dquot;kill -HUP <pid>&dquot; を送ります。 <pid> には、inetd のプロセス番号を書きます。 こうするとその設定ファイルを再読させ、システムを停止させないで 再スタートします。 【訳注: killall というコマンドがあります。 man killall も調べてください。 killall -HUP inetd が使えます。】 ファイアウォールの port 15 (netstat) に対して telnet してみてください。 何か出力するようなら、サービスは無効になっていません。 telnet localhost 19 /etc/nologin というファイルを作成することもできます。 BUZZ OFF (繋がないの意味) のように、このファイルにちょっとしたテキストを 書きます。 このファイルが存在すると、 login はユーザのログオンを許可しません。 ユーザはこのファイルの内容を見ることになり、ログインは拒否されます。 root だけがログインできます。 /etc/securetty というファイルも編集できます。 ユーザが root なら、 /etc/securetty に列挙された tty からしか ログインできません。 失敗すると、 syslog 機能で記録されます。 これらの両方のコントロールを有効にすれば、ファイアウォールへのログオンは、 root としてコンソール経由でしか行えなくなります。 絶対に telnet で root としてログインしてはいけません。 リモート root を必要とするなら、SSH (Secure Shell) でアクセスします。 telnet は無効にすべきでしょう。 心配性な人は、lids (Linux Intrusion Detect System 割り込み検知システム) を使う必要があるかもしれません。 これは Linux カーネルに対する侵入禁止システムのパッチです。 重要なファイルを改竄から守ります。 この仕組みを使うと、 防御対象のファイルやディレクトリ、更にその配下の サブディレクトリは (root を含めて) 誰も変更できなくなります。 このような安全化されたファイルを変更するには、 LILO の設定で security=1 を指定してシステムをリブートさせなければなりません (私ならシングルユーザモードで起動させるでしょう)。 IP フィルタリングの設定(IPFWADM)

カーネル 2.1.102 以上を使っているならこの章を飛ばして、次の IPCHAINS の 章に進んでください。 以前のカーネルでは IP Forwarding はデフォルトでカーネルに組み込まれ 有効になっています。 従って、ネットワークを設定する場合は、まず全てを拒否し、 以前に置かれていた ipfw のルールを破棄するべきです。 以下のようなスクリプト (の一部分) を、ネットワークの起動スクリプト (/etc/rc.d/init.d/network) に書いておかなければいけません。 # # IP packet Accounting と Forwarding の設定 # # Forwarding # # デフォルトで全てのサービスを不許可にする。 ipfwadm -F -p deny # 全てのコマンドを破棄する。 ipfwadm -F -f ipfwadm -I -f ipfwadm -O -f さて、我々は究極のファイアウォールを構築しました。 もう何も通しません。 ここで /etc/rc.d/rc.firewall というファイルを作成します。 このスクリプトは email, web, DNS トラフィックを許可します。 ;-) #! /bin/sh # # rc.firewall # # 関数ライブラリを読み込む . /etc/rc.d/init.d/functions # 設定を取得 . /etc/sysconfig/network # ネットワークが起動しているかチェックする if [ ${NETWORKING} = "no" ] then exit 0 fi case "$1" in start) echo -n "Starting Firewall Services: " # サーバに入る email を許可する。 /sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 192.1.2.10 25 # 外部の email サーバへの接続を許可する /sbin/ipfwadm -F -a accept -b -P tcp -S 192.1.2.10 25 -D 0.0.0.0/0 1024:65535 # あなたの Web サーバに Web 接続を許可する。 /sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 192.1.2.11 80 # 外部の Web サーバへの Web 接続を許可する。 /sbin/ipfwadm -F -a accept -b -P tcp -S 192.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 192.1.2.0/24 ;; stop) echo -n "Stooping Firewall Services: " ipfwadm -F -p deny ;; status) echo -n "Now do you show firewall stats?" ;; restart|reload) $0 stop $0 start ;; *) echo "Usage: firewall {start|stop|status|restart|reload}" exit 1 esac 注意 - この例では、192.1.2.10 に email (smtp) サーバがあって、ポート 25 で 送受信ができなければならないとしています。 web サーバは 192.1.2.11 で運用しています。 LAN にいる全ての利用者が、外部の web サーバと DNS サーバに 到達できるようにしています。 これは完全に完璧とは言えません。 なぜなら port 80 は、web ポートとして使わなければならないわけではなく、 賢いハッカーならこのポートを使って、ファイアウォールを越える 仮想プライベートネットワーク (VPN) を作るでしょう。 これを避けるには、 web プロキシを設定し、プロキシだけが ファイアウォールを通過できるようにすることです。 LAN 側のユーザが外のweb サーバに到達する為にはプロキシを 経由しなければならないようにします。 ファイアウォールを通るトラフィックの勘定にも興味があるでしょう。 次のスクリプトは全てのパケットを数えます。 あなたはシングルシステムに向かうパケットを数える為に 一、二行加えることができます。 # 現在のアカウントルールを破棄する。 ipfwadm -A -f # Accounting /sbin/ipfwadm -A -f /sbin/ipfwadm -A out -i -S 192.1.2.0/24 -D 0.0.0.0/0 /sbin/ipfwadm -A out -i -S 0.0.0.0/0 -D 192.1.2.0/24 /sbin/ipfwadm -A in -i -S 192.1.2.0/24 -D 0.0.0.0/0 /sbin/ipfwadm -A in -i -S 0.0.0.0/0 -D 192.1.2.0/24 必要なのがフィルタリングファイアウォールだけなら、あなたはここで設定を 終えることができます。 テストしてから運用してください。 IP フィルタリングの設定(IPCHAINS)

Linux の ipchains は、 Linux IPv4 firewalling コードと ipfwadm を 書き換えたものです。 ipfwadm は BSD の ipfw を書き換えたものだったと思います。 ipchains は Linux のカーネル 2.1.102 以降で IP パケットフィルタを 管理するのに必要です。 以前のコードはフラグメント【訳注: fragment: 断片化されたパケット】を 扱えませんし、 (少なくとも Intel 用では) 32 ビットのカウンタしかありませんし、 TCP/UDP/ICMP 以外の仕様のプロトコルを考慮していませんし、 アトミック(瞬間的)に大きく(ルールを)変更することもできませんし、 逆ルールを満たせませんし、いくつか妙な癖がありましたし、 管理しにくい (ユーザのミスを招きやすい) ものだったと 作者は言っています。 【訳注: この一節は と殆ど同じです。】 私は ipchains を使ったファイアウォールの制御について、ここで深くは述べる つもりはありません。 この件についてはとてもよく出来た HOWTO が次のところにありますから、 ここでは基本についてだけ述べます。 に HOWTO があります。 チェインは名前で扱います。 まず、input, output そして forward という組み込み済みチェインがあり、 これらは削除できません。 自分でチェインを作ることができます。 そして、これらのチェインのルールセットに対してルールを追加したり 削除していくことができます。 全てのチェインに対して行える操作は以下の通りです - 新しいチェインを作る (-N). 空のチェインを削除する (-X). 組み込みチェインのポリシーを変更する (-P). チェインにあるルールをリストする (-L). チェインのルールを全て消します (-F). チェインにある全てのルールのパケットとバイト数のカウンタをゼロにする (-Z). チェイン内部でルールを操作するにはいくつかの方法があります - チェインに新しいルールを加える (-A). チェインの適当な場所に新しいルールを入れる (-I). チェインの適当な場所でルールを置き換える (-R). チェインの適当な場所でルールを削除する (-D). チェインに適合する最初のルールを削除する (-D). ipchains はマスカレーディングの操作の置場所としても良い所なので、 この為の操作がいくつかあります - 現在のマスカレードされた接続をリストする (-M -L). マスカレードのタイムアウト値を設定する (-M -S). ファイアウォールルールの変更に関してはタイミングの問題がいくつかあります。 注意深くやらないと、変更している間に不完全なところからパケットを 通してしまいます。 もっとも単純な方法は次のようにすることです - # ipchains -I input 1 -j DENY # ipchains -I output 1 -j DENY # ipchains -I forward 1 -j DENY ... 変更します ... # ipchains -D input 1 # ipchains -D output 1 # ipchains -D forward 1 # この方法は、変更している間に全てのパケットを落します。 これは ipchains について、これまで述べたファイアウォールルールを まとめたものです。 #!/bin/sh # # rc.firewall の記述。 # ## 全てを破棄して最初から始動する。 /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward ## HTTP 透過プロキシに対してリダイレクトする。 #$IPCHAINS -A input -p tcp -s 192.1.2.0/24 -d 0.0.0.0/0 80 -j REDIRECT 8080 ## あなた自身のチェインを作る。 /sbin/ipchains -N my-chain # サーバに来る email を許可する。 /sbin/ipchains -A my-chain -s 0.0.0.0/0 smtp -d 192.1.2.10 1024:-j ACCEPT # 外側の email サーバに email 接続を許可する。 /sbin/ipchains -A my-chain -s 192.1.2.10 -d 0.0.0.0/0 smtp -j ACCEPT # あなたの web サーバに Web 接続を許可する。 /sbin/ipchains -A my-chain -s 0.0.0.0/0 www -d 192.1.2.11 1024: -j ACCEPT # 外側の Web サーバに Web 接続を許可する。 /sbin/ipchains -A my-chain -s 192.1.2.0/24 1024: -d 0.0.0.0/0 www -j ACCEPT # DNS トラフィックを許可する。 /sbin/ipchains -A my-chain -p UDP -s 0.0.0.0/0 dns -d 192.1.2.0/24 -j ACCEPT ## マスカレードを使っているなら、 # 内側から内側へのトラフィックをマスクしない。 /sbin/ipchains -A forward -s 192.1.2.0/24 -d 192.1.2.0/24 -j ACCEPT # 外部インターフェースを直接マスクしない。 /sbin/ipchains -A forward -s 24.94.1.0/24 -d 0.0.0.0/0 -j ACCEPT # 外側に向かう全ての内部 IP をマスカレードする。 /sbin/ipchains -A forward -s 192.1.2.0/24 -d 0.0.0.0/0 -j MASQ ## 全てを不許可にする。 /sbin/ipchains -P my-chain input DENY ここでやめてはいけません。 これは完璧なファイアウォールではありませんし、あなたは提供している 他のサービスがあるはずです。 繰り返しますが IPCHAINS-HOWTO を読みましょう。 【訳注: もあります。】 透過 squid プロキシをインストールする

squid プロキシは次のところで入手できます。 SQUID の開発者は RedHat と Debian パッケージを提供しています。 可能ならこれらパッケージのどれかを使用します。 【訳注: 原文では SQUID と大文字で書かれているのですが、 日本語訳では squid としていますのでご注意ください。

squid の メインページとFAQ ページは次のところにあります。 TIS プロキシサーバをインストールする

ソフトウェアを入手する

TIS FWTK は次のところで入手できます。 私がやったような間違いをしてはいけません。 TIS からファイルを ftp する時、 README をしっかり読んでください。 TIS fwtk はサーバの隠しディレクトリに置かれています。 TIS は、次の場所で 同意書を読み、それから隠しディレクトリの名称を知らせてもらう為に 本文に同意する(accepted)とだけ書いて次のアドレス宛に メールを送るよう要請しています。 subject は不要です。 TIS のシステムはソースをダウンロードできる (12 時間有効の) ディレクトリの 名を書いたメールを返送してきます。 この文書を書いている時点での FWTK の最新版は 2.1 です。 TIS FWTK をコンパイルする

FWTK の Version 2.1 は、旧版のどれよりも簡単にコンパイルできます。 説明はこれだけ!!! さあ、 make を実行しましょう。 TIS FWTK をインストールする

make install を実行しましょう。 デフォルトでインストールされるディレクトリは、/usr/local/etc です。 (私は変更はしていませんが) インストールディレクトリはもっと安全な ディレクトリに変更できます。 私はデフォルトのディレクトリを 'chmod 700' に変更しています。 最後にファイアウォールを設定する仕事が残っています。 TIS FWTK を設定する

さて、ここから佳境に入ります。 これらの新しいサービスの呼び出しをシステムに教えてやり、それらを 制御するテーブルを作らなくてはいけません。 ここで TIS FWTK のマニュアルをもう一度書くつもりはありません。 私が動作を確認した設定、はまりこんだ問題を説明し、それらを回避する 方法についてお伝えします。 制御を構成する三つのファイルがあります。

/etc/services サービスがどのポートで行われるかをシステムに知らせる。 /etc/inetd.conf 何者かがサービスポートを叩いたときに、呼び出されるプログラムを リストしてシステムに知らせる。 /usr/local/etc/netperm-table サービスを許可と拒否している者を FWTK サービスに知らせる。 FWTK の機能を使う為に、これらのファイルを手順に従って 編集しなければいけません。 inetd.conf や netperm-table ファイルを正しく設定しないで サービスファイルを編集すると、お使いのシステムに アクセスできなくなります。 netperm-table ファイル

このファイルは TIS FWTK のサービスにアクセスできる者をコントロールします。 ファイアウォールの両側からのトラフィックについて考えなければいけません。 ネットの外部の人たちはアクセスする前に認証すべきですが、ネットワークの 内部の人たちは単に通過を許可するように設定する場合もあります。 そこでユーザが自分自身を認証できるように、ファイアウォールは ユーザの ID とパスワードのデータベースを保管する authsrv と 呼ばれるプログラムを使います。 netperm-table の認証部分は、データベースが保存される場所と、それに アクセスできる人をコントロールします。 私は、このサービスへのアクセスを止めてしまうトラブルに遭遇しました。 全ての人がアクセスできるように、 '*' を使っている premit-host 行に 注意してください。 動かすことができるようになったならば、この行の正しい設定は '' authsrv: premit-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 になります。 そして /var/local/etc で管理用ユーザ記録を作成する為に ./authsrv を動かします。 例を示しておきます。 FWTK の文書を読み users と groups を加える方法について調べてください。 # # authsrv authsrv# list authsrv# adduser admin &dquot;Auth DB admin&dquot; ok - user added initially disabled authsrv# ena admin enabled authsrv# proto admin pass changed authsrv# pass admin &dquot;plugh&dquot; 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 gateway (tn-gw) コントロールは正確に、しかも最初に設定を 行わなければなりません。 私の例では、プライベートネットワーク内部のホストには自身の認証なしで 通過を許可しています(permit-hosts 19961.2.* -passok) 。 しかし、その他のユーザはプロキシを使う為に、自分の ID とパスワードを 入力しなければなりません (permit-hosts * -auth)。 ここではまた、一台の別のシステム(192.1.2.202)からはファイアウォールを 通さないで、直接ファイアウォールマシンへのアクセスを許可しています。 二つのinetacl-in.telnetd 行がこれを行います。 どのようにしてこれらの行が呼び出されるかは後で説明します。 telnet のタイムアウトは短くしたほうがよいでしょう。 # telnet ゲートウェイルール - 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 192.1.2.* -passok -xok tn-gw: permit-hosts * -auth # 管理者だけがポート 24 経由でファイアウォールに直接 telnet できます。 netacl-in.telnetd: permit-hosts 192.1.2.202 -exec /usr/sbin/in.telnetd (rlogin や rcp や rshなどの)リモート関連コマンドは telnet と 同じような方法で動きます。 # rlogin ゲートウェイルール - 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 192.1.2.* -passok -xok rlogin-gw: permit-hosts * -auth -xok # 管理者だけがポートを通じてファイアウォールに直接 telnetできます。 netacl-rlogind: permit-hosts 192.1.2.202 -exec /usr/libexec/rlogind -a FTP も含め、ファイアウォールを直接アクセスできるようにすべきではありません。 そのためファイアウォールに FTP サーバを置いてはいけません。 次の permit-hosts 行は、保護されたネットワーク内に居る全ての者に インターネットへの自由なアクセスを許可し、その他の者は自分自身を 認証しなければなりません。 私は送受信した全てのファイルの記録を取る設定も含めてあります。 (-log { retr stor }) ftp のタイムアウトは、接続が入力がないままオープンになっている時間を どれくらいにするのかと同じように、不正な接続を停止するのに必要な時間を どれくらいにするかを制御します。 # 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 192.1.2.* -log { retr stor } ftp-gw: permit-hosts * -authall -log { retr stor } Web, gopher, ブラウザを使った ftp は http-gw によって制御されます。 最初の二行は ftp やファイアウォールを通って渡されているような web 文書を 置くディレクトリを作ります。 私はこれらのファイルを root 所有にし、root のみがアクセスできる ディレクトリに置いています。 Web 接続は短くしたほうがよいでしょう。 ユーザが不正な接続でどれくらい待つかを制御します。 # 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 192.1.2.* -log { read write ftp } http-gw: deny-hosts * ssl-gw は実際はなんでも通してしまう gateway です。 注意してください。 この例では、私はアドレス 127.0.0.* と 192.1.1.* それから、ポート 443 から 563 上でだけ、ネットワークの外部のどのサーバにも接続するため保護された ネットワークの内部で全ての人を許可しています。 ポート 443 から 563 は SSL ポートです。 # ssl gateway rules: ssl-gw: timeout 300 ssl-gw: hosts 192.1.2.* -dest { !127.0.0.* !192.1.1.* *:443:563 } ssl-gw: deny-hosts * ここでは、新しいサーバに接続を許可する為に plug-gw をどのように 使うかについての例を示します。 この例で、私は保護されたネットワークの内側で一つのシステムにだけ接続し、 それが新しいポートにだけ接続するのを全ての人に許可します。 二行目は保護されたネットワークにそのデータを戻す為に新しいサーバを許可します。 殆どのクライアントはユーザがニュースを読んでいる間は接続状態に あることを期待しますから、ニュースサーバのタイムアウトは長くしておくべきです。 # NetNews Pluged gateway plug-gw: timeout 3600 plug-gw: port nntp 192.1.2.* -plug-to 24.94.1.22 -port nntp plug-gw: port nntp 24.94.1.22 -plug-to 192.1.2.* -port nntp finger gateway はシンプルです。 保護されたネットワークの内部の人は誰でも最初にログインしなければならず、 その後ファイアウォール上の finger プログラムを使うことができます。 それ以外の全ての人は次のようなメッセージを受け取ります。 # Enable finger service netacl-fingerd: permit-hosts 192.1.2.* -exec /usr/libexec/fingerd netacl-fingerd: permit-hosts * -exec /bin/cat /usr/local/etc/finger.txt 私は Mail と X Window System のサービスの設定をしていないので、ここには例を 含めていません。 どなたか動いている例をお持ちなら e-mail で私に送ってください。 /etc/services ファイル

ここが全ての始まりです。クライアントがファイアウォールに接続するとき、 既知のポート( 1024 より以下)に接続します。たとえばtelnet はポート23 上に 接続します。inetd デーモンはこの接続を知ると、 /etc/services ファイルに あるこれらのサービスの名前を探します。それから /etc/inetd.conf ファイルに ある名前に割り当てられたプログラムを呼び出します。 われわれが作成しているサービスのあるものは、普通は /etc/services ファイルにはありません。 あなたは、自分が望むどれかのポートに何かのサービスを割り当てることが できます。 例えば、私は管理者の telnet ポート (telnet-a) をポート24 に割り当てています。 お望みならポート 2323 にそれを割り当てることもできます。 ファイアウォールに直接接続する管理者(あなた)に対して、私が行ったように、 あなたがご自分の netperm-table ファイルを設定するならポート23 ではなく、 ポート24 にtelnet する必要があり、保護されたネットワークの内部で、 一つのシステムからこれをできるようにするだけです。

telnet-a 24/tcp ftp-gw 21/tcp # this named changed auth 113/tcp ident # User Verification ssl-gw 443/tcp SOCKS プロキシサーバ

プロキシサーバを設定する

SOCKS プロキシサーバは次のところから入手できます。 http://www.socks.nec.com/ お使いのシステムのディレクトリでファイルを解凍、展開し、指示にしたがって make してください。私が行ったときは少し問題ありました。Makefile が正しい ことを確認してください。 一つ大事なことは、プロキシサーバは /etc/inetd.conf に追加しなければいけません。 要求があったとき稼働するようサーバに伝えるため、次の行を追加してください - socks stream tcp nowait nobody /usr/local/etc/sockd sockd プロキシサーバを設定する

SOCKS プログラムには二つの独立した設定ファイルが必要です。 一つはアクセスを許可したことを伝え、もう一つは適切なプロキシサーバへの 要求に対して経路を決めるものです。 ルーティングファイルは全ての UNIX マシンに置かれていなくてはいけません。 DOS と、たぶんマッキントッシュは自分でルーティングを行うでしょう。 アクセスファイル

socks4.2 Beta では、アクセスファイルは &dquot;sockd.conf&dquot; という 名前になっています。許可と拒否行の 2行があります。それぞれの行は三つの エントリーを持ちます。 The Identifier (permit/deny) The IP address The address modifier Identifier は許可か拒否(permit/deny)のどちらかです。許可と拒否の両方 を書くようにしなければなりません。 IP アドレスは通常の IP 10 進ドット記法 で 4 バイトアドレスで書かれます。 例えば、192.168.1.0 のようになります。 アドレス修正もまた通常の IP アドレス 4 バイト長です。 ネットマスクのように働きます。 32 bits (1 または 0 など)になるようにこの数値を想定しています。 bit が 1 なら、予約されているアドレスに対応する bit は、IP アドレスの 領域で対応する bit に一致しなければいけません。 例えば、次のような行の場合 - permit 192.168.1.23 255.255.255.255 192.168.1.23 に全ての bit が一致する IP アドレス、つまり 192.168.1.23 だけが許可されます。次のような行の場合では - permit 192.168.1.0 255.255.255.0 192.168.1.255 から 192.168.1.0 のグループ内にある C クラスのドメインの 全ての数値を許可します。 次のような行を書くべきではありません - permit 192.168.1.0 0.0.0.0 この場合は、全てのアドレスをおかまいなしに許可してしまいます。 そこで、まず許可したい全てのアドレスを許可し、それから、残りを 拒否します。 ドメイン 192.168.1.xxx で、全てを許可するには次のようにします - permit 192.168.1.0 255.255.255.0 deny 0.0.0.0 0.0.0.0 これはうまく動くでしょう。 拒否行にある最初の &dquot;0.0.0.0&dquot; に注意してください。 アドレス修正が 0.0.0.0 になっているので、IP アドレス領域は意味を持ちません。 通常全て 0 で、これは入力が簡単なためです。 どちらに対してもふたつ以上のエントリを指定することができます。 特別なユーザもまた許可あるいは拒否することができます。これは ident 認証 を通して行われます。Trumpet Winsock もそうですが、ident をサポートしてい ないシステムがあるため、私はここでそれについては述べません。 この件については、socks 付属の文書がふさわしいでしょう。 ルーティングファイル

SOCKS のルーティングファイルは &dquot;socks.conf&dquot; というあまりよく ない名前になっています。私が、&dquot;あまりよくない名前&dquot; だと言う のは、アクセスファイルの名前によく似ているので、この二つが混乱しやすい という理由からです。 ルーティングファイルは SOCKS クライアントに socks を使用すべきときと、 使わなくていいときを伝える為にあります。例えば、われわれのネットワークで、 192.168.1.3 が 192.168.1.1 のファイアウォールと話す為に socks を使う必要 はありません。イーサネットを通して直接つながっています。127.0.0.1は loopback として自動的に定義されます。もちろん自分自身と話す為に SOCKS は 必要ではありません。ここには三つのエントリー群があります。

deny direct sockd 拒否(deny)は SOCKS に要求を拒否する場合を伝えます。このエントリーには、 sockd.conf ファイル内で、identifier 、address そして、modifier の三つの 部分があります。これは一般的に sockd.conf 、つまりアクセスファイルによっ ても扱われるので、アドレス修正フィールドは 0.0.0.0 に設定されます。どこか らでも呼び出されないよう自分自身を除外したいなら、ここで設定できます。 direct エントリーは、どのアドレスが socks を使わないかを伝えます。 プロキシサーバなしに到達できる全てのアドレスがあります。 ここでもまた identifier、address、modifierの三つの部分があります。 わわわれの例では次のようになっています。 direct 192.168.1.0 255.255.255.0 あなたの保護されたネットワーク上では誰に対しても直接接続します。 sockd のエントリーはどのホストが socks サーバデーモンを持っているかを コンピュータに伝えます。構文は次のようになります。 sockd @= @= というエントリーに注意してください。これはプロキシサーバのリストの IP アドレスの設定を許可します。われわれの例では、一つのプロキシサーバ を使うだけですが、あなたはより大きな負荷を許可することで多数持つように でき、失敗した場合の繰り返しのため複数で指定することもできます。 IP アドレスと modifier の部分は、別に示した例と同様に動きます。 どのアドレスが通過していくかを指定します。 ファイアウォールの後ろで DNS を動かす

ファイアウォールの後ろで DNS(ドメインネームサーバ)を設定するのは、比較的 簡単なことです。ただ単にファイアウォールマシンに DNS を設定すればよいだ けです。このように DNS を使う為にファイアウォールの後ろ側でそれぞれのマ シンを設定します。 プロキシサーバを動かす

Unix

プロキシサーバでアプリケーションを動かす為には、 &dquot;SOCKS 化(sockified) &dquot;が必要です。 直結のコミュニケーション用に一つと、プロキシサーバを通しての コミュニケーション用の二種類の telnet が必要です。SOCKS にはプログラムをどのように SOCK 化するかについての手順 書と、数個のSOCKS 化されていないプログラムを同封しています。 あなたがどこかに直接接続するためSOCKS 化された版を使うなら、 SOCKS は自動 的にあなたの為に直接接続用の版に変更するでしょう。このため、保護された ネットワーク上で全ての関連プログラムをリネームし、もともとの名前のものを SOCK 化されたプログラムで置き換えたいわけです。 &dquot;Finger&dquot; は &dquot;finger.orig&dquot;, に、 &dquot;telnet&dquot; は &dquot;telnet.orig&dquot;, のようになります。 これらを include/socks.h でそれぞれについて SOCKS に伝えてやらなくては いけません。 ある種のプログラムはそれ自身でルーティングと SOCKS 化を処理します。 Netscape はそれらの一つです。 Netscape でプロキシのもとで SOCK の場所 にサーバのアドレス(われわれの場合は、192.168.1.1 )を入力してプロキシサー バを使うことができます。少なくともそれぞれのアプリケーションは、プロキシ サーバをどのように使うかに関わらず、多少の試行錯誤は必要です。 Trumpet Winsock を持った MS Windows

Trumpet Winsock にはプロキシサーバを扱う機能が組み込まれています。 &dquot;セットアップ&dquot;メニューで、サーバの IP アドレスと、直接的に 到達可能な全てのコンピュータのアドレスを入力します。そうすれば Trumpet は外に向かう全てのパケットを扱います。 【訳注: Trumpet Winsock は Windows 3.1 の為の TCP/IP プロトコルスタック ソフトウェアです。 詳細は をご覧ください。】 UDP パケットで動かす為にプロキシサーバを入手する

SOCKS パッケージはTCP パケットだけを処理し、UDP は扱いません。このため、 このパッケージが全く役にたたない場面が出てきます。talk や Archie のような 多くの有用なプログラムは UDP を使います。Tom Fitzgerald <fitz@wang.com> さんによって、 UDP relay と呼ばれる UDP パケットに対 してプロキシサーバとして使うように設計されたパッケージが作成されています。 ただし、残念ですが、この文書を書いている時点では Linux との互換性はありません。 プロキシサーバの欠点

プロキシサーバはとりわけセキュリティデバイス です。限られた IP アドレスでインターネットへのアクセスを増やす為にプロキシを使うのは、多 くの欠点も伴います。プロキシサーバは保護されたネットワークの内部から外 部へより多くのアクセスを許可しますが、外部からは完全に内部がアクセスできま せん。このようにするとサーバが使えない、 talk や archieへの接続ができない、 あるいは内部のコンピュータに直接メールできないということになります。これら の欠点は取るにたらないことのようにも思えますが、次のように考えて見てください。 あなたはファイアウォールで保護されたネットワークの内部にある コンピュータに、現在取りかかっているレポートを忘れてきました。 今は家にいて、ファイアウォールを越えようと決心したのですが、どうやっても 越えられません。 コンピュータはファイアウォールの向こう側にあるのでアクセスできません。 さもなければとファイアウォールにログインしようとしますが、 ファイアウォールには誰もがプロキシサーバ経由でアクセスしますから、 ファイアウォールマシンにはあなたのアカウントが設定されていないため ログインもできません。

あなたの娘は大学に行っています。あなたは彼女に email を送りたいとします。 何かプライベートな用件を伝えたいので、あなたのメールを直接娘のマシン に送りたいのです。あなたはシステム管理者を完全に信頼していますが、 それでもなお、これはプライベートなメールなのですから。

UDP パケットを使うことができないというのは、プロキシサーバのもつ 大きな欠点です。私は UDP を扱う機能はまもなく到来するだろうと思っています。 FTP はプロキシサーバで別の問題を起こします。lsを使うと、 FTP サー バはクライアントマシン上でソケットを開き、そこから情報を送ります。プロキ シサーバはこれを許可していませんので、 FTP はこの場合には動きません。 更に、プロキシサーバは遅いです。 他のどんな方法よりもオーバヘッドが大きくなるので、 プロキシサーバ経由以外の手段でアクセスする方が速くなります。 基本的に、あなたが IP アドレスを持っていても、セキュリティについて悩んで いないなら、ファイアウォールやプロキシサーバを使わなくてよいのです。IP アドレスを持っていないなら、セキュリティについてもまた悩まないでしょう が、Term, Slirp や TIA のような IP エミュレータを使ってみたいでしょう。 Term はで 入手できます。Slirp はから入手できます。 TIA は marketplace.com で入手できます。 これらのパッケージはより高速に動き、よりよい接続を許可し、インターネット から内部ネットワークにより多くのアクセスを提供します。プロキシサーバは設 定と維持に手間がかからないので、手っ取り早くインターネットに接続したい多 くのホストを持っているようなネットワークにとっては便利なものです。 上級の設定

この文書を締めくくる前に、検討したい設定があります。 多分、今までの概要の説明で大部分の人は足りるでしょう。 しかし、次の項でいくつかの疑問を解決できるもっと上級の設定を示そうと 思います。 今まで説明してきたことだけではあなたの疑問を解決できないのなら、あるいは、 プロキシサーバとファイアウォールによってどれほど多彩な設定が 可能なのかという点に興味があるなら、もうすこし読んでみてください。 安全性の重視が必要な大きなネットワーク

さて、例として、あなたは millisha という結社のリーダーで、サイトを ネットワークに接続したいと思っています。 50 台のコンピュータと 32 個 (5 ビット) の IP 番号のサブネットがあります。 信望者に異なることを言う理由から、ネットワーク内での様々なアクセスの レベルが必要です。 その結果、ネットワークの特定部分をそれ以外の部分から保護する必要が あるでしょう。 そのレベルは - external(外部) レベル。誰でも見れるレベルです。新しい志願者を募る 為に、情熱的な演説や派手なパフォーマンスを行なって、一般大衆に自分達の イメージをはっきりと印象づけるための場所です。 Troop(実行部隊) external レベルを越えた人たちのレベルです。 ここは邪悪な方法での人心掌握や、爆弾の製造方法について教えるところです。 Mercenary(参謀本部) ここは本当の計画を保持し ています。このレベル内には、世界征服の方法、世間を騒がせた事件の真相な どの全ての情報が保持されています。 【訳注: 訳文は日本向けであることを 鑑み原文と違っています。原文は以下のとおり - Here is where the real plans are keep. In this level is stored all the information on how the 3rd world government is going to take over the world, your plans involving Newt Gingrich, Oklahoma City, lown care products and what really is stored in that hangers at area 51.】 ネットワーク設定

IP 番号の取り決め -

番号の 1 つである 192.168.1.255 は、ブロードキャストアドレスなので 使用できません。 32 個の IP アドレスの内 23 個は 23 台のマシンに割り当てます。これ らのマシンはインターネットにアクセスできるようにします。 1 個の extra(特別な) IP アドレスをネットワーク上の Linux box に与 えます。 1 個の extra IP アドレスをネットワーク上の異なる Linux box に与え ます。 2 個の IP アドレスをルータに与えます。 4 個残ってますが、ドメイン名 paul, ringo, john, george に与えま す。これはちょっと面食らわしただけです。 保護された両方のネットワークはアドレス 192.168.1.xxx です。 次に、分離した 2つのネットワークを、それぞれ異なった部屋に構築します。 2つのネットワークは赤外線イーサネットを使って接続されます。 なので、ネットワークは部屋の外部から完全に隠されます。 幸いにも赤外線イーサネットは、普通のイーサネットと全く同様に動作します。 これらのネットワークは、extra IP アドレスを使って Linux box の 1つに 接続されます。 保護された 2つのネットワークが接続されたファイルサーバがあります。 Troop 以上の人々が関与する世界征服計画用のサーバです。 ファイルサーバは Troop ネットワーク用に 192.168.1.17 のアドレスを、 Mercenary ネットワーク用に 192.168.1.23 を持っています。 異なるイーサネットカードを持たなければならないので、異なる IP アドレスを 持たなければなりません。 その IP Forwarding はオフにします。 両方の Linux box の IP Forwarding もオフにします。 ルータは特に指定しない限り 192.168.1.xxx に向かうパケットは転送しないので、 インターネットから入って来れません。 IP Forwarding をオフにすることは、Troop ネットワークからのパケットを Mercenary ネットワークに到達させないことと、その逆の流れもさせないことを 意味します。 また、異なるネットワークに異なるファイルを提供する設定を NFS サーバにも できます。 これは役立つことで、シンボリックリンクを用いたちょっとした要領で、 普通のファイルを全て共有することができます。 この設定ともう一枚のイーサネットカードを用いることで、 3つ全ての ネットワークにこの一台のファイルサーバでファイルを提供することができます。 プロキシ設定

さて、 3つ全てのレベルがその独自の邪な目的の為にネットワーク上の 情報を傍受できるようにしたいので、 3つ全てでネットワークにアクセスできる 必要があります。 external ネットワークは直接インターネットに接続されるので、この界面に プロキシサーバを置いてはなりません。 Mercenary と Troop のネットワークはファイアウォールの後ろにあるので、 ここにプロキシサーバを設定する必要があります。 両方のネットワークは非常に似た設定になります。両方のネットワークは同じ IP アドレスが割り当てられます。 もっと興味深いものにする為に、いくつかの要素を加えてみたいと思います。 誰もファイルサーバをインターネットアクセス用に使ってはなりません。 ファイルサーバがウィルスや他の意地悪なことにさらされることは、かなり 重要なことなので、立ち入り禁止です。 troop ネットワークからワールドワイドウェブにアクセスすることは 許しません。 彼らは訓練中であり、この種の外部の情報の検索を許すことは結果として 有害な結果に終わることがままあるものです。 だから、Troop の Linux box 上の sockd.conf ファイルには次の行があります。 deny 192.168.1.17 255.255.255.255 そして、Mercenary のマシンには - deny 192.168.1.23 255.255.255.255 があります。また、Troop の Linux box には次の行があり - deny 0.0.0.0 0.0.0.0 eq 80 80 に等しい (eq) ポート (http のポート) にアクセスを試みる全てのマシン を拒否 (deny) します。 他の全てのサービスをまだ許しています。ウェブアクセスのみ拒否しています。 次に、両方のマシンのファイルには - permit 192.168.1.0 255.255.255.0 があり、192.168.1.xxx のネットワーク上の全てのコンピュータが、既に 拒否したこと (すなわち Troop ネットワークからのファイルサーバと ウェブへのアクセス) を除き、このプロキシサーバを使うことを許します。

Troop の方の sockd.conf ファイルは次のようになります - deny 192.168.1.17 255.255.255.255 deny 0.0.0.0 0.0.0.0 eq 80 permit 192.168.1.0 255.255.255.0 そして Mercenary の方のファイルは次のようになります - deny 192.168.1.23 255.255.255.255 permit 192.168.1.0 255.255.255.0 全ての事柄を正しく設定したはずです。 各ネットワークは適切に、程良い交流を保って分離されます。 簡単な管理の為に

ファイアウォールツール

ファイアウォールを簡単に管理するためのソフトウェアパッケージがいくつか あります。 これらのツールなしで管理する能力がなければ、これらは使えないことに 注意してください。 これらのスクリプトは管理を正しく行うことに役立ちますが、 同様に間違った管理も簡単に行わせてくれます。 Linux のフィルタルールと動作させる為に、グラフィカルなウェブベースの インターフェースを開発しています。 更に数社は Linux を基にその box 内に独自の管理プログラムを置くことにより 商用ファイアウォールを作成しています。 (素晴らしい) 私は実のところ GUI 野郎ではありません。しかし、ある期間、 ファイアウォールの GUI インターフェースを使ったことがあります。 一目で全てのルールを見ることの出来る素晴らしいレポートを提供する 機能が役立つことを知りました。 gfcc (GTK+ Firewall Control Center) は GTK+ アプリケーションで、ipchains パッケージに基づき、Linux のファイアウォールポリシーとルールを制御 できます。 を訪れ、ダウンロードしてください。 これは本当にいいツールです。 appendex A に RC スクリプトを載せました。 これらのスクリプトは gfcc があってもなくても動作します。 ファイアウォールの設定に利用可能なスクリプトがたくさんあります。 一つは非常に完全なスクリプトで から入手できます。 もう一つはよくできたスクリプトで から 入手できます。 Kfirewall は ipchains か ipfwadm (使用するカーネルバージョンに依存します) 用の GUI フロントエンドです。 FCT はファイアウォールの設定用 HTML ベースのツールです。 複数のインターフェースといくつかのインターネットサービス用の ファイアウォール上で、IP フィルタコマンド (ipfwadm) のスクリプトを 自動生成する特徴があります。 汎用ツール

WebMin は汎用的なシステム管理パッケージです。ファイアウォールルールの 管理には役立たないでしょうが、デーモンとプロセスの起動と停止には 役立つでしょう。 このプログラムはとてもいいのですが、J. Cameron が IPCHAINS の モジュールを入れてくれることを望んでいます。 ISP の方なら、IPFA (IP Firewall Acounting) について知りたいでしょう。 月毎/日毎/分毎の記録が取れ、ウェブベースの GUI 管理メニューがあります。 プロキシファイアウォールをだめにする

あなたの人生を台無しにしてあなたにセキュリティについて関心を持ち続けて いただく為に、プロキシファイアウォールをだめにすることがどんなに 簡単かを説明します。 この文書に書いてある全ての処置をしたので、非常に安全なサーバと ネットワークになっています。 DMZ があり、ネットワークには誰も入りこめず、外部ネットワークへの接続は 全て記録されるような完璧なネットワークです。 ユーザはインターネットに接続するのにプロキシを経由します。 直接インターネットに接続できるユーザはいません。 その後、一人のユーザが、自分専用のコネクションの為に、 の存在に気づきました。 httptunnel は HTTP のリクエストでトンネリングされた双方向の仮想的な (HTTP 以外のプロトコルを通せる) データパスを作ります。 HTTP リクエストを送りたいなら、HTTP プロキシ経由でできます。 もしくは、ユーザ自身のシステムに Virtual Private Network (vpn) を インストールします。 を参照のこと。 もしくは、単純に、ユーザ自身の NT システムにモデムを繋ぎ、 ルーティングをオンにしてしまうかもしれません。 最後に、プライベート LAN 上のワークステーション上で、インターネットへの 新しい経路を指すようデフォルトゲートウェイを変更します。 そうなった時、このワークステーションからどこへでも行くことができます。ファ イアウォール管理者が目にする唯一の物は、実に長々と続く DNS ルックアップ の接続だけかもしれません。 世界征服の時です! APPENDEX A - スクリプトの例

GFCC を用いた RC スクリプト

#!/bin/bash # # Firewall Script - Version 0.9.1 # # chkconfig: 2345 09 99 # 概要: 2.2.x カーネル用ファイアウォールスクリプト # テストの際には # -x を追加すること。 # # 注意 - # # このスクリプトは RedHat 6.0 及びそれ以降のバージョン向けに書かれて # います。 # # ウェブや ftp サーバのような公開サービスを提供する場合は注意して # ください。 # # インストール - # 1. /etc/rc.d/init.d の中にこのファイルを置きます。 # (root にならなければならないでしょう...) # "firewall" のような名前にします :-) # 所有権を root にします --> "chown root.root (ファイル名)" # 実行属性を立てます --> "chmod 755 (ファイル名)" # # 2. ファイアウォールルールを作る為に GFCC を使い、 # ファイル /etc/gfcc/rules/firewall.rule.sh に書き写します。 # # 3. RedHat の init スクリプトにファイアウォールを # 追加します --> "chkconfig --add (ファイル名)" # 次回ルータを起動すると firewall サービスが自動的に起動するはずです! # *前より少しは* 脆弱でなくなっているので、夜はぐっすり寝てください。 # # リリースノート # 30 Jan, 2000 - GFCC スクリプトに変更 # 11 Dec, 1999 - Mark Grennan <mark@grennan.com> による更新 # 20 July, 1999 - 最初の作品 - Anthony Ball <tony@LinuxSIG.org> # ################################################ # 関数ライブラリを読み込みます。 . /etc/rc.d/init.d/functions # ネットワーク設定を読み込みます。 . /etc/sysconfig/network # ネットワークが起動しているかチェックします。 [ ${NETWORKING} = "no" ] && exit 0 # 何が呼び出されたかを見ます。 case "$1" in start) # アクセス機能の提供を開始します。 action "Starting firewall: " /bin/true /etc/gfcc/rules/firewall.rule.sh action "Loading firewall modules: " /bin/true # /sbin/insmod ip_masq_autofw # /sbin/insmod ip_masq_suseeme /sbin/insmod ip_masq_ftp /sbin/insmod ip_masq_irc # /sbin/insmod ip_masq_mfw # /sbin/insmod ip_masq_portfw # /sbin/insmod ip_masq_quake /sbin/insmod ip_masq_raudio # /sbin/insmod ip_masq_user # /sbin/insmod ip_masq_vdolive echo ;; stop) action "Stoping firewall: " /bin/true echo 0 > /proc/sys/net/ipv4/ip_forward /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward echo ;; restart) action "Restarting firewall: " /bin/true $0 stop $0 start echo ;; status) # 設定内容をリスト表示します。 /sbin/ipchains -L ;; test) action "Test Mode firewall: " /bin/true /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward echo 1 > /proc/sys/net/ipv4/ip_forward /sbin/ipchains -A input -j ACCEPT /sbin/ipchains -A output -j ACCEPT /sbin/ipchains -P forward DENY /sbin/ipchains -A forward -i $PUBLIC -j MASQ echo ;; *) echo "Usage: $0 {start|stop|restart|status|test}" exit 1 esac

GFCC スクリプト

このスクリプトは Graphical Firewall program (GFCC) によって 生成されました。 これは動作するルールセットではありません。 転写されたルールセットです。 #!/bin/sh # Gtk+ ファイアウォールコントロールセンターが生成しました。 IPCHAINS=/sbin/ipchains localnet="192.168.1.0/24" firewallhost="192.168.1.1/32" localhost="172.0.0.0/8" DNS1="24.94.163.119/32" DNS2="24.94.163.124/32" Broadcast="255.255.255.255/32" Multicast="224.0.0.0/8" Any="0.0.0.0/0" mail_grennan_com="192.168.1.1/32" mark_grennan_com="192.168.1.3/32" $IPCHAINS -P input DENY $IPCHAINS -P forward ACCEPT $IPCHAINS -P output ACCEPT $IPCHAINS -F $IPCHAINS -X # input ルール $IPCHAINS -A input -s $Any -d $Broadcast -j DENY $IPCHAINS -A input -p udp -s $Any -d $Any netbios-ns -j DENY $IPCHAINS -A input -p tcp -s $Any -d $Any netbios-ns -j DENY $IPCHAINS -A input -p udp -s $Any -d $Any netbios-dgm -j DENY $IPCHAINS -A input -p tcp -s $Any -d $Any netbios-dgm -j DENY $IPCHAINS -A input -p udp -s $Any -d $Any bootps -j DENY $IPCHAINS -A input -p udp -s $Any -d $Any bootpc -j DENY $IPCHAINS -A input -s $Multicast -d $Any -j DENY $IPCHAINS -A input -s $localhost -d $Any -i lo -j ACCEPT $IPCHAINS -A input -s $localnet -d $Any -i eth1 -j ACCEPT $IPCHAINS -A input -s $localnet -d $Broadcast -i eth1 -j ACCEPT $IPCHAINS -A input -p icmp -s $Any -d $Any -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any -j ACCEPT ! -y $IPCHAINS -A input -p udp -s $DNS1 domain -d $Any 1023:65535 -j ACCEPT $IPCHAINS -A input -p udp -s $DNS2 domain -d $Any 1023:65535 -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any ssh -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any telnet -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any smtp -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any pop-3 -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any auth -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any www -j ACCEPT $IPCHAINS -A input -p tcp -s $Any -d $Any ftp -j ACCEPT $IPCHAINS -A input -s $Any -d $Any -j DENY -l # forward ルール $IPCHAINS -A forward -s $localnet -d $Any -j MASQ # output ルール GFCC を使わない RC スクリプト

これは手書きで構築したファイアウォールのルールセットです。 GFCC は使いません。

#!/bin/bash # # Firewall Script - Version 0.9.0 # chkconfig: 2345 09 99 # 概要: 2.2.x カーネル用ファイアウォールスクリプト # テストの際には # -x を追加すること。 # # 注意 - # # このスクリプトは RedHat 6.0 及びそれ以降のバージョン向けに書かれています。 # # このファイアウォールスクリプトは、大部分のダイアルアップかケーブルモデム # を使用したルータで動く筈です。 # RedHat ディストリビューション用に作成しました。 # # web や ftp サーバのような公開サービスを提供する場合は注意してください。 # # インストール - # 1. このファイルは RedHat システム用に作られています。このままで他の # ディストリビューションでも動くと思いますが、もう一度確認した方が # いいでしょう。 # もしかして動かないかもしれないから?!!? # これらの手順は RedHat システムに適用します。 # # 2. /etc/rc.d/init.d の中にこのファイルを置きます (root になって...) # "firewall" のような名前にします :-) # 所有権を root にします --> "chown root.root <ファイル名>" # 実行権をつけます --> "chmod 755 <ファイル名>" # # 3. ネットワーク、使用するインターフェース、DNS サーバの設定をします。 # uncomment で始まる行の下で、受付けサービスを選択し有効にします。 # "eth0" が使用する NIC か確認します (或はあなたのシステムのネットワーク # インターフェース名に変更します)。 # テストするには --> "/etc/rc.d/init.d/<ファイル名> start" # ルールを一覧するには --> "ipchains -L -n" # 誤りがあれば修正しましょう... :-) # # 4. RedHat の init スクリプトにファイアウォールを追加します # --> "chkconfig --add <ファイル名>" # 次回ルータを起動すると firewall サービスが自動的に起動するはずです! # *前より少しは* 脆弱でなくなっているので、夜はぐっすり寝てください。 # # リリースノート # 20 July, 1999 - 最初の作品 - Anthony Ball # 11 Dec, 1999 - Mark Grennan による更新 # ################################################ # あなたのローカルネットワークに適合する値を記入してください。 PRIVATENET=xxx.xxx.xxx.xxx/xx PUBLIC=ppp0 PRIVATE=eth0 # あなたの dns サーバの設定 DNS1=xxx.xxx.xxx.xxx DNS2=xxx.xxx.xxx.xxx ################################################ # ネットワークの設定に用いる汎用的な値を定義します。 ANY=0.0.0.0/0 ALLONES=255.255.255.255 # 関数ライブラリを読み込みます。 . /etc/rc.d/init.d/functions # ネットワーク設定を読み込みます。 . /etc/sysconfig/network # ネットワークが起動しているかチェックします。 [ ${NETWORKING} = "no" ] && exit 0 # 何が呼び出されたかを見ます。 case "$1" in start) # アクセス機能の提供を開始します。 action "Starting firewall: " /bin/true ## ## 環境設定 ## # 全てのチェインのリストを全消去します。 /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward # input チェインに蓋をかぶせて、全てのポートをふさぎます。 /sbin/ipchains -I input 1 -j DENY # ポリシーを否定 (DENY) に設定します。 (デフォルトはACCEPT) /sbin/ipchains -P input DENY /sbin/ipchains -P output ACCEPT /sbin/ipchains -P forward ACCEPT # パケットフォワーディングを有効にします。 echo 1 > /proc/sys/net/ipv4/ip_forward ## ## モジュールのインストール ## # アクティブ ftp モジュールを読み込みます。 # ローカルネットワーク上のマシンに非パッシヴ ftp アクセスが # できるようにします。 # (但し、ルータ自身はマスカレードされていないので除外されます。) if ! ( /sbin/lsmod | /bin/grep masq_ftp > /dev/null ); then /sbin/insmod ip_masq_ftp fi ## ## セキュリティ関係 ## # 現存するネットワークインターフェースおよび今後発生するであろう # ネットワークインターフェースに対し、発信アドレスの立証と偽装保護を # 有効にします。 # # if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done else echo echo "PROBLEMS SETTING UP IP SPOOFING PROTECTION. BE WORRIED." echo fi # 現存する全てのネットワークインターフェースのブロードキャストを # 否定します。 /sbin/ipchains -A input -d 0.0.0.0 -j DENY /sbin/ipchains -A input -d 255.255.255.255 -j DENY # これらはログ記録することなく否定します。 /sbin/ipchains -A input -p udp -d $ANY 137 -j DENY # NetBIOS over IP /sbin/ipchains -A input -p tcp -d $ANY 137 -j DENY # "" /sbin/ipchains -A input -p udp -d $ANY 138 -j DENY # "" /sbin/ipchains -A input -p tcp -d $ANY 138 -j DENY # "" /sbin/ipchains -A input -p udp -d $ANY 67 -j DENY # bootp /sbin/ipchains -A input -p udp -d $ANY 68 -j DENY # "" /sbin/ipchains -A input -s 224.0.0.0/8 -j DENY # Multicast addresses ## ## プライベートネットワークから発するパケットを許可します。 ## # ループバックインターフェース上の全てのパケットを許可します。 /sbin/ipchains -A input -i lo -j ACCEPT # 内部の "信頼できる" インターフェースから発せられるパケットを全て # 許可します。 /sbin/ipchains -A input -i $PRIVATE -s $PRIVATENET -d $ANY -j ACCEPT /sbin/ipchains -A input -i $PRIVATE -d $ALLONES -j ACCEPT ## ## ファイアウォールへの外部サービスを許可します。 ## # ICMP を許可します。 /sbin/ipchains -A input -p icmp -j ACCEPT # TCP を許可します。 # 【訳注: tcp syn パケット以外を許可します。】 /sbin/ipchains -A input -p tcp ! -y -j ACCEPT # (ファイアウォール上の)DNS探索を許可します。 /sbin/ipchains -A input -p udp -s $DNS1 domain -d $ANY 1023: -j ACCEPT /sbin/ipchains -A input -p udp -s $DNS2 domain -d $ANY 1023: -j ACCEPT # あるいは (より良い案として) キャッシュ DNS サーバをルータ上で # 稼動させ、上記の代わりに以下の行を用います。 # /sbin/ipchains -A input -p udp -s $DNS1 domain -d $ANY domain -j ACCEPT # /sbin/ipchains -A input -p udp -s $DNS2 domain -d $ANY domain -j ACCEPT # 以下の行で ssh を許可します。 /sbin/ipchains -A input -p tcp -d $ANY 22 -j ACCEPT # 以下の行で telnet を許可します。 (お薦めしません!!) /sbin/ipchains -A input -p tcp -d $ANY telnet -j ACCEPT # 以下の行でルータに NTP (network time protocol: ネットワーク # タイムプロトコル) を許可します。 # /sbin/ipchains -A input -p udp -d $ANY ntp -j ACCEPT # SMTP を許可します。 (メールクライアントの為ではありません - サーバ # だけです) /sbin/ipchains -A input -p tcp -d $ANY smtp -j ACCEPT # POP3 を許可します。(メールクライアント用) /sbin/ipchains -A input -p tcp -d $ANY 110 -j ACCEPT # メール送信または ftp アクセスに用いる auth プロトコルを # 許可します。 /sbin/ipchains -A input -p tcp -d $ANY auth -j ACCEPT # 外部からの HTTP アクセスを許可します。 # (ルータ上で web サーバを稼働している場合に限ります。) /sbin/ipchains -A input -p tcp -d $ANY http -j ACCEPT # 外部からの FTP アクセスを許可します。 /sbin/ipchains -A input -p tcp -d $ANY ftp -j ACCEPT ## ## マスカレード関係 ## # 内部ネットワークから転送されたパケットをマスカレードします。 /sbin/ipchains -A forward -s $PRIVATENET -d $ANY -j MASQ ## ## 上記以外の全てを拒否し、 /var/log/messages へログ記録します。 ## /sbin/ipchains -A input -l -j DENY # input チェインにかぶせていた蓋を取り外します。 /sbin/ipchains -D input 1 ;; stop) action "Stoping firewall: " /bin/true echo 0 > /proc/sys/net/ipv4/ip_forward /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward echo ;; restart) action "Restarting firewall: " /bin/true $0 stop $0 start echo ;; status) # 設定内容をリスト表示します。 /sbin/ipchains -L ;; test) ## ## とても単純なファイアウォールのテストです。 ## (*全く*セキュアではありません) ## 【訳注: パケットフィルタリングの設定を全て取り払い、 ## マスカレードの設定のみ有効にします。 ## この設定は長時間続けてはなりません。】 action "WARNING Test Firewall: " /bin/true /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward echo 1 > /proc/sys/net/ipv4/ip_forward /sbin/ipchains -A input -j ACCEPT /sbin/ipchains -A output -j ACCEPT /sbin/ipchains -P forward DENY /sbin/ipchains -A forward -i $PUBLIC -j MASQ echo ;; *) echo "Usage: $0 {start|stop|restart|status|test}" exit 1 esac APPENDEX B - RedHat 用 VPN RC スクリプト

#!/bin/sh # # vpnd 本シェルスクリプトは vpnd (Vertual Privage Network # connections / 仮想プライベートネットワーク接続) の # 起動と停止を引き受けます。 # # chkconfig: - 96 96 # 概要: vpnd # # 関数ライブラリを読み込みます。 . /etc/rc.d/init.d/functions # ネットワーク設定を読み込みます。 . /etc/sysconfig/network # ネットワークが起動しているかチェックします。 [ ${NETWORKING} = "no" ] && exit 0 [ -f /usr/sbin/vpnd ] || exit 0 [ -f /etc/vpnd.conf ] || exit 0 RETVAL=0 # 何が呼び出されたかを見ます。 case "$1" in start) # デーモンの起動。 echo -n "Starting vpnd: " daemon vpnd RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/vpnd echo ;; stop) # デーモンの停止。 echo -n "Shutting down vpnd: " killproc vpnd RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/vpnd echo ;; restart) $0 stop $0 start ;; *) echo "Usage: vpnd {start|stop|restart}" exit 1 esac exit $RETVAL 日本語訳について

この文書は Firewalling and Proxy Server HOWTO v0.83, August 21, 2000 版の日本語訳です。

v0.4, 8 November 1996 は、こじまみつひろさん <isle@st.rim.or.jp> が日本語に翻訳しました。(1997/03/26)

Firewalling and Proxy Server HOWTO v0.83, August 21, 2000 版 日本語訳: 2001年 9月 22日 JF Project 「チーム Firewall」 翻訳者一覧(敬称略): 1章 皆川哲朗 <jn7vvc@hkg.odn.ne.jp> 松田陽一 <matsuda@palnet.or.jp> 2章から4章 松田陽一 <matsuda@palnet.or.jp> 5章から11章 中谷千絵 <jeanne@mbox.kyoto-inet.or.jp> 12章から16章 野本浩一 <hng@ps.ksky.ne.jp>

この文書を翻訳するにあたり、以下の方々からアドバイスをいただきました。(50音順) 本当にありがとうございました。

1章から4章 MATSUDA Yoh-ichi さん <matsuda@palnet.or.jp> MIZUHARA Bun さん <mizuhara@acm.org> NAKANO Takeo さん <nakano@apm.seikei.ac.jp> TAKEI Nobumitsu さん <takei@webmasters.gr.jp> OBATA Noboru さん <obata-ml@bk.iij4u.or.jp>

5章から11章 NAKANO Takeo さん <nakano@apm.seikei.ac.jp> TAKEI Nobumitsu さん <takei@webmasters.gr.jp> HAYAKAWA Hitoshi さん <uv9h-hykw@asahi-net.or.jp> Seiji Kaneko さん <se-kane@str.hitachi.co.jp> kanjikanji さん <kanjikanji@club-internet.fr>

12章から16章 山田慎也さん <trueheart@anet.ne.jp> Seiji Kanekoさん <skaneko@a2.mbn.or.jp> Hiro YAMAZAKIさん <hiro@linux.or.jp> Konkitiさん <konkiti@lares.dti.ne.jp> 佐野武俊さん <kgh12351@nifty.ne.jp> Masaharu Goto さん <magotou@fubyshare.gr.jp> Keitaro Yosimura さん <ramsy@linux.or.jp> Tsutomu Kawashima さん <kawawa@mail.interq.or.jp> NAKANO Takeo さん <nakano@apm.seikei.ac.jp>