Date: Tue, 31 Oct 2017 12:41:12 +0000 (UTC) From: Ryusuke SUZUKI <ryusuke@FreeBSD.org> To: doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org Subject: svn commit: r51161 - head/ja_JP.eucJP/books/handbook/security Message-ID: <201710311241.v9VCfCux063031@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ryusuke Date: Tue Oct 31 12:41:12 2017 New Revision: 51161 URL: https://svnweb.freebsd.org/changeset/doc/51161 Log: - Merge the following from the English version: r32503 -> r32597 head/ja_JP.eucJP/books/handbook/security/chapter.xml Modified: head/ja_JP.eucJP/books/handbook/security/chapter.xml Modified: head/ja_JP.eucJP/books/handbook/security/chapter.xml ============================================================================== --- head/ja_JP.eucJP/books/handbook/security/chapter.xml Tue Oct 31 12:27:38 2017 (r51160) +++ head/ja_JP.eucJP/books/handbook/security/chapter.xml Tue Oct 31 12:41:12 2017 (r51161) @@ -3,7 +3,7 @@ The FreeBSD Documentation Project The FreeBSD Japanese Documentation Project - Original revision: r32503 + Original revision: r32597 $FreeBSD$ --> <chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="security"> @@ -3367,9 +3367,7 @@ Connection closed by foreign host.</screen> </authorgroup> </info> - <para>この節では、FreeBSD と - <application>µsoft.windows; 2000/XP</application> - からなる環境において、IPsec を設定し、利用する過程を通じて、 + <para>この節では、IPsec を設定する過程を通して、 IPsec を使った安全な通信の実現方法について解説します。 IPsec を設定するためには、 カスタムカーネルの構築方法をよく知っている必要があります @@ -3384,45 +3382,6 @@ Connection closed by foreign host.</screen> <link xlink:href="http://www.kame.net/">KAME</link> 実装をベースとしています。</para> - <note> - <para>FreeBSD には <quote>hardware - accelerated</quote> IPsec スタックが含まれています。 - これは、<quote>Fast IPsec</quote> として知られているもので、 - OpenBSD から移植されました。 - IPsec のパフォーマンスを最適化するために、(利用できる場合には) - &man.crypto.4; サブシステムを経由して、 - 暗号ハードウェアを使用します。 - このサブシステムは新しいので、まだ IPsec の KAME - 版で利用可能な機能のすべてに対応しているわけではありません。 - しかしながら、hardware-accelerated IPsec を有効にするためには、 - カーネルコンフィグレーションファイルに以下のカーネルオプションを追加する必要があります。</para> - - <indexterm> - <primary>カーネルオプション</primary> - <secondary>FAST_IPSEC</secondary> - </indexterm> - - <screen> -options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) - </screen> - - <para>現在の時点では、<quote>Fast IPsec</quote> - サブシステムを IPsec の KAME 実装のかわりに使うことはできません。 - より多くの情報については、&man.fast.ipsec.4; - を参照してください。</para> - </note> - - <note> - <para>ファイアウォールが適切に &man.gif.4; - も追跡できるようにするには、 - カーネルコンフィグレーションにおいて、 - <option>IPSEC_FILTERGIF</option> を有効にする必要があります。</para> - - <screen> -options IPSEC_FILTERGIF #filter ipsec packets from a tunnel - </screen> - </note> - <indexterm> <primary>IPsec</primary> <secondary>ESP</secondary> @@ -3485,14 +3444,9 @@ options IPSEC_FILTERGIF #filter ipsec packets from <secondary>IPSEC</secondary> </indexterm> - <indexterm> - <primary>カーネルオプション</primary> - <secondary>IPSEC_ESP</secondary> - </indexterm> - <screen> options IPSEC #IP security -options IPSEC_ESP #IP security (crypto; define w/ IPSEC) +device crypto </screen> <indexterm> @@ -3519,8 +3473,10 @@ options IPSEC_DEBUG #debug for IP security </sect2> <sect2> - <title>シナリオ: インターネットに接続している 2 つのネットワークが - 1 つのネットワークとして振る舞う</title> + <title>シナリオ: 家庭と会社の + 2 つのネットワークが共にインターネットに接続されています。 + この 2 つのネットワークを、<acronym>VPN</acronym> によって + 1 つのネットワークのように扱えるようにします。</title> <indexterm> <primary>VPN</primary> @@ -3534,7 +3490,7 @@ options IPSEC_DEBUG #debug for IP security <para>少なくとも 2 つのサイトを持っています。</para> </listitem> <listitem> - <para>どちらの際とも内部で IP を使っています。</para> + <para>どちらのサイトとも内部で IP を使っています。</para> </listitem> <listitem> <para>2 つのサイトは、FreeBSD で運用されているゲートウェイを通して、 @@ -3547,841 +3503,311 @@ options IPSEC_DEBUG #debug for IP security <listitem> <para>2 つのネットワークの内部アドレスは、 パブリックでもプライベート IP アドレスでも構いません。 - 必要であれば、ゲートウェイコンピュータで - NAT を走らせることもできます。</para> + IP アドレスは衝突してはいけません。たとえば、両方のネットワークが + <systemitem class="ipaddress">192.168.1.x</systemitem> + を使ってはいけません。</para> </listitem> - <listitem> - <para>2 つのネットワークの内部 IP アドレスは、 - <emphasis>衝突してはいけません</emphasis>。 - VPN 技術と NAT を用いることで、理論的には、 - そのようなことは可能と考えますが、 - その設定は悪夢でしょう。</para> - </listitem> </itemizedlist> - - <para>2 つのネットワークに接続を試みた際に、 - 両方のネットワークで同じ範囲の内部 IP - アドレスが使われていることに気づいたら - (たとえば、両方で - <systemitem class="ipaddress">192.168.1.x</systemitem> - を使用している場合)、 - どちらかの番号を振りなおす必要があります。</para> - - <para>VPN の文書では、同じ ASCII - アートを使うことがルールになっているので、 - この文書でも例外ではなく同様にアスキーアートを用います。</para> - - <para>ネットワークのトポロジは以下のようになります。</para> + </sect2> - <screen> -Network #1 [ Internal Hosts ] Private Net, 192.168.1.2-254 - [ Win9x/NT/2K ] - [ UNIX ] - | - | - .---[fxp1]---. Private IP, 192.168.1.1 - | FreeBSD | - `---[fxp0]---' Public IP, A.B.C.D - | - | - -=-=- Internet -=-=- - | - | - .---[fxp0]---. Public IP, W.X.Y.Z - | FreeBSD | - `---[fxp1]---' Private IP, 192.168.2.1 - | - | -Network #2 [ Internal Hosts ] - [ Win9x/NT/2K ] Private Net, 192.168.2.2-254 - [ UNIX ] - </screen> + <sect2> + <info><title>&os; 上で IPsec を設定する。</title> + <authorgroup> + <author> + <personname> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + </personname> + <affiliation> + <address><email>trhodes@FreeBSD.org</email></address> + </affiliation> + <contrib>寄稿: </contrib> + </author> + </authorgroup> + </info> - <para>ふたつのパブリック IP アドレスに注目してください。 - この文書では、これらの IP アドレスを参照する際には、 - これらの文字を用います。 - この文書の中で、これらの文字を見たら、 - あなた自身のパブリック IP アドレスに置き換えてください。 - 内部では、2 つのゲートウェイコンピュータは、両方とも .1 - IP アドレスを持っています。そして、2 つのネットワークは、 - 異なるプライベート IP アドレスを使っています - (それぞれ <systemitem class="ipaddress">192.168.1.x</systemitem> - および <systemitem class="ipaddress">192.168.2.x</systemitem>)。 - プライベートネットワークにあるすべてのコンピュータは、 - デフォルトゲートウェイとして、 - <systemitem class="ipaddress">.1</systemitem> - コンピュータを使うように設定されています。</para> + <para>最初に Ports Collection から + <filename role="package">security/ipsec-tools</filename> + をインストールしてください。 + このサードパーティ製ソフトウェア packages は、 + 設定をサポートする数多くのアプリケーションを提供します。</para> - <para>意図していることは、ネットワークの観点から、 - 各ネットワークは他のネットワークにあるコンピュータを、 - (時折パケットをドロップするようなややゆっくりなルータではありますが) - 同じルータに直接接続しているようにすることです。</para> + <para>次に、パケットをトンネリングし、 + 両方のネットワークが適切に通信するように、 + 2 つの &man.gif.4; 疑似デバイスを作成します。 + <systemitem class="username">root</systemitem> + 権限で以下のコマンドを実行してください。 + ただし、実行する際には、以下のコマンドの中の + <replaceable>internal</replaceable> および + <replaceable>external</replaceable> を、 + 実際の内部および外部のゲートウェイのアドレスに置き換えてください。</para> - <para>これは、たとえば、<systemitem - class="ipaddress">192.168.1.20</systemitem> というコンピュータは、 - 以下を実行できるということです。</para> - - <programlisting>ping 192.168.2.34</programlisting> - - <para>透過的にこれは動くはずです。 - &windows; コンピュータは、他のネットワークのコンピュータを、 - ローカルネットワークのコンピュータを見るのとまったく同じように、 - 見ることができ、共有ファイルを見たりできます。</para> + <screen>&prompt.root; <userinput>ifconfig gif0 create</userinput></screen> + <screen>&prompt.root; <userinput>ifconfig gif0 <replaceable>internal1 internal2</replaceable></userinput></screen> + <screen>&prompt.root; <userinput>ifconfig gif0 tunnel <replaceable>external1 external2</replaceable></userinput></screen> - <para>すべてのことが安全に行われなければなりません。 - これは、2 つのネットワークの通信が暗号化されていなければならないことを意味しています。</para> + <para>たとえば、会社の <acronym>LAN</acronym> の公開 + <acronym>IP</acronym> アドレスを + <systemitem class="ipaddress">172.16.5.4</systemitem>、 + プライベート <acronym>IP</acronym> アドレスを + <systemitem class="ipaddress">10.246.38.1</systemitem> + とします。また家庭 + <acronym>LAN</acronym> の公開 <acronym>IP</acronym> アドレスを + <systemitem class="ipaddress">192.168.1.12</systemitem>、 + 内部のプライベート <acronym>IP</acronym> アドレスを + <systemitem class="ipaddress">10.0.0.5</systemitem> + とします。</para> - <para>これらの 2 つのネットワーク間に VPN - を構築するには複数のプロセスが必要となります。 - 各ステージは以下のようになります。</para> + <para>この説明では分かりにくいので、以下の + &man.ifconfig.8; コマンドの出力例をご覧ください。</para> - <orderedlist> - <listitem> - <para>2 つのネットワーク間にインターネットを経由して、 - <quote>virtual</quote> - ネットワークのリンクを作成します。 - それが適切に動いていることを &man.ping.8; - のようなツールを使って、試験を行います。</para> - </listitem> + <programlisting>Gateway 1: +gif0: flags=8051 mtu 1280 +tunnel inet 172.16.5.4 --> 192.168.1.12 +inet6 fe80::2e0:81ff:fe02:5881%gif0 prefixlen 64 scopeid 0x6 +inet 10.246.38.1 --> 10.0.0.5 netmask 0xffffff00 - <listitem> - <para>2 つのネットワーク間で、 - 必要に応じて透過的に暗号化、 - 復号化を保証するようにセキュリティポリシを適用します。 - &man.tcpdump.1; のようなツールを使って、 - 通信が暗号化されていることを確認します。</para> - </listitem> - <listitem> - <para>FreeBSD ゲートウェイにて、&windows; のコンピュータが VPN - を通して他のコンピュータを見ることができるように追加のソフトウェアを設定します。</para> - </listitem> - </orderedlist> +Gateway 2: - <sect3> - <title>ステップ 1: <quote>virtual</quote> - ネットワークリンクの作成</title> +gif0: flags=8051 mtu 1280 +tunnel inet 192.168.1.12 --> 172.16.5.4 +inet 10.0.0.5 --> 10.246.38.1 netmask 0xffffff00 +inet6 fe80::250:bfff:fe3a:c1f%gif0 prefixlen 64 scopeid 0x4</programlisting> - <para>ネットワーク #1 - のゲートウェイコンピュータにログインしているとします。 - このコンピュータのパブリック IP アドレスは - <systemitem class="ipaddress">A.B.C.D</systemitem>、 - プライベート IP アドレスは - <systemitem class="ipaddress">192.168.1.1</systemitem> です。 - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - の IP アドレスのコンピュータのプライベートアドレスに対し - <command>ping 192.168.2.1</command> - を実行したとします。 - このコマンドが成功するには何が必要でしょうか?</para> + <para>設定が完了したら、両方のプライベート <acronym>IP</acronym> は、 + 以下の出力のように &man.ping.8; + コマンドで到達できるようになっているはずです。</para> - <orderedlist> - <listitem> - <para>ゲートウェイコンピュータは、どのように - <systemitem class="ipaddress">192.168.2.1</systemitem> - に達するかを知っていなければなりません。 - 言い換えると、 - <systemitem class="ipaddress">192.168.2.1</systemitem> - への経路を知っている必要があります。</para> - </listitem> - <listitem> - <para> - <systemitem class="ipaddress">192.168.x</systemitem> - のような範囲のプライベート IP アドレスは広いインターネットでは、 - 使われることは想定されていません。 - そのかわり、 - <systemitem class="ipaddress">192.168.2.1</systemitem> - に送信した各パケットは、他のパケットに包れている必要があります。 - このパケットは <systemitem class="ipaddress">A.B.C.D</systemitem> - から、 - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - へと送られる必要があります。 - このプロセスは、 - <firstterm>カプセル化</firstterm> - と呼ばれます。</para> - </listitem> - <listitem> - <para>このパケットが - <systemitem class="ipaddress">W.X.Y.Z</systemitem> に届くと、 - <quote>非カプセル化</quote> され、 - <systemitem class="ipaddress">192.168.2.1</systemitem> - に送信されます。</para> - </listitem> - </orderedlist> + <programlisting>priv-net# ping 10.0.0.5 +PING 10.0.0.5 (10.0.0.5): 56 data bytes +64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=42.786 ms +64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=19.255 ms +64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=20.440 ms +64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=21.036 ms +--- 10.0.0.5 ping statistics --- +4 packets transmitted, 4 packets received, 0% packet loss +round-trip min/avg/max/stddev = 19.255/25.879/42.786/9.782 ms - <para>これは、2 つのネットワーク間で、 <quote>tunnel</quote> - が必要ということを示しています。二つの <quote>トンネルマウス</quote> は、 - IP アドレス - <systemitem class="ipaddress">A.B.C.D</systemitem> と - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - です。 - そして、トンネルは、これをパススルーすることを許容するプライベート - IP アドレスのアドレスが指定されている必要があります。 - トンネルは、パブリックインターネットを経由して、 - プライベート IP アドレスで送信する時に使われます。</para> +corp-net# ping 10.246.38.1 +PING 10.246.38.1 (10.246.38.1): 56 data bytes +64 bytes from 10.246.38.1: icmp_seq=0 ttl=64 time=28.106 ms +64 bytes from 10.246.38.1: icmp_seq=1 ttl=64 time=42.917 ms +64 bytes from 10.246.38.1: icmp_seq=2 ttl=64 time=127.525 ms +64 bytes from 10.246.38.1: icmp_seq=3 ttl=64 time=119.896 ms +64 bytes from 10.246.38.1: icmp_seq=4 ttl=64 time=154.524 ms +--- 10.246.38.1 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max/stddev = 28.106/94.594/154.524/49.814 ms</programlisting> - <para>このトンネルは、一般的なインタフェースもしくは、FreeBSD では - gif デバイスで作成されます。 - 想像通り、各ゲートウェイホストの gif - インタフェースは、4 つの IP アドレスで設定されなくてはなりません。 - 2 つはパブリック IP アドレスで、 - 2 つはプライベートの IP アドレスです。</para> + <para>予想通り、プライベートアドレスを使って、 + 両方のネットワークから <acronym>ICMP</acronym> + パケットを送受信できます。 + 次に、どちらのネットワークからもメッセージを送信できるように、 + パケットのルーティング情報を + 両方のゲートウェイに設定する必要があります。 + これは以下のコマンドで設定できます。</para> - <para>両方の &os; カーネルで - gif デバイスのサポートを組み入れてコンパイルする必要があります。 - 以下の行を加えることで設定できます。</para> + <screen>&prompt.root; <userinput>corp-net# route add <replaceable>10.0.0.0 10.0.0.5 255.255.255.0</replaceable></userinput></screen> + <screen>&prompt.root; <userinput>corp-net# route add net <replaceable>10.0.0.0: gateway 10.0.0.5</replaceable></userinput></screen> - <programlisting>device gif</programlisting> + <screen>&prompt.root; <userinput>priv-net# route add <replaceable>10.246.38.0 10.246.38.1 255.255.255.0</replaceable></userinput></screen> + <screen>&prompt.root; <userinput>priv-net# route add host <replaceable>10.246.38.0: gateway 10.246.38.1</replaceable></userinput></screen> - <para>両方のコンピュータのカーネルコンフィグレーションファイルに上記の行を加え、 - コンパイル、インストールし、通常通り再起動してください。</para> - - <para>トンネルの設定は 2 つのプロセスで行います。 - 最初は、&man.ifconfig.8; を使って、 - 外部 (パブリック) IP アドレスを設定するします。 - その後、プライベート IP アドレスを - &man.ifconfig.8; を使って設定します。</para> - - <para>ネットワーク #1 - にあるゲートウェイコンピュータで以下のコマンドを実行してトンネルを作成します。</para> + <para>これで、ネットワーク内のコンピュータは、 + ゲートウェイおよびゲートウェイの奥のコンピュータから到達可能となっています。 + 以下の例で、簡単に確認できます。</para> - <screen>&prompt.root; <userinput>ifconfig <replaceable>gif0</replaceable> create</userinput> -&prompt.root; <userinput>ifconfig <replaceable>gif0</replaceable> tunnel <replaceable>A.B.C.D</replaceable> <replaceable>W.X.Y.Z</replaceable></userinput> -&prompt.root; <userinput>ifconfig <replaceable>gif0</replaceable> inet <replaceable>192.168.1.1</replaceable> <replaceable>192.168.2.1</replaceable> netmask <replaceable>0xffffffff</replaceable></userinput> - </screen> + <programlisting>corp-net# ping 10.0.0.8 +PING 10.0.0.8 (10.0.0.8): 56 data bytes +64 bytes from 10.0.0.8: icmp_seq=0 ttl=63 time=92.391 ms +64 bytes from 10.0.0.8: icmp_seq=1 ttl=63 time=21.870 ms +64 bytes from 10.0.0.8: icmp_seq=2 ttl=63 time=198.022 ms +64 bytes from 10.0.0.8: icmp_seq=3 ttl=63 time=22.241 ms +64 bytes from 10.0.0.8: icmp_seq=4 ttl=63 time=174.705 ms +--- 10.0.0.8 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max/stddev = 21.870/101.846/198.022/74.001 ms - <para>もう片方のゲートウェイコンピュータで、 - IP アドレスの順を逆にして同じコマンドを実行します。</para> +priv-net# ping 10.246.38.107 +PING 10.246.38.1 (10.246.38.107): 56 data bytes +64 bytes from 10.246.38.107: icmp_seq=0 ttl=64 time=53.491 ms +64 bytes from 10.246.38.107: icmp_seq=1 ttl=64 time=23.395 ms +64 bytes from 10.246.38.107: icmp_seq=2 ttl=64 time=23.865 ms +64 bytes from 10.246.38.107: icmp_seq=3 ttl=64 time=21.145 ms +64 bytes from 10.246.38.107: icmp_seq=4 ttl=64 time=36.708 ms +--- 10.246.38.107 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max/stddev = 21.145/31.721/53.491/12.179 ms</programlisting> - <screen>&prompt.root; <userinput>ifconfig <replaceable>gif0</replaceable> create</userinput> -&prompt.root; <userinput>ifconfig <replaceable>gif0</replaceable> tunnel <replaceable>W.X.Y.Z</replaceable> <replaceable>A.B.C.D</replaceable></userinput> -&prompt.root; <userinput>ifconfig <replaceable>gif0</replaceable> inet <replaceable>192.168.2.1</replaceable> <replaceable>192.168.1.1</replaceable> netmask <replaceable>0xffffffff</replaceable></userinput> - </screen> + <para>トンネリングの設定は以上のように簡単ですが、 + リンクを安全にするには、もう少し掘り下げた設定が必要となります。 + 以下の設定では、事前共有 (<acronym>PSK</acronym>) + <acronym>RSA</acronym> 鍵を使います。 + <acronym>IP</acronym> アドレスを除けば、両方の + <filename>/usr/local/etc/racoon/racoon.conf</filename> + ファイルは同じで、以下のようになります。</para> - <para>以下を実行して、設定を確認をしてください。</para> - - <programlisting>ifconfig gif0</programlisting> - - <para>たとえば、ネットワーク #1 のゲートウェイにおいては、 - 以下のように確認できます。</para> - - <screen>&prompt.root; <userinput>ifconfig gif0</userinput> -gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 - tunnel inet A.B.C.D --> W.X.Y.Z - inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff - </screen> + <programlisting>path pre_shared_key "/usr/local/etc/racoon/psk.txt"; #location of pre-shared key file +log debug; #log verbosity setting: set to 'notify' when testing and debugging is complete - <para>出力からわかるように、 - 物理アドレス - <systemitem class="ipaddress">A.B.C.D</systemitem> と - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - の間にトンネルが作成され、 - <systemitem class="ipaddress">192.168.1.1</systemitem> と - <systemitem class="ipaddress">192.168.2.1</systemitem> - の間の通信がトンネルで許可されています。</para> - - <para>両方のコンピュータのルーティングテーブルにエントリが追加されました。 - <command>netstat -rn</command> で確認できます。 - ネットワーク #1 - のゲートウェイホストでの出力は以下のようになります。</para> - - <screen>&prompt.root; <userinput>netstat -rn</userinput> -Routing tables - -Internet: -Destination Gateway Flags Refs Use Netif Expire -... -192.168.2.1 192.168.1.1 UH 0 0 gif0 -... - </screen> +padding # options are not to be changed +{ + maximum_length 20; + randomize off; + strict_check off; + exclusive_tail off; +} - <para><quote>Flags</quote> の値が示すように、 - これはホストのルートで、 - 各ゲートウェイは他のゲートウェイとどのように通信すれば良いかを知っていますが、 - 他の関連するネットワークへの通信を知らないことを意味しています。 - この問題は、すぐに解決されます。</para> +timer # timing options. change as needed +{ + counter 5; + interval 20 sec; + persend 1; +# natt_keepalive 15 sec; + phase1 30 sec; + phase2 15 sec; +} - <para>両方のコンピュータでファイアウォールを設定していることがあります。 - VPN トラフィックのためには、ファイアウォールを迂回する必要があります。 - 両方のネットワーク間のすべてのトラフィックを許可するか、VPN - の末端をお互い保護するようなファイアウォールのルールを追加したいと思うでしょう。</para> +listen # address [port] that racoon will listening on +{ + isakmp 172.16.5.4 [500]; + isakmp_natt 172.16.5.4 [4500]; +} - <para>すべての VPN - を経由するトラフィックを許容するようなファイアウォールを設定すると、 - テストを大きく簡略化できます。 - 後でいつでも、セキュリティを強化できます。 - もし、ゲートウェイコンピュータで &man.ipfw.8; を用いているのであれば、 - 以下のようなコマンドで、 - 他のファイアウォールのルールに影響することなく、 - VPN の末端の間のトラフィックを許可します。</para> +remote 192.168.1.12 [500] +{ + exchange_mode main,aggressive; + doi ipsec_doi; + situation identity_only; + my_identifier address 172.16.5.4; + peers_identifier address 192.168.1.12; + lifetime time 8 hour; + passive off; + proposal_check obey; +# nat_traversal off; + generate_policy off; - <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting> + proposal { + encryption_algorithm blowfish; + hash_algorithm md5; + authentication_method pre_shared_key; + lifetime time 30 sec; + dh_group 1; + } +} - <para>両方のゲートウェイコンピュータでこのコマンドを実行する必要があります。</para> +sainfo (address 10.246.38.0/24 any address 10.0.0.0/24 any) # address $network/$netmask $type address $network/$netmask $type ( $type being any or esp) +{ # $network must be the two internal networks you are joining. + pfs_group 1; + lifetime time 36000 sec; + encryption_algorithm blowfish,3des,des; + authentication_algorithm hmac_md5,hmac_sha1; + compression_algorithm deflate; +}</programlisting> - <para>各ゲートウェイコンピュータで他のゲートウェイコンピュータに対して、 - ping を実行することができれば十分です。 - <systemitem class="ipaddress">192.168.1.1</systemitem> - において、以下を実行が可能で</para> - - <programlisting>ping 192.168.2.1</programlisting> - - <para>そして、レスポンスを受け取れる必要があります。 - 同じことを他のゲートウェイコンピュータで実行できる必要があります。</para> - - <para>しかしながら、各ネットワークの内部のコンピュータにアクセスはまだできません。 - これは、 - ゲートウェイコンピュータがお互いにアクセスする方法を知っているが、 - 各ゲートウェイの奥にあるネットワークにアクセスする方法を知らないという、 - ルーティングに起因しています。</para> + <para>上の例で表示されているオプションや、 + すべてのオプションについて説明することは、本文書の範囲を超えています。 + <application>racoon</application> の設定マニュアルページには、 + 関連するたくさんの情報が書かれています。</para> - <para>この問題を解決するには、 - 静的ルートを各ゲートウェイコンピュータに追加する必要があります。 - このために最初のゲートウェイで行うコマンドは以下のようになります。</para> + <para>&os; および <application>racoon</application> + がホスト間のネットワークトラフィックを暗号化、 + 復号化できるようにするには、 + <acronym>SPD</acronym> ポリシの設定が必要です。</para> - <programlisting>route add 192.168.2.0 192.168.2.1 netmask 0xffffff00 - </programlisting> + <para>このポリシは、 + 以下のような簡単なシェルスクリプトで設定できます。 + 以下は会社のゲートウェイの例です。 + このファイルをシステムの初期化中に使われるようにするには、 + <filename>/usr/local/etc/racoon/setkey.conf</filename> + に保存する必要があります。</para> - <para>このコマンドの意味は、ネットワーク - <quote><systemitem class="ipaddress">192.168.2.0</systemitem> - のホストにアクセスするには、パケットを - <systemitem class="ipaddress">192.168.2.1</systemitem> - のホストに送る</quote> ことを意味しています。 - もう片方のゲートウェイでは、同様のコマンドを実行する必要があります。 - その場合には、かわりに、 - <systemitem class="ipaddress">192.168.1.x</systemitem> - アドレスを使う必要があります。</para> +<programlisting>flush; +spdflush; +# To the home network +spdadd 10.246.38.0/24 10.0.0.0/24 any -P out ipsec esp/tunnel/172.16.5.4-192.168.1.12/use; +spdadd 10.0.0.0/24 10.246.38.0/24 any -P in ipsec esp/tunnel/192.168.1.12-172.16.5.4/use;</programlisting> - <para>これで、片方のネットワーク上のホストからの IP トラフィックは、 - もう片方のネットワーク上のホストに届くようになります。</para> + <para>設定ファイルを適切に置くと、以下のコマンドにより、 + 両方のゲートウェイ上で <application>racoon</application> + を起動できます。</para> - <para>2 つのネットワーク間の - <quote>virtual</quote> および - <quote>network</quote> について構築できたので、 - VPN について、2/3 が構築されました。残りは private です。 - &man.ping.8; および &man.tcpdump.1; を使って試験できます。 - ゲートウェイホストにログインして以下を実行してください。</para> - - <programlisting>tcpdump dst host 192.168.2.1</programlisting> + <screen>&prompt.root; <userinput>/usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log</userinput></screen> - <para>同じホストの他のログインセッションで、 - 以下を実行してください。</para> + <para>出力は以下のようになるでしょう。</para> - <programlisting>ping 192.168.2.1</programlisting> + <programlisting>corp-net# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf +Foreground mode. +2006-01-30 01:35:47: INFO: begin Identity Protection mode. +2006-01-30 01:35:48: INFO: received Vendor ID: KAME/racoon +2006-01-30 01:35:55: INFO: received Vendor ID: KAME/racoon +n2006-01-30 01:36:04: INFO: ISAKMP-SA established 172.16.5.4[500]-192.168.1.12[500] spi:623b9b3bd2492452:7deab82d54ff704a +2006-01-30 01:36:05: INFO: initiate new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] +2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=28496098(0x1b2d0e2) +2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=47784998(0x2d92426) +2006-01-30 01:36:13: INFO: respond new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] +2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=124397467(0x76a279b) +2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=175852902(0xa7b4d66)</programlisting> - <para>以下のような出力が表示されます。</para> - - <programlisting> -16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request -16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply -16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request -16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply -16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request -16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply - </programlisting> + <para>トンネリングが適切に行われているかどうかを確認するため、 + 別のコンソール上で &man.tcpdump.1; を使い、 + 以下のようなコマンドでネットワークの通信を確認してください。 + ただし、以下の例の <literal>em0</literal> の部分は、 + 必要に応じて使用しているネットワークインタフェースに置き換えてください。</para> - <para>この出力からわかるように、ICMP メッセージが戻り、 - 復号化されます。 - &man.tcpdump.1; に <option>-s</option> パラメータを用いると、 - パケットから多くのデータを捕え、 - より多くの情報を得ることができます。</para> + <screen>&prompt.root; <userinput>tcpdump -i em0 host <replaceable>172.16.5.4 and dst 192.168.1.12</replaceable></userinput></screen> - <para>明らかにこれは、受け入れられるものではありません。 - 次の節では、2 つのネットワーク間のリンクについて、 - すべての通信が自動的に暗号化されるように安全にする方法について説明します。</para> + <para>以下のようなデータがコンソールに表示されます。 + もし、表示されない場合は、設定に何か問題があるので、 + 表示されるデータを使ってデバッグする必要があります。</para> - <itemizedlist> - <title>まとめ</title> - <listitem> - <para>両方のカーネルを <quote>device gif</quote> - で構築します。</para> - </listitem> - <listitem> - <para>ゲートウェイホスト #1 の <filename>/etc/rc.conf</filename> - を編集して、以下の行を (必要に応じて IP アドレスを変更して) - 追加します。</para> - <programlisting>gif_interfaces="gif0" -gifconfig_gif0="A.B.C.D W.X.Y.Z" -ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff" -static_routes="vpn" -route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" - </programlisting> - </listitem> - <listitem> - <para>両方のホストのファイアウォールスクリプト - (<filename>/etc/rc.firewall</filename> など) - を編集して以下を追加します。</para> + <programlisting>01:47:32.021683 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xa) +01:47:33.022442 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xb) +01:47:34.024218 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xc)</programlisting> - <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting> - </listitem> - <listitem> - <para>同様の変更を、ゲートウェイホスト #2 の - <filename>/etc/rc.conf</filename> - においても行います。 - ここで、IP アドレスの順番は逆にします。</para> - </listitem> - </itemizedlist> - </sect3> + <para>これで 2 つのネットワークは、 + 1 つのネットワークのように利用できます。 + 多くの場合、 + 両方のネットワークはファイアウォールにより保護されているので、 + 両方を流れる通信を許可するには、 + パケットが両方を行き来できるようにルールを追加する必要があります。 + &man.ipfw.8; を使ったファイアウォールの場合は、 + ファイアウォールの設定ファイルに、以下の行を追加してください。</para> - <sect3> - <title>ステップ 2: リンクを安全にする。</title> + <programlisting>ipfw add 00201 allow log esp from any to any +ipfw add 00202 allow log ah from any to any +ipfw add 00203 allow log ipencap from any to any +ipfw add 00204 allow log usp from any 500 to any</programlisting> - <para>リンクを安全にするために、IPsec を用います。 - IPsec は、2 つのホストが暗号鍵に合意し、 - その鍵を 2 - つのホストの間でデータを暗号化するのに用いるメカニズムを提供します。</para> + <note> + <para>ルール番号は、 + 現在のホストの設定によっては変更する必要があるでしょう。</para> + </note> - <para>ここでは、設定を行う上で考慮すべき領域が 2 つあります。</para> + <para>&man.pf.4; または &man.ipf.8; を使用しているシステムでは、 + 以下のルールで上手くいくでしょう。</para> - <orderedlist> - <listitem> - <para>2 つのホストで、 - 用いる暗号メカニズムに合意するメカニズムが必要です。 - 2 つのホストが一度このメカニズムに合意したら、 - これらの間で <quote>セキュリティアソシエーション</quote> - が確立されたことになります。</para> - </listitem> - <listitem> - <para>どのトラフィックを暗号化するかを特定するメカニズムが必要となります。 - 外向きのトラフィックのすべてを暗号化する必要はないのは明らかです。 - -- VPN に関係するトラフィックのみを暗号化することが望まれます。 - どのトラフィックを暗号すべきかを決めるために導入されるルールを - <quote>セキュリティポリシ</quote> と呼びます。</para> - </listitem> - </orderedlist> + <programlisting>pass in quick proto esp from any to any +pass in quick proto ah from any to any +pass in quick proto ipencap from any to any +pass in quick proto udp from any port = 500 to any port = 500 +pass in quick on gif0 from any to any +pass out quick proto esp from any to any +pass out quick proto ah from any to any +pass out quick proto ipencap from any to any +pass out quick proto udp from any port = 500 to any port = 500 +pass out quick on gif0 from any to any</programlisting> - <para>セキュリティアソシエーションおよびセキュリティポリシの両方は、 - カーネルにより管理されています。そして、ユーザランドプログラムにより、 - 変更することができます。 - しかしながら、これを行う前に、カーネルを IPsec および - Encapsulated Security Payload (ESP) プロトコルに対応するように、 - 設定する必要があります。 - これは、カーネルを以下のように設定することで可能です。</para> + <para>最後に、システムの初期化中に <acronym>VPN</acronym> + が起動するように、以下の行を + <filename>/etc/rc.conf</filename> に追加してください。</para> - <indexterm> - <primary>kernel options</primary> - <secondary>IPSEC</secondary> - </indexterm> - - <programlisting>options IPSEC -options IPSEC_ESP - </programlisting> - - <para>そして再構築し、再インストールを行って、再起動してください。 - これは両方のゲートウェイホストのカーネルで行う必要があります。</para> - - <indexterm> - <primary>IKE</primary> - </indexterm> - - <para>セキュリティアソシエーションの設定に関していうと、 - 2 つの選択肢があります。 - 1 つ目は、2 つのホスト間の設定を手動で設定する方法で、 - 暗号アルゴリズム、暗号鍵などを選択する必要があります。 - もう 1 つは、これらをあなたに代わり行う - Internet Key Exchange プロトコル (IKE) - を実装しているデーモンを用いることです。</para> - - <para>後者が推奨されます。とにかく、設定がより簡単です。</para> - - <indexterm> - <primary><command>setkey</command></primary> - </indexterm> - - <para>&man.setkey.8; を用い得ることでセキュリティポリシを設定したり、 - 表示できます。 - &man.route.8; がカーネルルーティングテーブルに関しているのと同様に、 - <command>setkey</command> - は、カーネルセキュリティポリシテーブルに関連しています。 - <command>setkey</command> は、 - 現在のセキュリティアソシエーションも表示でき、 - 類推をさらに進めると、その点において、 - <command>netstat -r</command> と同種です。</para> - - <para>FreeBSD - でセキュリティアソシエーションを管理するデーモンは数多くあります。 - この文書では、その中の一つの <application>racoon</application> - の使い方について説明します。 - <application>racoon</application> は、&os; Ports Collection の - <filename role="package">security/ipsec-tools</filename> - からインストールできます。</para> - - <indexterm> - <primary>racoon</primary> - </indexterm> - - <para><application>racoon</application> ソフトウェアは、 - 両方のゲートウェイホストで実行される必要があります。 - それぞれのホストで、もう一つの VPN の端の IP アドレスおよび - (あなたが選択したもので、両方のゲートウェイで同じ必要のある) - 秘密鍵で設定する必要があります。</para> - - <para>2 つのデーモンは、互いにコンタクトし、 - (設定した秘密鍵を用いて) だれが相手であるかを確認します。 - デーモンはその後、新しい秘密鍵を生成し、 - VPN 上のトラフィックの暗号化のために用います。 - 攻撃者がこれらの鍵の (理論的には、不可能ですが) - 1 つをクラックしても、それ以上できないように、 - この秘密鍵を定期的に変更します。 - -- 彼らがカギをクラックしたときには、 - 2 つのデーモンは他の鍵を選択していることでしょう。</para> - - <para><application>racoon</application> の設定は、 - <filename>${PREFIX}/etc/racoon</filename> で行われます。 - ここには、設定ファイルが置かれていますが、 - それほど多く変更する必要はありません。 - おそらくあなたが変更すべき <application>racoon</application> - の設定の他の部分は、 - <quote>pre-shared key</quote> です。</para> - - <para>デフォルトの <application>racoon</application> の設定では、 - これは、<filename>${PREFIX}/etc/racoon/psk.txt</filename> - ファイルにあると仮定されています。 - pre-shared key は、VPN リンクを経由するトラフィックの暗号化には、 - <emphasis>用いられません</emphasis>。 - 鍵管理デーモンがお互いを信頼するためのトークンです。</para> - - <para><filename>psk.txt</filename> は、 - あなたが取り扱う各リモートのサイトに関連する行を含んでいます。 - この例では、どこに 2 つのサイトがあるのか、 - 各 <filename>psk.txt</filename> ファイルは、一行を含んでいます - (なぜならば、各 VPN の端は、他の端のみを取り扱うため)。</para> - - <para>ゲートウェイホストの #1 では、 - この行は以下のようなものです。</para> - - <programlisting>W.X.Y.Z secret</programlisting> - - <para>これは、リモート端の <emphasis>公開</emphasis> IP アドレス、空白、 - 安全を提供するためのテキスト文字です。 - 明らかに、<quote>secret</quote> をあなたの鍵に使うべきではありません。 - パスワードに対する通常の規則に従ってください。</para> - - <para>ゲートウェイホスト #2 では、この行は以下のようになります。</para> - - <programlisting>A.B.C.D secret</programlisting> - - <para>これは、リモート端の公開 IP アドレスと先ほどと同じ秘密鍵です。 - <application>racoon</application> - を実行する前に <filename>psk.txt</filename> のモードは、 - <literal>0600</literal> - (i.e., <systemitem class="username">root</systemitem> のみが - read/write できます) としてください。</para> - - <para>両方のホストゲートウェイコンピュータで - <application>racoon</application> を走らせる必要があります。IKE - トラフィックを許可するファイアウォールルールを追加する必要があります。 - IKE トラフィックは、UDP 上で ISAKMP (Internet Security Association - Key Management Protocol) port に対して実行されるものです。 - このルールはファイアウォールルールセットの極めて最初に記述する必要があります。</para> - - <programlisting>ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp -ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp - </programlisting> - - <para>一度 <application>racoon</application> を走らせたら、 - 片方のゲートウェイホストから、他のホストへ ping を実行できます。 - 接続は、まだ暗号化されていませんが、<application>racoon</application> - はその後 2 つのホスト間のセキュリティアソシエーションを設定します。 - これは時間を要し、 - ping コマンドが反応する前に少し時間の遅れとして認識できるでしょう。</para> - - <para>一度セキュリティアソシエーションが確立されたら、 - &man.setkey.8; を使って確認できます。 - どちらかのホストで以下のように実行して、 - セキュリティアソシエーション情報を確認してください。</para> - - <programlisting>setkey -D</programlisting> - - <para>以上で問題の半分が終わりました。 - もう半分は、セキュリティポリシの設定です。</para> - - <para>適切なセキュリティポリシを作成するには、 - これまでにどのように設定されているかを確認することが必要となります。 - この議論は、両方のリンクの端で行われます。</para> - - <para>送信された各 IP パケットには、ヘッダがあり、 - パケットに関するデータを持っています。 - ヘッダにはソースおよびデスティネーションの両方の - IP アドレスが含まれています。 - 我々はすでに知っているように、公開インターネット上では、 - <systemitem class="ipaddress">192.168.x.y</systemitem> - といった範囲のプライベート IP アドレスは使われません。 - そのかわり、最初に他のパケット内にカプセル化されます。 - このパケットは、プライベートアドレスのかわりに、 - 公開ソースおよびデスティネーションの IP アドレスを持っています。</para> - - <para>そのため、外向きのパケットは以下のように始まります。</para> - - <screen> - .----------------------. - | Src: 192.168.1.1 | - | Dst: 192.168.2.1 | - | <other header info> | - +----------------------+ - | <packet data> | - `----------------------'</screen> - - <para>その後、他のパケットの中に以下のようにカプセル化されます。</para> - - <screen> - .--------------------------. - | Src: A.B.C.D | - | Dst: W.X.Y.Z | - | <other header info> | - +--------------------------+ - | .----------------------. | - | | Src: 192.168.1.1 | | - | | Dst: 192.168.2.1 | | - | | <other header info> | | - | +----------------------+ | - | | <packet data> | | - | `----------------------' | - `--------------------------'</screen> - - <para>このカプセル化は gif - デバイスにより行われます。確認できるように、 - パケットは外側に本来の IP アドレスを持っており、 - オリジナルパケットは、 - インターネットに外向きに送られるパケットの中にデータとしてラップされています。</para> - - <para>明らかに、VPN - 間のすべてのトラフィックが暗号化されることが必要となります。 - 言葉にすると以下のようになります。</para> - - <para><quote>もしパケットが - <systemitem class="ipaddress">A.B.C.D</systemitem> - から、 - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - へと送られるとすると、 - 必要なセキュリティアソシエーションを使って暗号化されます。</quote></para> - - <para><quote>もしパケットが、 - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - から届き、 - <systemitem class="ipaddress">A.B.C.D</systemitem> - へと送られる場合には、 - 必要なセキュリティアソシエーションを用いて復号化されます。</quote></para> - - <para>これは正解に近いのですが、極めて正しいというわけではありません。 - もしこれを行ったとすると、 - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - へのトラフィック、または、ここからのトラフィックのすべてが、 - VPN ではないトラックまで暗号化されてしまいます。 - これはあなたが行いたいこととはまったく違います。 - 適切なポリシは以下のようなものになります。</para> - - <para><quote><systemitem class="ipaddress">A.B.C.D</systemitem> - からパケットが出たとして、 - そのパケットが他のパケットをカプセル化し、 - <systemitem class="ipaddress">W.X.Y.Z</systemitem> - へと送られるとすると、 - セキュリティアソシエーションを用いて暗号化します。</quote></para> - - <para><quote>もし、パケットが、<systemitem - class="ipaddress">W.X.Y.Z</systemitem> から届き、 - そのパケットが他のパケットをカプセル化し、<systemitem - class="ipaddress">A.B.C.D</systemitem> へと送られる場合には、 - 必要なセキュリティアソシエーションを使って復号化されます。</quote></para> - - <para>微妙な変更ですが、必要な変更です。</para> - - <para>セキュリティポリシは、同じく &man.setkey.8; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201710311241.v9VCfCux063031>