Merge the following from the English version:

1.32 -> 1.39	articles/dialup-firewall/article.sgml

Submitted by:	Hiroo Ono <hiroo at oikumene dot gcd dot org>
Reference:	[doc-jp-work 928]
This commit is contained in:
Hideyuki KURASHINA 2004-10-27 15:07:54 +00:00
parent 84a4762814
commit 8bae569f65
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=22702

View file

@ -2,7 +2,7 @@
The FreeBSD Documentation Project
The FreeBSD Japanese Documentation Project
Original revision: 1.32
Original revision: 1.39
$FreeBSD$
-->
@ -45,7 +45,9 @@
特に動的に割り当てられた
IP アドレスによるダイアルアップ上のファイアウォールについて、
事実を元に詳細に説明します。
なお、前段階である PPP 接続についての設定は触れていません。</para>
なお、始めにしなければならない PPP 接続の設定については触れて
いません。PPP 接続の設定について詳しいことは、&man.ppp.8; のマ
ニュアルを参考にしてください。</para>
</abstract>
</articleinfo>
@ -56,24 +58,24 @@
<para>
この文書はあなたの ISP によって
IP アドレスを動的に割り当てられた時、
FreeBSD でファイアウォールをセットアップするために
要求される手順を扱うことをめざしたものです。
IP アドレスが動的に割り当てられる場合に、FreeBSD で
ファイアウォールを設定するのに必要な手順の概略を述べるものです。
この文書を可能な限り有益で正確なものにするために努力しているので、
どうぞ意見や提案を
どうぞ修正、意見や提案を
<email>marcs@draenor.org</email>
に送って下さい。</para>
宛で著者に送って下さい。</para>
</sect1>
<sect1 id="kernel">
<title>カーネルオプション</title>
<para>
最初になすべきことはカーネルを再コンパイルすることです。
カーネルを再コンパイルする方法についてさらに情報が必要なら、
<ulink URL="../../books/handbook/kernelconfig.html">ハンドブックの
カーネルのコンフィグレーションの節</ulink>から読み始めるのが最適でしょう。
カーネルを以下のオプションをつけてコンパイルする必要があります:</para>
<para>IPFW を使うためには、それに対応するようにカーネルを
コンパイルしなければなりません。
カーネルを再コンパイルする方法についてのさらなる情報は、
<ulink url="&url.books.handbook;/kernelconfig.html">ハンドブックの
カーネルのコンフィグレーションの節</ulink>をご覧ください。
IPFW に対応するには、カーネルの設定ファイルに以下のオプションを
追加しなければなりません。</para>
<variablelist>
<varlistentry>
@ -81,21 +83,17 @@
<listitem>
<para>カーネルのファイアウォールのコードを有効にします。</para>
<note><para>この文書では、&os; 5.X を動かしていると仮定して
います。&os; 4.X を動かしているユーザーは、カーネルを
<emphasis>IPFW2</emphasis> に対応するよう
再コンパイルしなければなりません。&os; 4.X のユーザーは、
システムで IPFW2 を利用するための詳細は
&man.ipfw.8; のマニュアルページを参考にしてください。特に、
<emphasis>USING IPFW2 IN FreeBSD-STABLE</emphasis>
という節は注意深く読んでください。</para></note>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>options IPFW2</literal></term>
<listitem>
<para>新しいバージョンの IPFW を有効にします。</para>
<important><para>FreeBSD 4.X を運用している場合にのみ、
このオプションをつけてください。
(訳注: FreeBSD 5.X のような) 最近の FreeBSD では、
これがデフォルトになっています。</para></important>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>options IPFIREWALL_VERBOSE</literal></term>
@ -106,72 +104,36 @@
<varlistentry>
<term><literal>options
IPFIREWALL_VERBOSE_LIMIT=<replaceable>100</replaceable></literal></term>
IPFIREWALL_VERBOSE_LIMIT=<replaceable>500</replaceable></literal></term>
<listitem>
<para>
記録されるマッチするエントリの数を制限します。
これはログファイルがたくさんの繰返しのエントリで一杯になるのを抑制します。
<replaceable>100</replaceable> は使用上無理のない数ですが、
自分の要求に基づいて調整することができます。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>options IPDIVERT</literal></term>
<listitem>
<para><emphasis>divert</emphasis>ソケット
(後述) を有効にします。</para>
<para>当てはまるエントリが記録されうる数を制限します。
これは、サービス不能 (DoS) 攻撃が起きても、syslog が溢れる
危険を避けて、ファイアウォールの活動を記録できるようにします。
<replaceable>500</replaceable> は妥当な数ですが、あなたの
要件に基づいて調整できます。</para>
</listitem>
</varlistentry>
</variablelist>
<para>
更なるセキュリティのために、
カーネルの中に組み込むことのできるオプションが他にいくつかあります。
これらはファイアウォールを動かすためには必要ではありませんが、
セキュリティに猛烈にこだわるユーザは有効にしてかまいません。</para>
<variablelist>
<varlistentry>
<term><literal>options TCP_DROP_SYNFIN</literal></term>
<listitem>
<para>
このオプションは SYN と FIN のフラグをもった
TCP パケットを無視します。
これは マシンの TCP/IP スタックを識別するので
<filename role="package">security/nmap</filename>
などのようなツールを妨げることができます。
しかし RFC1644 拡張のサポートに違反しています。
これは現在稼働している
web サーバには推奨<emphasis>しません</emphasis>。</para>
</listitem>
</varlistentry>
</variablelist>
<para>
いったんカーネルを再コンパイルしたら再起動しないで下さい。
希望的にも、
ファイアウォールの設置を完了するために一回だけ再起動する必要があります。</para>
<warning><para>カーネルの再コンパイルが完了しても、システムを
<emphasis>再起動しないで</emphasis>下さい。
そうしてしまうと、結果的にシステムから閉め出されてしまう
可能性があります。ルールセットを適切に配置し、関連する設定ファイルを
すべて更新するまでは再起動してはいけません。</para></warning>
</sect1>
<sect1 id="rcconf">
<title>ファイアウォールを搭載するように
<filename>/etc/rc.conf</filename> を変更する</title>
<para>
ファイアウォールを機能させるために、
<filename>/etc/rc.conf</filename>
<para>システムでファイアウォールを有効にし、ルールファイルのありかを
指定するために <filename>/etc/rc.conf</filename>
を若干変更する必要があります。
単純に以下の行を加えてください。</para>
<filename>/etc/rc.conf</filename> に以下の行を加えてください。</para>
<programlisting>firewall_enable="YES"
firewall_script="/etc/firewall/fwrules"
natd_enable="YES"
natd_interface="tun0"
natd_flags="-dynamic"</programlisting>
firewall_script="/etc/firewall/fwrules"</programlisting>
<para>
上記の設定に関するより詳しい情報は
@ -180,203 +142,134 @@ natd_flags="-dynamic"</programlisting>
</sect1>
<sect1>
<title>PPP のネットワークアドレス変換を効にする</title>
<title>PPP のネットワークアドレス変換を効にする</title>
<para>
もしかすると既に PPP の組込みネットワークアドレス変換
(NAT) を利用しているかも知れません。
それを無効化しなければならない場合であるなら、
&man.natd.8; の例を使い、同じようにして下さい。</para>
<para>
既に PPP の自動スタートのエントリのまとまりがあるなら、
多分こんなふうになっているでしょう:</para>
<para>ネットワーク内のクライアントがゲートウェイ経由で接続できる
ようにするには、PPP のネットワークアドレス変換 (NAT) を有効に
しなければなりません。PPP の NAT 機能を利用するには、次の行を
<filename>/etc/rc.conf</filename> に追加してください。</para>
<programlisting>ppp_enable="YES"
ppp_mode="auto"
ppp_nat="YES"
ppp_profile="<replaceable>profile</replaceable>"</programlisting>
ppp_profile="<replaceable>your_profile</replaceable>"</programlisting>
<para>
もしそうなら、<filename>/etc/rc.conf</filename> に
(訳注: <filename>/etc/defaults/rc.conf</filename> で定義されている
<literal>ppp_nat</literal> の初期値は <literal>YES</literal> なので)
<literal>ppp_nat="NO"</literal>
を明示的に設定して無効にする必要があります。
また <filename>/etc/ppp/ppp.conf</filename> の中の
<literal>nat enable yes</literal> または
<literal>alias enable yes</literal> を削除する必要があるでしょう。</para>
<note><para><literal>your_profile</literal> をあなた自身のダイアル
アッププロファイルに変更するようにしてください。</para></note>
</sect1>
<sect1 id="rules">
<title>ファイアウォールへのルールセット</title>
<para>
さて、ほとんどのことをやりおわりました。
残る最後の仕事はファイアウォールのルールを定義することです。
それから再起動すると、ファイアウォールが立ち上がり稼働するはずです。
私はルールベースを定義する段階に達すると、
すべての人が若干異なる何かを求めているのだと実感しています。
私が努力してきたのは、
ほとんどのダイアルアップユーザに適合したルールセットを書くことです。
あなたは自分の必要のために以下のルールを土台として用いることによって
自分用のルールベースに変更することができます。
まず、閉じたファイアウォールの基礎から始めましょう。
望むのは初期状態ですべてを拒否することです。
それからあなたが本当に必要とすることだけのためにファイアウォールをあけましょう。
ルールはまず許可し、それから拒否するという順番であるべきです。
その前提はあなたの許可のための規則を付加するということで、
それから他の全ては拒否されます。:)</para>
<para>ここであなたのシステム用のファイアウォールルールを定義します。
私たちが記述するルールセットは、大部分のダイアルアップユーザ向けの
一般的な雛型です。ユーザ毎の要求にぴったり合わないでしょうが、IPFW
の動作について基本的な理解を得られ、要求に合わせて設定を変更する
のは結構簡単なはずです。</para>
<para>
では <filename class="directory">/etc/firewall</filename>
ディレクトリを作成しましょう。
<para>まずは、閉鎖的なファイアウォールの基礎から始めましょう。閉鎖的な
ファイアウォールは、設定がない場合はすべて拒否するという考えに
基づいています。それから、管理者は許可したい通信用のルールを明示的に
追加できます。通信用のルールは、許可が先でそれから拒否という
順番であるべきです。許可したいものすべてについてルールを追加して、
それ以外はすべて自動的に拒否されることを前提とします。</para>
<para>それでは、ファイアウォールのルールを保存するディレクトリを
作成しましょう。この例では、
<filename class="directory">/etc/firewall</filename> を用います。
ディレクトリをそこへ変更し、
<filename>rc.conf</filename> で規定した
<filename>fwrules</filename> ファイルを編集します。
このファイル名を自分が望む任意のものに変更できるということに気をつけてください。
この手引きはファイル名の一例を与えるだけです。</para>
この手引きはあなたが使おうとするかもしれないファイル名の一例を
与えるだけです。</para>
<para>
それでは、ファイアウォールファイルの設定例を見てみましょう。
注釈も参考にしてください。</para>
<para>それでは、きちんと注釈が施されたファイアウォールファイルの
例を見てみましょう。</para>
<programlisting># (/etc/rc.firewall にあるように) 参照を簡単にするためにファイアウォールの
# コマンドを定義します。読みやすくするのに役立ちます。
fwcmd="/sbin/ipfw"
# 再読込みする前に現在のルールの消去を強制します。
# 外向けインタフェースを定義します。ユーザーランド ppp では、
# 何も設定しないと tun0 になります。
oif="tun0"
# 内向けインタフェースを定義します。通常はネットワークカードに
# なります。これを必ずあなたのネットワークインタフェースに
# 合わせて変更するようにしてください。
iif="fxp0"
# ルールを再読込みする前に、現在のルールを強制的に消去します。
$fwcmd -f flush
# トンネルインタフェースを通じてすべてのパケットを divert します。
$fwcmd add divert natd all from any to any via tun0
# 動的ルールを持つすべての接続を許可します。ただし、動的ルールを持たない
# RST か ACK ビットがセットされている TCP 接続は拒否します。
# 詳細は ipfw(8) をご覧ください。
# すべてのパケットの状態を確認します。
$fwcmd add check-state
$fwcmd add deny tcp from any to any established
# ローカルホスト内のすべての接続を許可します。
$fwcmd add allow tcp from me to any out via lo0 setup keep-state
$fwcmd add deny tcp from me to any out via lo0
$fwcmd add allow ip from me to any out via lo0 keep-state
# 外向けインタフェース側でなりすましを防ぎます。
$fwcmd add deny ip from any to any in via $oif not verrevpath
# 自分が着手した、自ネットワークからのすべての接続を許可します。
Allow all connections from my network card that I initiate
$fwcmd add allow tcp from me to any out xmit any setup keep-state
$fwcmd add deny tcp from me to any
$fwcmd add allow ip from me to any out xmit any keep-state
# 私たちが開始した接続はすべて許可し、状態を保存します。
# しかし、動的なルールを持たない確立した接続は拒否します。
$fwcmd add allow ip from me to any out via $oif keep-state
$fwcmd add deny tcp from any to any established in via $oif
# 以下のサービスへ接続することをインターネット上のすべての人に許可します。
# この例では sshd とウェブサーバへの接続を許可します。
$fwcmd add allow tcp from any to me dst-port 22,80 in recv any setup keep-state
# ネットワーク内の接続はすべて許可します。
$fwcmd add allow ip from any to any via $iif
# すべての ident パケットに RESET を送ります。
$fwcmd add reset log tcp from any to me 113 in recv any
# ローカルな通信をすべて許可します。
$fwcmd add allow all from any to any via lo0
$fwcmd add deny all from any to 127.0.0.0/8
$fwcmd add deny ip from 127.0.0.0/8 to any
# ICMP プロトコルを有効にします。自ホストを ping(8) に応答させたくなければ、
# インターネット側のユーザに 22 番と 80 番ポートへ接続することを
# 許可します。この例では、sshd とウェブサーバへの接続を特に許可しています。
$fwcmd add allow tcp from any to me dst-port 22,80 in via $oif setup keep-state
# ICMP パケットを許可します。ホストを ping(8) に応答させたくなければ、
# icmptypes から 8 を削除してください。
$fwcmd add allow icmp from any to any icmptypes 0,3,8,11,12,13,14
$fwcmd add allow icmp from any to any via $oif icmptypes 0,3,8,11,12
# 残りの全てを拒否します。
# 残りのすべてを拒否して記録します。
$fwcmd add deny log ip from any to any</programlisting>
<para>
あなたは 22 番と 80 番のポートへの接続を許可し、
それ以外に試みられるすべての接続を記録する
十分に機能的なファイアウォールを手にしました。
では、あなたは安全に再起動することができて、
あなたのファイアウォールはうまく立ち上がるはずです。
もしこれに正しくないことを見つけたら、
もしくは任意の問題を経験したら、
さもなくばこのページを向上させるための任意の提案があるなら、
そのいずれにしても、どうか私に電子メールを下さい。</para>
<para>22 番と 80 番ポートへの接続のみを許可し、それ以外に試みられた
接続はすべて記録する、完全に機能するファイアウォールができました。
これで安全に再起動することができ、ファイアウォールが自動的に
起動してルールセットが読み込まれるはずです。
もしこれに何か間違いを見つけたり、何か問題に当たったり、
このページを改善する提案があるなら、
どうか私に電子メールを送って下さい。</para>
</sect1>
<sect1>
<title>質問</title>
<qandaset>
<qandaentry>
<question>
<para>
組込みの &man.ppp.8; フィルタを使ってもよいのに、
なぜ &man.natd.8; と &man.ipfw.8 を使っているのですか?</para>
</question>
<answer>
<para>
正直に言うと、
組込みの <command>ppp</command> フィルタの代わりに
<command>ipfw</command> と <command>natd</command>
を使う決定的な理由はないと言わなければなりません。
いろいろな人と繰り返してきた議論より、
<command>ipfw</command> は確かに
<command>ppp</command> フィルタよりもパワフルで設定に融通がきく一方、
それが機能的であるために作り上げたものはカスタマイズの容易さを
失っているということで意見の一致をみたようです。
私がそれを使う理由のひとつはユーザランドのプログラムでするよりも、
カーネルレベルで行うファイアウォールの方を好むからです。</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>
<errorname>limit 100 reached on entry 2800</errorname>
のようなメッセージを受け取った後、
ログの中にそれ以上の拒否を全く見なくなりました。
<errorname>limit 500 reached on entry 2800</errorname>
のようなメッセージが出た後、私のマシンはそのルール番号に対
応する拒否されたパケットを記録しなくなりました。
ファイアウォールはまだ動作しているのでしょうか?</para>
</question>
<answer>
<para>
単にルールのログカウントが最大値に達したということを意味しています。
ルール自身はまだ機能していますが、
<para>単にそのルールのログカウントが最大値に達した
ということを意味しています。ルール自体はまだ機能していますが、
ログカウンタをリセットするまでそれ以上ログを記録しません。
<command>ipfw resetlog</command> コマンドにより、
ログカウンタをリセットすることができます。
また、この限界値を上述の
カウンタのリセット方法の例を以下に示します。</para>
<screen>&prompt.root; <userinput>ipfw resetlog</userinput></screen>
<para>また、この限界値を上述の
<option>IPFIREWALL_VERBOSE_LIMIT</option> オプションで
変更することもできます。
さらに、この値は (カーネルを再構築して再起動せずに)
net.inet.ip.fw.verbose_limit を
&man.sysctl.8; で変更することができます。</para>
さらに、この限界値は (カーネルを再構築して再起動せずに)
&man.sysctl.8; の net.inet.ip.fw.verbose_limit 変数により
変更することもできます。</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>
もし内部で 192.168.0.0
の範囲のようなプライベートアドレスを使用しているなら、
<literal>$fwcmd add deny all from any to 192.168.0.0:255.255.0.0 via tun0</literal>
のようなコマンドを
内部のマシンへ試みられる外部からの接続を防止するために
ファイアウォールのルールに追加してもいいですか?</para>
</question>
<answer>
<para>
端的な答えは no です。
この問題に対するその理由は
<command>natd</command> は
<devicename>tun0</devicename> デバイスを通して divert されている
<emphasis>あらゆるもの</emphasis>
に対してアドレス変換を行っているということです。
それが関係している限り、
入ってくるパケットは動的に割り当てられた
IP アドレスに対してのみ話し、
内部ネットワークに対しては<emphasis>話さない</emphasis>のです。
ファイアウォール経由で外へ出て行くホストから
あなたの内部ネットワーク上のホストを制限する
<literal>$fwcmd add deny all from 192.168.0.4:255.255.0.0 to any via tun0</literal>
のようなルールを追加することができるということにも気をつけてください。</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>