FIREWALL(7) FreeBSD 多方面の情報マニュアル FIREWALL(7)
名称
firewall − FreeBSD で動作する簡単なファイアウォール |
ファイアウォールの基礎
ファイアウォールは一般に、外部から行われるネットワーク内部への不正なアク セスを防ぐために使われます。また、LAN 内だけでサービスされるべき NFS や SMBFS のようなサービスに対して、内部の IP アドレスを偽装して外部から行わ れる攻撃を防ぐためにも用いられます。 また、 FreeBSD のファイアウォール機構は、 dummynet(4) を用いた帯域制限を 行うこともできます。この機能は特に重要な目的のために帯域幅を保証したい場 合などに有効でしょう。たとえば、オフィスの T1 (1.5MBits/s) を用いてビデオ 会議を行う場合に、他の通信を 1MBits/s までに押えて、ビデオ会議用のコネク ションに最低でも 0.5MBits/s を確保することができます。また同様に、共用機 器で有名なウェブサイトや FTP サイトを運用している場合には、プロバイダから の高額な帯域課金を避けるために使うこともできます。 それから、 FreeBSD のファイアウォール機構はパケットが正しい到達先に行くよ うにパケットを divert したり、次のホップのアドレスを変更したりすることも できます。パケットの divert は主に、プライベート IP アドレス空間から外部 へのブラウズなどのアクセスを可能にする NAT (ネットワークアドレス変換) を 実現するために用いられます。 ファイアウォールを構築することは簡単なようですが、多くの人が間違いを犯し ています。最も多い間違いは、包括的なファイアウォールでなく、排他的なファ イアウォールを作ってしまうことです。排他的なファイアウォールは、ルール セットに適合しなかったすべてのパケットを通過させるもので、包括的なファイ アウォールはルールセットにマッチしたパケットだけを通過させます。包括的な ファイアウォールのほうが、排他的なものよりもはるかに安全ですが、正しく動 くものを作るのが難しくなります。次に多い間違いは、通過させたくないものす べてを廃棄してしまうことです。TCP/IP が正常に動作するためには、たとえば MTU ディスカバリの実装のように、いくつかの ICMP エラーを必要とします。同 様に、多くのデーモンは、コネクションを要求するユーザを認証するために、 auth サービスに逆向きのコネクションを張ります。auth は危険ですが、正しい 対応はただパケットを廃棄するのでなく、TCP reset を返すようにすることで す。以下で示す、ファイアウォールのサンプルではこれらの事項を満たすように してあります。 |
IPFW を使うためのカーネルの設定
IP ファイアウォールの機能を使用するためには、カスタムカーネルを作成する必 要はありません。 /etc/rc.conf (後述) でファイアウォールを有効にすれば、 ipfw カーネルモジュールが必要な時に自動的にロードされます。あなたが偏執し たいならば、 IPFIREWALL オプションを設定することで、IPFW を直接 FreeBSD カーネルに組み込むこともできます。このファイアウォールは、何も設定しない とすべてのパケットを通過させないようになっています。 /etc/rc.conf で、再 起動時に適切なルールセットを読み込むようになっていないと、コンソールに触 ることができない場合、マシンにアクセスすらできなくなります。また、新しい リリースのカーネルに更新する時に、バイナリ (訳注: コマンドやライブラリの こと) を更新する前にリブートを実行してしまうことがよくあります。この結果 ipfw(8) とカーネルが非互換になってしまい、ブートシーケンスで ipfw(8) が動 作しないことにより、マシンにアクセスできなくなってしまいます。このため に、 IPFIREWALL_DEFAULT_TO_ACCEPT というカーネルオプションが用意されてお り、これによってファイアウォールの初期状態をすべてのパケットを通過させる 設定にすることができます。しかし、このオプションを設定することは、システ ムブート中の短期間、ファイアウォールが全パケットを通すかもしれないことに 注意してください。それでも本オプションの使用は、 FreeBSD ファイアウォール に十分慣れるまでの期間には有用です。どのように動作するかすべて分かった ら、これを削除して、抜け穴を塞いてください。第 3 のオプションとして、 IPDIVERT があります。これは、ファイアウォールがパケットをユーザプログラム に divert することができるようにするもので、 natd(8) によって、プライベー トネットワークから外部へアクセスできるようにするときに必要です。トラ フィックタイプによる帯域制限には、 ipfw pipe ルールを有効にするために、 DUMMYNET オプションが必要です。 |
IPFW によるファイアウォールの例
ここに示すのは、3 つのインタフェースカードをもつマシンで動作している ipfw ベースのファイアウォールの例です。 fxp0 が「外側の」LAN に接続されていま す。この LAN 上のマシンは、10. で始まる内部 IP アドレスと、インターネット にルーティングされる IP アドレスを持ち、デュアルホームとなっています。た とえば、 192.100.5.x がインターネットにルーティングされる IP ブロックを指 し、 10.x.x.x が内部ネットワークを指します。例として適切ではないかもしれ ませんが、 10.0.1.x が fxp0 の接続されている LAN のアドレス、 10.0.2.x が fxp1 の接続されている LAN のアドレス、そして 10.0.3.x が fxp2 のものであ るとします。 この例では、3 つの LAN すべてをインターネットから隔離し、またそれぞれをも 隔離したいものとします。同時に、すべての内部アドレスから、このマシンで 走っている NAT ゲートウェイを経由してインターネットへアクセスが可能である ようにします。NAT ゲートウェイを動作させるためには、fxp0 に内部アドレスの 10. のほかに、インターネットから見えるアドレスを持たせる必要があります。 このアドレス (ここでは示していません) が、このマシンの公式なアドレスであ り、もうひとつの外部から見えるアドレス (この例では 192.100.5.5 です) が NAT ゲートウェイとしてのアドレスとなります。この例は、外部から見える LAN のマシンにも内部アドレス 10.0.0.x を割り当てることによって、すこし複雑に なっています。しかしこの方法によって、内部サービスは内部アドレスにのみバ インドし、インターネットから守れます。外から見える IP アドレスにバインド するサービスは、インターネットに対して公開しようとするものだけにするので す。 この例では、ネットワーク 10.0.0.x はファイアウォールによって保護されてい ません。このネットワークを外部からのアドレス偽装から守るために、インター ネットルータによる保護を確認して下さい。また例では、外部から見えるホスト が内部 IP アドレスを通じてサービスを操作する場合、内部のネットワークに非 常に自由にアクセス可能としています。この方法にはいくらかのセキュリティ上 の危険が伴っており、外部から見えるホストに問題がある場合には何が起きるか わかりません。この危険を回避するためには、ルール 01010 と 01011 を削除し て、 LAN0 経由で入ってくるものすべてを firewall を経由するようにするべき です。 また、この例では内部アドレス空間を使うことがファイアウォールによる保護機 構の重要な点であることに着目してください。適切なアドレス偽装対策を行うこ とにより、外部から、内部 (LAN1 および LAN2) のホストに直接アクセスするこ とは不可能となります。 # /etc/rc.conf # firewall_enable="YES" firewall_type="/etc/ipfw.conf" # ファイアウォールを通過する一時的なポート割り当ての範囲を設定 # # 注意 : ファイアウォールを通じて行われるサービスの負荷が高い場合には、 # より広いポート割当の範囲を必要とすることになります。そのような際には # 4000-10000 や 4000-30000 がより良い選択でしょう。 ip_portrange_first=4000 ip_portrange_last=5000 ... # /etc/ipfw.conf # # FIREWALL: ファイアウォール兼 NAT ゲートウェイ |
# LAN0 |
10.0.0.X と 192.100.5.X (デュアルホーム) |
||
# LAN1 |
10.0.1.X |
||
# LAN2 |
10.0.2.X |
||
# sw: |
イーサネットスイッチ (管理対象外) |
# |
# |
natd -s -u -a 208.161.114.67 |
# #
高い帯域のアクセスがルールセット全体を通過していくのを防ぐためのショート #
アドレス偽装防止のルールです。これは、内部ネットワークのパケットを #
この例のルールセットでは、内部ホスト間には何の制約も設けていません。 # 特定の LAN
からは特定のサービスへのアクセスを許可する場合 # 内部と外部の LAN の横断を許可する一般的なサービス # 同様のサービスを TCP
についても許可します。ここでも、外部から見える # いくつかのタイプの ICMP
を通過させることは重要です。 |
# |
0 |
エコーリプライ |
||
# |
3 |
到達不能 |
||
# |
4 |
始点抑制 (通常は許可されません) |
||
# |
5 |
リダイレクト (通常は許可されません。危険です !) |
||
# |
8 |
エコー |
||
# |
11 |
時間超過 |
||
# |
12 |
パラメータ問題 |
||
# |
13 |
タイムスタンプ |
||
# |
14 |
タイムスタンプリプライ |
# add 04000 allow icmp from any to any icmptypes 0,3,8,11,12,13,14 #
ここまで通って残ったフラグメントのログをとります。役にたつかもしれ |
内部向け、外部向けサービスのポートバインディング
マルチホームなホストで、サービスをどちらのアドレスにバインドするかという ことについて触れましたが、説明はしていません。複数の IP アドレスを持つホ ストでは、それぞれのサービスをすべての IP アドレスにバインドするのではな く、特定の IP アドレスやインタフェースにバインドすることが可能です。たと えばこの例のファイアウォールマシンには、インタフェースが 3 つあり、その 1 つには 2 つの外部から見える IP アドレスがあるので、このマシンには 5 つの IP アドレス (10.0.0.1, 10.0.1.1, 10.0.2.1, 192.100.5.5, 192.100.5.1) があ ることになります。Windows の LAN セグメント (LAN1 とします) に対してファ イル共有サービスを提供するのであれば、samba の ’bind interfaces’ という設 定項目で、LAN1 の IP アドレスにだけ samba をバインドできます。こうするこ とで、他の LAN セグメントではこのファイル共有サービスを利用できなくなりま す。また、LAN2 に UNIX エンジニアリングワークステーションがあれば、nfsd を 10.0.2.1 にバインドするように設定することで NFS でも同様のことができま す。どのサービスをどのようにバインドするかはほとんどの場合に指定できます し、またそれが指定できない場合には jail(8) を使うことによって、間接的にそ れを行うこともできます。 |
関連項目
ipnat(1), dummynet(4), ipnat(5), rc.conf(5), smb.conf(5) (ports/net/samba), samba(7) (ports/net/samba), config(8), ipfw(8), jail(8), natd(8), nfsd(8) |
関連文書
歴史
firewall マニュアルページは最初、 Matthew Dillon によって書かれ、2001 年 5 月に FreeBSD 4.3 ではじめて登場しました。 FreeBSD 10.0 May 26, 2001 FreeBSD 10.0 |