  VPN HOWTO
  Matthew D. Wilson, matthew@shinythings.com
  <mailto:matthew@shinythings.com>
  v 1.0, Dec 1999
  宮田 剛, t-miya@rb3.so-net.ne.jp <mailto:t-miya@rb3.so-
  net.ne.jp>
  v1.0j, 18 August 2000

  この HOWTO は、いかにして Linux で仮想プライベートネットワーク (VPN)
  を構築するかということについて記述されたものです。
  ______________________________________________________________________

  目次

  1. 序文
     1.1 なぜこの HOWTO を書いたか
     1.2 感謝とお礼
     1.3 このドキュメントの形式
     1.4 著作権および免責事項
     1.5 文書履歴
     1.6 関連ドキュメント

  2. 理論
     2.1 VPNとは何か？
        2.1.1 で、実際のところ、VPN とは？
        2.1.2 それでどういう風に動作するの？
     2.2 SSHとPPP
     2.3 その他の VPN システム
        2.3.1 PPTP
        2.3.2 IP Sec
        2.3.3 CIPE

  3. サーバ
     3.1 セキュリティ − 人々を締め出す
        3.1.1 デーモンを減らせ
        3.1.2 パスワードを許すな
     3.2 ユーザアクセス - みんなを中へ
        3.2.1 sshd を設定する
     3.3 ユーザを制限する
        3.3.1 sudo か否か
     3.4 ネットワーキング
        3.4.1 カーネル
        3.4.2 フィルタ規則
        3.4.3 ルーティング

  4. クライアント
     4.1 カーネル
     4.2 リンクを確立する
     4.3 スクリプトを書く
     4.4 LRP - Linux ルータプロジェクト

  5. 実行
     5.1 計画
     5.2 ツールを集める
        5.2.1 サーバに対して -
        5.2.2 クライアントに対して -
     5.3 サーバ - カーネルを構築する
     5.4 サーバ - ネットワークを設定する
        5.4.1 インターフェースを設定する
        5.4.2 経路を設定する
        5.4.3 フィルタ規則を作成する
        5.4.4 経路を設定する
     5.5 サーバ - pppd を設定する
        5.5.1 /etc/ppp/
        5.5.2 /etc/ppp/options
        5.5.3 衝突を回避する
     5.6 サーバ - sshd を設定する
     5.7 サーバ - ユーザアカウントを設定する
        5.7.1 vpn-users グループを追加する
        5.7.2 vpn-users のホームディレクトリを作る
        5.7.3 .ssh ディレクトリ
        5.7.4 ユーザを追加する
     5.8 サーバ - 管理する
     5.9 クライアント - カーネルを構築する
     5.10 クライアント - ネットワークを設定する
        5.10.1 インターフェース
        5.10.2 フィルタ規則
        5.10.3 経路を設定する
     5.11 クライアント - pppdを設定する
     5.12 クライアント - ssh を設定する
     5.13 クライアント - 接続を確立する
     5.14 クライアント - 経路を設定する
     5.15 クライアント - スクリプトを書く
        5.15.1 実行させ続ける

  6. 付記
     6.1 落とし穴
        6.1.1 read: I/O error (読み込み - I/O エラー)
        6.1.2 SIOCADDRT: Network is unreachable (SIOCADDRT - ネットワークは到達不能)
        6.1.3 IPv4 フォワーディングと 2.2 カーネル
        6.1.4 経路を設定する
     6.2 ハードウェアおよびソフトウェア要件
        6.2.1 最低限のハードウェア要件
        6.2.2 ソフトウェア要件

  ______________________________________________________________________

  1.  序文

  1.1.  なぜこの HOWTO を書いたか

  私はリアルネットワークスに勤務しており VPN サービスを必要としていまし
  た。これは私にとって初めての現実のプロジェクトで、他の仕事に比べると、
  ここから Linux について本当に多くを学びました。私は、学んだことを他の
  みんなと共有し、彼らもまた Linux でとても素晴らしいことが出来るよう、
  そのプロジェクトによる経験を使ってこのドキュメントを執筆しました。

  1.2.  感謝とお礼

  まず、真っ先に我が妻 Julie に感謝します。彼女なくして今日の私は無かっ
  たでしょう。また、この全てを可能にした物、最初の VPN mini-howto and
  pty-redir の執筆者である Arpad Magosanyi にもお礼を言いたいと思いま
  す。Jerry, Rod, Glen, Mark V., Mark W., それから David, イかしてるぜ。
  みなさんの協力に感謝します。

  1.3.  このドキュメントの形式

  このドキュメントは 5つのセクションに分かれています。

     セクション1 - 序文
        このセクション

     セクション2 - 理論
        VPN の基本的理論です。VPN とは何か、どのように動作するのか。もし
        VPN について全くの初めてなら、ここを読んでください。

     セクション3 - サーバ
        このセクションでは VPN サーバの設定法について述べます。

     セクション4 - クライアント
        このセクションでは VPN クライアントの設定法について述べます。

     セクション5 - 実行
        サンプルとなる VPN の設定を手順を踏んで実行してみます。

     セクション6 - 付記
        あなたの助けになるかもしれない、その他のちょっとした情報です。

  1.4.  著作権および免責事項

  以下の文は参考のため訳文を挙げますが、原文が優先されます。

  Copyright (c) by Matthew Wilson. This document may be distributed only
  subject to the terms and conditions set forth in the LDP License at
  http://www.linuxdoc.org/COPYRIGHT.html
  <http://www.linuxdoc.org/COPYRIGHT.html>, except that this document
  must not be distributed in modified form without the author's consent.

  著作権は Matthew Wilson にあります。このドキュメント
  はhttp://www.linuxdoc.org/COPYRIGHT.html
  <http://www.linuxdoc.org/COPYRIGHT.html>にある LDP ライセンスの配布条
  件および約定に従う場合にのみ、配布することができますが、著者の同意なく
  改変を加えられた場合には配布することは出来ません。

  The author assumes no responsibility for anything done with this
  document, nor does he make any warranty, implied or explicit.  If you
  break it, it's not my fault.  Remember, what you do here could make
  very large holes in the security model of your network.  You've been
  warned.

  著者は、暗黙であるか明白であるかの如何にかかわらず、このドキュメントに
  よるどのような事象に対しても責任を負いませんし、また如何なる保証もしま
  せん。あなたが被害を被ったとしても、それは私の失敗ではありません。あな
  たがここでやることが、ネットワークのセキュリティモデルに非常に大きな穴
  を開け得るということを覚えておいてください。警告しましたからね？

  1.5.  文書履歴

  以下の文は参考のため訳文を挙げますが、原文が優先されます。

  The original VPN mini-HOWTO was written by Arpad Magosanyi
  <mag@bunuel.tii.matav.hu> in 1997.  He has since allowed me to take up
  the document and extend it into a full HOWTO.  All of this would not
  be possible without his original document.  Thanks again Arpad. :)

  オリジナルの VPN mini-HOWTO は Arpad Magosanyi
  <mag@bunuel.tii.matav.hu> によって 1997 年に記述されました。彼は私がこ
  のドキュメントを取り上げ、完全な HOWTO に拡張することを許してくれまし
  た。全ては彼のオリジナルのドキュメント無くしては為し得なかったことで
  しょう。再度 Arpad に感謝します。:)

  この HOWTO のバージョン 1.0 は 1999 年 12 月 10 日に完成しました。

  1.6.  関連ドキュメント

  o  Networking Overview HOWTO
     <http://www.linuxdoc.org/HOWTO/Networking-Overview-HOWTO.html>

  o  Networking HOWTO <http://www.linuxdoc.org/HOWTO/NET3-4-HOWTO.html>
     [訳注：日本語訳は
     <http://www.linux.or.jp/JF/JFdocs/NET3-4-HOWTO.html> にあります。]

  o  VPN-Masquerade HOWTO <http://www.linuxdoc.org/HOWTO/VPN-Masquerade-
     HOWTO.html>

  2.  理論

  2.1.  VPNとは何か？

  VPN とは仮想プライベートネットワーク (Virtual Private Network) を意味
  しています。 VPN はデータの安全性を確保しつつ、その輸送機構としてイン
  ターネットを利用します。

  2.1.1.  で、実際のところ、VPN とは？

  その質問にはいくつもの答えがあります。それは正にネットワークレイアウト
  次第です。もっとも一般的な構成は、ひとつのメイン内部ネットワークを持
  ち、 VPN を使った離れた所にあるノードを中央ネットワークへ完全にアクセ
  スできるようにするものです。離れた所にあるノードというのは、通常、離れ
  たオフィスか自宅から作業を行う従業員などです。二つの、より小さな (ある
  いは大きな!) ネットワークを繋いで、さらに大きな単一のネットワークとす
  ることも出来ます。

  2.1.2.  それでどういう風に動作するの？

  VPN を構築するためには単に、二つのネットワーク間に安全の確保されたトン
  ネルを作り、それを通るように IP の経路を定めます。もし、既に私の言うこ
  とが理解できないのでしたら、The Linux Networking Overview HOWTO
  <http://www.linuxdoc.org/HOWTO/Networking-Overview-HOWTO.html> を読ん
  で Linux におけるネットワークについて勉強してください。

  我慢してください。私のアスキーアートは何かに使えますから。

                                        \          \
                     --------------     /          /    --------
       リモート  ___| クライアント |____\ インター \___| サーバ |______ プライベート
     ネットワーク   |    ルータ    |    /   ネット /   | ルータ |       ネットワーク
                     --------------     \          \    --------
                                        /          /

                           クライアントルータ
                    -----------------------------------------------------
                   |   /->    10.0.0.0/255.0.0.0   \                     |
   リモート        |  |-->  172.16.0.0/255.240.0.0  |--> トンネル >--\   |
    ネットワーク>--|--|--> 192.168.0.0/255.255.0.0 /                  |--|----> インターネット
   192.168.12.0    |  |                                               |  |
                   |   \-----> 0.0.0.0/0.0.0.0 --> IPマスカレード >--/   |
                    -----------------------------------------------------

                             サーバルータ
                     ------------------------------------------------------
                    |                     /->    10.0.0.0/255.0.0.0    \   |
                    |   /--> トンネル >--|-->  172.16.0.0/255.240.0.0   |--|--> プライベート
  インターネット >--|--|                  \--> 192.168.0.0/255.255.0.0 /   |    ネットワーク
                    |  |                                                   |   172.16.0.0/12
                    |   \-----> 0.0.0.0/0.0.0.0 -----> /dev/null           |  192.168.0.0/16
                     ------------------------------------------------------

  上の図はネットワークをどの様に構築し得るかを示しています。もし IP マス
  カレードが何であるか分からないのなら、ここにいるべきではありません。
  The Linux Networking Overview HOWTO
  <http://www.linuxdoc.org/HOWTO/Networking-Overview-HOWTO.html>を読ん
  で、それを理解してから戻って来てください。

  クライアントルータはリモートネットワークに対するゲートウェイ/ファイア
  ウォールとして動作する Linux ボックスです。見て分かるように、リモート
  ネットワークはローカルネットワーク 192.168.12.0 を使用しています。図を
  簡略化するため、ルータ内のローカルなルーティング情報を表に出しました。
  基本的な考えは、プライベートネットワーク全て (10.0.0.0, 172.16.0.0,
  192.168.0.0) に対するトラフィックがトンネルを通るように経路を定めると
  いうことです。ここで示したものは一方通行です。つまり、リモートネットワ
  ークからプライベートネットワークが見えるからといって、プライベートネッ
  トワークからリモートネットワークが見えるとは限りません。そうするために
  は経路が双方向となるよう指定しなくてはなりません。

  図より、クライアントルータを通って出たトラフィック全てはクライアントル
  ータから来ている、つまり全てが一つの IP アドレスから来ていることが分か
  るでしょう。実際のあなたのネットワーク内からの数だけ経路を設定すること
  も出来ますが、そうするとあらゆる種類のセキュリティ問題が発生することに
  なります。

  2.2.  SSHとPPP

  VPN として、SSH および PPP を用いたシステムについても記しておきます。
  基本的に私はトンネル接続するために ssh を使い、それを通して TCP/IP の
  送受信を行うために、pppd を使っています。それがトンネルの作り方です。

  ssh と pppd を一緒に動かす実際のうまい方法は、Arpad Magosanyi によって
  書かれた役にたつ文書で、それに従えば疑似端末の標準入出力をリダイレクト
  することが出来ます。これによって pppd は、 sshを通してあたかもそれがシ
  リアル回線であるかのように通信することが出来るようになります。サーバ側
  では、pppd は ssh セッションにおけるユーザのシェルのように動作してお
  り、リンクを確立しています。あとは経路の設定を行うだけです。

  2.3.  その他の VPN システム

  もちろん、VPN を構築するための他の方法もあります。ここでは他のシステム
  のうち 3つを示します。

  2.3.1.  PPTP

  PPTP はマイクロソフトの VPN のためのプロトコルです。それは Linux でサ
  ポートされていますが、深刻なセキュリティ上の問題を抱えていることが分
  かっています。どのように使用するかは Linux VPN Masquerade HOWTO
  <http://www.linuxdoc.org/HOWTO/VPN-Masquerade-HOWTO.html> に示されてい
  るので、ここでは説明しません。

  2.3.2.  IP Sec

  IP Sec は SSH とは異なるプロトコルのセットです。私は、実はそれについて
  あまりよく知らないので、誰かが説明の手助けをしてくれるなら非常にありが
  たいです。再度、その使い方についてはLinux VPN Masquerade HOWTO
  <http://www.linuxdoc.org/HOWTO/VPN-Masquerade-HOWTO.html>に示されてい
  るので、ここでは説明しないことにします。

  2.3.3.  CIPE

  CIPE は、企業向けの設定に適した、カーネルレベルのネットワーク暗号化シ
  ステムです。より詳しい内容はthe CIPE homepage
  <http://sites.inka.de/sites/bigred/devel/cipe.html>にあります。これに
  ついてはもう少し詳しく調べようと思っているので、いつかここで情報を示す
  ことができるでしょう。

  3.  サーバ

  サーバ無しではクライアントは何の役にも立たないので、このセクションでは
  最初にやるべきいくつかのことを、サーバ側でいかに設定するか述べることに
  します。

  3.1.  セキュリティ − 人々を締め出す

  VPN にとってセキュリティは非常に重要です。第一、だからこそ VPN を構築
  しているんですよね？ サーバを設定するにあたっては、いくつかのことを心
  に留めておく必要があります。

  3.1.1.  デーモンを減らせ

  このサーバはファイアウォールの両側に置かれ、トラフィックをネットワーク
  の中へ転送するように設定されているので、可能な限りその箱を安全にすると
  いうのは良い考えです。Linux のセキュリティについては Linux Security
  HOWTO <http://www.linuxdoc.org/HOWTO/Security-HOWTO.html> でさらに調べ
  ることができます。 [ 訳注：日本語訳は
  <http://www.linux.or.jp/JF/JFdocs/Security-HOWTO.html> にあります。]
  目的のために、私は sshd と Roxen Web server 以外の全てを kill しまし
  た。VPN にアクセスする新しいマシンを設定するため、 2つのファイル（スク
  リプト、その他）をダウンロードする目的でウェブサーバを利用しています。
  FTP サーバは使いません。それは、ウェブサーバ経由で多少のファイルを見え
  るようにするのに比べ、FTP サーバ経由で同じことを安全にできるように設定
  するのは難しいからです。それに、単にファイルをダウンロードできればいい
  のです。もし本当にゲートウェイで別々のサーバを走らせたいと思っているの
  であれば、プライベートネットワークにあるマシン以外、それらのサーバにア
  クセスできないよう制限すべきかも知れません。

  3.1.2.  パスワードを許すな

  そう、それは馬鹿げたことに聞こえます。けれども気になるでしょう？パスワ
  ードは使わず、それを完全に無効にしてしまうのです。このマシンの全ての認
  証は ssh の公開鍵認証システムを通して行われるべきです。この方法ではキ
  ーを持った者だけが入ることができますが、530 文字もの長さのバイナリのキ
  ーを覚えることは、殆ど不可能です。

  では、そのためにはどうすれば良いのでしょう？/etc/passwd ファイルを編集
  することが必要です。2 番目のフィールドはパスワードハッシュ、あるいは認
  証システムに /etc/shadow ファイルを見るよう指示する 'x' のいずれかが含
  まれています。しなくてはならないことは、そのフィールドを何も許されるべ
  きでないということを示します。

  典型的な /etc/passwd ファイルの形式を次に示します。

  ....
  nobody:x:65534:100:nobody:/dev/null:
  mwilson:x:1000:100:Matthew Wilson,,,:/home/mwilson:/bin/bash
  joe:*:504:101:Joe Mode (home),,,:/home/vpn-users:/usr/sbin/pppd
  bill:*:504:101:Bill Smith (home),,,:/home/vpn-users:/usr/sbin/pppd
  frank:*:504:101:Frank Jones (home),,,:/home/vpn-users:/usr/sbin/pppd
  ....

  私が 2番目のフィールドを編集するだけでなく、もっと手を加えたということ
  を覚えておいてください。他のフィールドについては後述します。

  3.2.  ユーザアクセス - みんなを中へ

  ユーザアクセスは ssh の認証スキームを通して為されます。上で述べたよう
  に、これが高レベルのセキュリティを維持しつつ、ユーザがシステムにアクセ
  スする方法です。もし ssh に馴染みがなければ、http://www.ssh.org/
  <http://www.ssh.org/>をチェックしてみてください。私が ssh のバージョン
  2 でなくバージョン 1 を使っているということに注意してください。特に、
  バージョン 1 はフリーで、2 はそうでないという大きな違いがあります。

  3.2.1.  sshd  を設定する

  あなたは sshd を設定する必要があるでしょう。オプションには次のようなも
  のがあります。意図しているのはパスワード認証および rhosts 認証を不可に
  するということです。/etc/sshd_config ファイルには、次に挙げるようなオ
  プションがあります。

  PermitRootLogin yes
  IgnoreRhosts yes
  StrictModes yes
  QuietMode no
  CheckMail no
  IdleTimeout 3d
  X11Forwarding no
  PrintMotd no
  KeepAlive yes
  RhostsAuthentication no
  RhostsRSAAuthentication no
  RSAAuthentication yes
  PasswordAuthentication no
  PermitEmptyPasswords no
  UseLogin no

  3.3.  ユーザを制限する

  これで悪い人たちは締め出され、良い人だけがアクセスを許されるようになっ
  たので、今度は良い人たちが悪さをしないように手を打っておくべきかもしれ
  ません。これは彼らに pppd 以外のものを起動させないということで、極めて
  簡単に実行できます。これは必要かもしれませんし、必要でないかもしれませ
  ん。私はユーザを制限しています。それは、保守しているシステムが VPN 専
  用であり、ユーザはその上でその他のことをする必要がないためです。

  3.3.1.  sudo か否か

  Unix システムの管理者が、あるユーザが特定のプログラムを root 権限で実
  行できるよう許可を与える、 sudo と呼ばれる小さくて素敵なプログラムがあ
  ります。pppd は root として実行する必要があるので、この場合には必要で
  す。ユーザにシェルアクセスを許可しようとする場合には、この方法を使う必
  要があるでしょう。sudo をどのように設定し、sudo をどのように使うかは
  sudo のマニュアルページで調べてください。概して、少数の信頼できるユー
  ザに使われるような複数利用システムにおいて、sudo を使うことは最善の方
  法です。

  ユーザにシェルアクセスを許可しないことを決めたならば、そこに侵入させず
  におくもっとも良い方法は、彼らのシェルを pppd にすることです。これは
  /etc/passwd ファイルによって実現できます。私が最後の 3 人のユーザにし
  たことは ``上にある記述'' で見ることが出来ます。/etc/passwd の最後の
  フィールドはユーザのシェルです。pppd を動かすために特別なことをする必
  要はありません。それはユーザが接続すると root として実行されます。これ
  は最も安全であると同時に、為し得るうちの間違いなく最も単純な設定方法で
  す。それは大規模でまとまったシステムに対しては理想的です。やるべきこと
  はこのドキュメントの後の方できちんと説明します。お望みであれば ``そち
  らを先に読む'' こともできます。

  3.4.  ネットワーキング

  これでユーザはシステムにアクセス出来るようになったわけですが、彼らが
  ネットワークにアクセスできることは確認する必要があります。私たちは
  Linux カーネルのファイアウォールのルールとルーティングテーブルによって
  それを行います。route および ipfwadm コマンドを使うと、ネットワークト
  ラフィックを適切な方法で扱うようカーネルを設定することができます。これ
  以上の ipfwadm, ipchains それから route についての情報のためにはLinux
  Networking HOWTO <http://www.linuxdoc.org/HOWTO/Linux-Networking-
  HOWTO.html> を参照してください。

  3.4.1.  カーネル

  このいくつかを動作させるためには、カーネルを正しく設定しなくてはなりま
  せん。もし自分のカーネルをどのように構築すればよいか分からないな
  ら、Kernel HOWTO <http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html>を読
  むべきです。基本ネットワークに加えて、次に示すカーネルオプションがオン
  になっていることを確認する必要があるでしょう。私は自分のシステムで
  2.0.38 カーネルを使っています。

  2.0 カーネルにおいて -

  o  CONFIG_FIREWALL

  o  CONFIG_IP_FORWARD

  o  CONFIG_IP_FIREWALL

  o  CONFIG_IP_ROUTER

  o  CONFIG_IP_MASQUERADE (optional)

  o  CONFIG_IP_MASQUERADE_ICMP (optional)

  o  CONFIG_PPP

  2.2 カーネルにおいて -

  o  CONFIG_FIREWALL

  o  CONFIG_IP_ADVANCED_ROUTER

  o  CONFIG_IP_FIREWALL

  o  CONFIG_IP_ROUTER

  o  CONFIG_IP_MASQUERADE (optional)

  o  CONFIG_IP_MASQUERADE_ICMP (optional)

  o  CONFIG_PPP

  3.4.2.  フィルタ規則

  まず、外側のインターネットへのアクセスを制限しつつ、ユーザが内部ネット
  ワークへアクセス出来るよう、ファイアウォールのフィルタ規則を記述しま
  しょう。もしこれが奇妙に聞こえるなら、それについてはこう考えてみてくだ
  さい - 彼らは既にインターネットにアクセスできる状態にあり、それでなぜ
  彼らがネットにアクセスする際にトンネルを使わせるのか。それは帯域幅とプ
  ロセッサの無駄遣いです。

  適用されるフィルタ規則は利用する内部ネットワークに依存しています。しか
  し実際、ユーザは言います - "VPN の外側から、内部ネットに向かって来てい
  るトラフィックを許可しなさい"。ではどうしたら良いのでしょうか？いつも
  のように、それは場合によるのです。もし 2.0 カーネルを動かしているなら
  ば、ipfwadm と呼ばれるツールを使います。一方、もし 2.2 カーネルを動か
  しているのなら、ipchains と呼ばれるユーティリティを使います。

  ipfwadm で規則を設定するためには、次に示すようなオプションでそれを実行
  してください。

  # /sbin/ipfwadm -F -f
  # /sbin/ipfwadm -F -p deny
  # /sbin/ipfwadm -F -a accept -S 192.168.13.0/24 -D 172.16.0.0/12

  ipchains で規則を設定するためには、次に示すようなオプションでそれを実
  行してください。

  # /sbin/ipchains -F forward
  # /sbin/ipchains -P forward DENY
  # /sbin/ipchains -A forward -j ACCEPT -s 192.168.13.0/24 -d 172.16.0.0/12

  2.2 カーネルを使っている人は``ここ''を読んでください。

  3.4.3.  ルーティング

  ユーザはネットへのアクセスを許されますので、今度はカーネルに、パケット
  を送る場所を指示しなければなりません。システムにおいて、私は 2 つのイ
  ーサネットカードを持っています。一方は外部ネットワークに対するもの、も
  う一方は内部ネットワークに対するものです。このことは、外に向かうトラ
  フィックはゲートウェイでマスカレードされ、中に入ってくる全てのトラ
  フィックは Cisco で取り除かれ 経路を定められるので、安全性を保つのに役
  立ちます。大部分の設定において、経路設定はシンプルであるべきです。

  これからやるのは、内部インターフェースから出てプライベートネットワーク
  に向かって来る全てのトラフィック、それから外部インターフェースから出る
  その他 全てのトラフィックの経路を設定するということです。特定の経路設
  定コマンドは利用している内部ネットに依存しています。以下はそれがどのよ
  うなものであるかの一つの例です。これらの行はもちろん、ローカルネットの
  基本経路に付け加えられます。それに、あなたは 内部番号の 3 グループ全て
  を使っているわけではないでしょう。

  172.16.254.254 が内部ゲートウェイであるとすると -

  # /sbin/route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.16.254.254 dev eth1
  # /sbin/route add -net 172.16.0.0 netmask 255.240.0.0 gw 172.16.254.254 dev eth1
  # /sbin/route add -net 192.168.0.0 netmask 255.255.0.0 gw 172.16.254.254 dev eth1

  経路の設定における付加的な注意です。もし、例えば離れた所にあるオフィス
  など双方向の経路設定を使っているのなら、もう一つしなくてはならないこと
  があります。サーバにおいて、クライアントへ戻る経路を設定する必要があり
  ます。これをやり遂げる最も簡単な方法は、静かに戻りの経路を設定するよう
  な cron ジョブを 1 分毎に実行することです。クライアントが接続していな
  くてもたいした問題ではなく、route はエラー（あなたが都合のいいように
  /dev/null に送った）を吐くだけです。

  4.  クライアント

  さてクライアントの方を調べてみましょう。実際、リモートネットワークに対
  して常にアクセスを許すときには、この箱は簡単に Samba（Windows ネットワ
  ーク）サーバ、 DHCP サーバ、それから内部のウェブサーバにできます。覚え
  ておかなくてはならない重要なことは、この箱はリモートネットワーク全体で
  動作するのですから、可能な限り安全であるべきだということです。

  4.1.  カーネル

  重要なものから先に話しておくと、あなたはカーネルの中で ppp を有効にし
  ておく必要があります。もし複数のマシンに対してトンネルの使用を許そうと
  しているのであれば、ファイアウォール、フォワーディングも有効にしておく
  必要があります。クライアントが単一のマシンであるなら、ppp だけで十分で
  す。

  4.2.  リンクを確立する

  リンクは、擬似端末を通して動作している pppd によって生成されます。（そ
  の擬似端末は）pty-redir によって生成され、ssh に接続されています。これ
  は次に示すようなコマンド列によって実現されます -

  # /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l joe > /tmp/vpn-device
  # sleep 10

  # /usr/sbin/pppd `cat /tmp/vpn-device`
  # sleep 15

  # /sbin/route add -net 172.16.0.0 gw vpn-internal.mycompany.com netmask 255.240.0.0
  # /sbin/route add -net 192.168.0.0 gw vpn-internal.mycompany.com netmask 255.255.0.0

  単にこれがやるのは ssh を実行し、その入出力を pppd にリダイレクトする
  ということです。ssh に渡されるオプションは、それをエスケープキャラクタ
  なしで動作し (-e) 、 blowfish 暗号化アルゴリズムを使い (-c)、指定した
  認証ファイルを使って (-i)、ターミナルモードで (-t)、さらに 'Batchmode
  yes' オプションつきで (-o) 実行するよう設定します。 sleep コマンドは、
  それぞれがその次のコマンドの実行前に起動を完了できるように、コマンドの
  実行の間隔をあけるために使用されます。

  4.3.  スクリプトを書く

  もちろん、あなたはトンネルを通過させたいときに、その都度それらのコマン
  ドを入力したくはないでしょう。私はトンネルをそのまま通れるようにしてお
  くような bash スクリプトのセットを書きました。パッケージはここ
  <http://www.shinythings.com/vpnd/vpnd.tar.gz>からダウンロードできま
  す。ダウンロードして /usr/local/vpn に伸長してください。その中には 3
  つのファイルがあります -

  o  vpnd - トンネル接続を制御するスクリプト

  o  check-vpnd - vpnd が起動しているかどうかをチェックするために cron
     によって実行されるスクリプト

  o  pty-redir - トンネルを初期化するために必要な、小さな実行ファイル

  クライアントのユーザ名やサーバの名前というようなことを設定するためには
  vpnd を編集する必要があるでしょう。また利用しているネットワークを指定
  するために、スクリプトの starttunnel セクションを編集する必要もあるで
  しょう。以下はあなたに喜んで読んでもらうための、スクリプトのコピーで
  す。スクリプトは別なディレクトリに入れておくことができ、そのためには
  VPN_DIR 変数を変更すればよいということを覚えておいてください。

  #! /bin/bash
  #
  # vpnd: Monitor the tunnel, bring it up and down as necessary
  #

  USERNAME=vpn-username
  IDENTITY=/root/.ssh/identity.vpn

  VPN_DIR=/usr/local/vpn
  LOCK_DIR=/var/run
  VPN_EXTERNAL=vpn.mycompany.com
  VPN_INTERNAL=vpn-internal.mycompany.com
  PTY_REDIR=${VPN_DIR}/pty-redir
  SSH=${VPN_DIR}/${VPN_EXTERNAL}
  PPPD=/usr/sbin/pppd
  ROUTE=/sbin/route
  CRYPTO=blowfish
  PPP_OPTIONS="noipdefault ipcp-accept-local ipcp-accept-remote local noauth nocrtscts lock nodefaultroute"
  ORIG_SSH=/usr/bin/ssh

  starttunnel () {
     $PTY_REDIR $SSH -t -e none -o 'Batchmode yes' -c $CRYPTO -i $IDENTITY -l $USERNAME > /tmp/vpn-device
     sleep 15

     $PPPD `cat /tmp/vpn-device` $PPP_OPTIONS
     sleep 15

     # Add routes (modify these lines as necessary)
     /sbin/route add -net 10.0.0.0 gw $VPN_INTERNAL netmask 255.0.0.0
     /sbin/route add -net 172.16.0.0 gw $VPN_INTERNAL netmask 255.240.0.0
     /sbin/route add -net 192.168.0.0 gw $VPN_INTERNAL netmask 255.255.0.0
  }

  stoptunnel () {
     kill `ps ax | grep $SSH | grep -v grep | awk '{print $1}'`
  }

  resettunnel () {
     echo "reseting tunnel."
     date >> ${VPN_DIR}/restart.log
     eval stoptunnel
     sleep 5
     eval starttunnel
  }

  checktunnel () {
     ping -c 4 $VPN_EXTERNAL 2>/dev/null 1>/dev/null

     if [ $? -eq 0 ]; then
        ping -c 4 $VPN_INTERNAL 2>/dev/null 1>/dev/null
        if [ $? -ne 0 ]; then
           eval resettunnel
        fi
     fi
  }

  settraps () {
     trap "eval stoptunnel; exit 0" INT TERM
     trap "eval resettunnel" HUP
     trap "eval checktunnel" USR1
  }

  runchecks () {
     if [ -f ${LOCK_DIR}/tunnel.pid ]; then
        OLD_PID=`cat ${LOCK_DIR}/vpnd.pid`
        if [ -d /proc/${OLD_PID} ]; then
           echo "vpnd is already running on process ${OLD_PID}."
           exit 1
        else
           echo "removing stale pid file."
           rm -rf ${LOCK_DIR}/vpnd.pid
           echo $$ > ${LOCK_DIR}/vpnd.pid
           echo "checking tunnel state."
           eval checktunnel
        fi
     else
        echo $$ > ${LOCK_DIR}/vpnd.pid
        eval starttunnel
     fi
  }

  case $1 in
      check)  if [ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then
                 kill -USR1 `cat ${LOCK_DIR}/vpnd.pid`
                 exit 0
              else
                 echo "vpnd is not running."
                 exit 1
              fi ;;

      reset)  if [ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then
                 kill -HUP `cat ${LOCK_DIR}/vpnd.pid`
                 exit 0
              else
                 echo "vpnd is not running."
                 exit 1
              fi ;;

     --help | -h)
              echo "Usage: vpnd [ check | reset ]"
              echo "Options:"
              echo "     check    Sends running vpnd a USR1 signal, telling it to check"
              echo "              the tunnel state, and restart if neccesary."
              echo "     reset    Sends running vpnd a HUP signal, telling it to reset"
              echo "              it's tunnel connection." ;;
  esac

  ln -sf $ORIG_SSH $SSH
  settraps
  runchecks

  while true; do
     i=0
     while [ $i -lt 600 ]; do
        i=((i+1))
        sleep 1
     done
     eval checktunnel
  done

  4.4.  LRP - Linux ルータプロジェクト

  実際、私はこの環境を Linux の LRP ディストリビューションが走る pentium
  90MHz の上で動作させています。LRPは 1 枚のフロッピーディスクに収まり、
  起動する Linux ディストリビューションです。これ以上のことについては
  http://www.linuxrouter.org/ <http://www.linuxrouter.org/> で学ぶことが
  できます。私の VPN クライアント用の LRP パッケージは、ここ
  <http://www.shinythings.com/vpnd/vpnd.lrp>からダウンロードできます。そ
  れから ppp および ssh パッケージも LRP サイトから得る必要があるでしょ
  う。

  5.  実行

  このセクションでは VPN システムの構築法について順番に説明します。まず
  サーバから始め、次にクライアントへと移っていきます。例とするために、異
  なる 2 種類の VPN 設定を必要とする状況を考えてみます。

  5.1.  計画

  mycompany.com という会社を持っていると想像してみてください。本社オフィ
  スで、予約されたネットワーク 192.168.0.0 を使っており、経路設定を許す
  ようにクラス B ネットワークを 256 のクラス C にしています。ちょうど 2
  つの小さな離れた所にあるオフィスを設定したところで、それらをネットワー
  クに追加したいと思っています。また自宅から仕事している従業員に、彼らが
  ダイヤルアップする代わりに DSL や ケーブルモデムで接続できるようにさせ
  たいとも思っています。始めるためには少しばかり計画を立てなくてはなりま
  せん。

  それぞれの離れた所にあるオフィスで必要に応じて拡張できるよう、クラス C
  ネットワークの範囲を割り当てることにします。そこで、192.168.10.0 と
  192.168.11.0 ネットを予約します。自宅ユーザに対しても VPN サーバ側でマ
  スカレードする必要のない十分な数を確保することにします。各クライアント
  はそれ自身の内部 IP を取得します。そこで、そのために他のクラス
  C、192.168.40.0 を予約する必要があります。今やらなくてはならないのは、
  ルータにそれらの範囲を追加することです。私たちの会社が、OC1 を通過する
  トラフィック全てを取り扱う小さな Cisco (192.168.254.254) を所有してい
  ると思ってください。それらの予約されたネットから VPN サーバ
  (192.168.40.254) へ向かうトラフィックを Cisco 上で経路設定してくださ
  い。私は後で明かす理由のため、VPN サーバを自宅ユーザのネットに組み入れ
  ます。サーバの外部インターフェースは vpn.mycompany.com 、内部インター
  フェースは vpn-internal.mycompany.com と名づけることにします。

  外部番号について、はっきりと知っておく必要はありません。 ISP によって
  割り当てられた自分自身の番号を知っているべきです。

  5.2.  ツールを集める

  多少、ソフトウェアが必要になってきました。次に挙げるパッケージを取得し
  て、指定された場所にインストールしてください。

  5.2.1.  サーバに対して -

  o  pppd (バージョン 2.3 以降)

  o  ssh (バージョン 1.2.26 以降)

  5.2.2.  クライアントに対して -

  o  pppd (サーバと同じバージョン)

  o  ssh

  o  pty-redir <ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz>

  5.3.  サーバ - カーネルを構築する

  最初に、多分、あなたはサーバのためにカーネルを再構築する必要があるで
  しょう。基本ネットワークやその他の必要な項目に加えて、必ず以下のオプ
  ションをオンにしてください。もし以前にカーネルを構築したことがなけれ
  ば、Kernel HOWTO <http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html>を読
  んでください。 [訳注：日本語訳は
  <http://www.linux.or.jp/JF/JFdocs/Kernel-HOWTO.html> にあります。]

  2.0 カーネルに対して -

  o  CONFIG_FIREWALL

  o  CONFIG_IP_FORWARD

  o  CONFIG_IP_FIREWALL

  o  CONFIG_IP_ROUTER

  o  CONFIG_PPP

  2.2 カーネルに対して -

  o  CONFIG_FIREWALL

  o  CONFIG_IP_ADVANCED_ROUTER

  o  CONFIG_IP_FIREWALL

  o  CONFIG_IP_ROUTER

  o  CONFIG_PPP

  5.4.  サーバ - ネットワークを設定する

  ネットワークカード 1 枚しかないサーバを構築しようとしているのであれ
  ば、もう 1 枚買って、新たに配線することを検討するよう勧めます。ネット
  ワークの非公開性をそのままにしておく一番良い方法は、それをそれ自身の線
  に割り当てることです。もし 2 枚のネットワークカードを持っているのであ
  れば、それぞれの設定方法を知る必要があります。私たちは外部インターフェ
  ースに eth0、内部インターフェースに eth1 を使います。

  5.4.1.  インターフェースを設定する

  最初にサーバの外部インターフェースを設定する必要があります。既にどうす
  れば良いか知っているはずですし、多分、既に設定してしまった事でしょう。
  まだであれば、すぐにやってください。どうすれば良いか分からなければ、
  戻って Networking HOWTO
  <http://www.linuxdoc.org/HOWTO/NET3-4-HOWTO.html> を読んでください。

  では内部インターフェースを設定します。番号は私たちの選択によって、サー
  バの内部インターフェースが 192.168.40.254 です。ではそのインターフェー
  スを設定しましょう。

  2.0 カーネルでは次を使ってください -

  # /sbin/ifconfig eth1 192.168.40.254 netmask 255.255.255.0 broadcast 192.168.40.255
  # /sbin/route add -net 192.168.40.0 netmask 255.255.255.0 dev eth1

  2.2 カーネルでは次を使ってください -

  # /sbin/ifconfig eth1 192.168.40.254 netmask 255.255.255.0 broadcast 192.168.40.255

  それで基本インターフェースが用意できます。これで両方のローカルネットワ
  ークによってサーバに繋がったマシンに話しかけることができます。

  5.4.2.  経路を設定する

  私たちはローカルネットにあるマシンと話すことはできる様になりましたが、
  内部ネットワークの残りとは話すことができません。そうするにはもう数行コ
  ードが必要です。他のサブネットにあるほかのマシンに到達するためには、ト
  ラフィックが Cisco ルータに向かうような経路を知る必要があります。次の
  ようにします -

  # /sbin/route add -net 192.168.0.0 gw 192.168.254.254 netmask 255.255.0.0 dev eth1

  その行は、192.168.0.0 ネットワークに行くことになっているいくつかのトラ
  フィックは eth1 を出るべきで、それは Cisco に伝えられるべきであるとい
  うことをカーネルに伝えます。ルーティングテーブルがネットマスクのサイズ
  で決められるため、ローカルネットに向かうトラフィックには、まだ向かうべ
  き場所が分かっています。もし他にもネットワークの中に内部的なネットワー
  クがあるなら、それぞれに対して、上記のような指定をすることになります。

  5.4.3.  フィルタ規則を作成する

  OK, 必要とされ得るマシン全てに到達できるようになりました。今度は、VPN
  サーバを通してアクセスを許すか許さないかという、ファイアウォールのフィ
  ルタ規則を記述しなくてはなりません。

  ipfwadm で規則を指定するには、次のようにします -

  # /sbin/ipfwadm -F -f
  # /sbin/ipfwadm -F -p deny
  # /sbin/ipfwadm -F -a accept -S 192.168.40.0/24 -D 192.168.0.0/16
  # /sbin/ipfwadm -F -a accept -b -S 192.168.10.0/24 -D 192.168.0.0/16
  # /sbin/ipfwadm -F -a accept -b -S 192.168.11.0/24 -D 192.168.0.0/16

  ipchains で規則を指定するには、次のようにします -

  # /sbin/ipchains -F forward
  # /sbin/ipchains -P forward DENY
  # /sbin/ipchains -A forward -j ACCEPT -s 192.168.40.0/24 -d 192.168.0.0/16
  # /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.10.0/24 -d 192.168.0.0/16
  # /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.11.0/24 -d 192.168.0.0/16

  これはカーネルに、192.168.40.0/24 ネットワークから来て 192.168.0.0/16
  ネットワークに向かうものを除いた、全てのトラフィックを拒絶するように伝
  えます。それはまた、192.168.10.0/24 と 192.168.0.0/16 ネットとの間でや
  りとりされるトラフィックを許可するということをも伝えます。
  192.168.11.0 ネットに対しても同様です。これらの最後 2 つは双方向の規則
  で、これは双方向にやりとりできるよう経路を定めるためには重要なことで
  す。

  5.4.4.  経路を設定する

  自宅ユーザにとっては、ここまでで全てがうまく動作するでしょう。しかし、
  離れた所にあるオフィスのためにはいくらか経路を設定しなくてはなりませ
  ん。まず最初に、メインルータ、すなわち Cisco に、離れた所にあるオフィ
  スは VPN サーバの影に隠れているということを教えてやる必要があります。
  ですから Cisco に対して、離れた所にあるオフィス行きのトラフィックを
  VPN サーバに送るような経路を指定してください。それがすんだら、今度は離
  れたオフィスに向かうトラフィックをどうすべきか VPN サーバに教えてやら
  なくてはなりません。これをするには route コマンドをサーバで実行しま
  す。 route コマンドを動作させる上での唯一の問題は、リンクは確立されて
  いなくてはならず、もし切れてしまうと経路が失われてしまうということで
  す。解決策は、クライアントが接続してきたら経路を追加してやる、あるい
  は、route コマンドは必要以上に実行しても問題無いので、より簡単な方法と
  しては、それを度々実行してやることです。では、スクリプトを作成して、数
  分毎に実行されるようそれを crontab に加えてください。その中には次のよ
  うに書いてください -

  /sbin/route add -net 192.168.11.0 gw 192.168.10.253 netmask 255.255.255.0
  /sbin/route add -net 192.168.10.0 gw 192.168.11.253 netmask 255.255.255.0

  5.5.  サーバ - pppd  を設定する

  さて今度は VPN 接続を取り扱うためにサーバの pppd を設定しましょう。も
  しこのサーバを、ダイヤルアップユーザを処理するのに使っている、あるいは
  あなた自身がダイヤルするのに使っているのであれば、これらの変更がそれら
  のサービスに影響を与えるかもしれないということを覚えておくべきです。こ
  のセクションの最後で、いかにして衝突を回避するか検討します。

  5.5.1.  /etc/ppp/

  このディレクトリにはたくさんのファイルがあるかもしれません。多分あなた
  は既に、options と呼ばれるファイルを持っているでしょう。このファイルに
  は pppd に対する大域的なオプションの全てが入っています。これらのオプ
  ションは pppd のコマンドラインで無効にすることはできません。

  5.5.2.  /etc/ppp/options

  options ファイルは少なくとも次のような記述を含んでいるはずです -

  ipcp-accept-local
  ipcp-accept-remote
  proxyarp
  noauth

  最初の 2 行は pppd に、他の端が IP アドレスとして指定したものを受け入
  れるよう指示します。これは離れた所にあるオフィスに接続するときには必要
  ですが、しかし自宅のユーザに接続しているのならば無効にすることができま
  す。それはサーバがアドレスを割り当てることを妨げはしませんので有効にし
  ておいて構いません。それはクライアントが求めてきたことを受け入れて良い
  ということを伝えるだけです。

  3 行目は非常に重要です。pppd のマニュアルページによると -

  proxyarp
         このシステムの ARP [Address Resolution Protocol] テーブルに対して
         ピアの IP アドレスとこのシステムのイーサネットアドレスを付け加えます。
         これによって、ピアが他のシステムから見てローカルなイーサネットに
         あるように見えるという効果がもたらされます。

  それが為されていなければ ローカルなトラフィックがトンネルを通って戻っ
  て来れなくなるため、これは非常に重要です。

  最後の行も同じく重要です。これは pppd にユーザ名とパスワード無しで接続
  を許すよう指示します。これは sshd によって既に認証が為されているので安
  全です。

  5.5.3.  衝突を回避する

  もしあなたが pppd で他のサービスを扱っているなら、それらの他のサービス
  の設定は VPN システムが必要としているものとは異なっているかも知れない
  ということを考えてみるべきです。pppd は /etc/ppp/options メインオプ
  ションファイルの中のオプションは実行時に指定されたオプションによって無
  効にできないように設計されています。これはセキュリティ上の理由に拠りま
  す。衝突を避けるため、どのオプションが衝突を起こしているか特定して下さ
  い。そしてそれらをメインファイルから pppd の特定のアプリケーション実行
  中にロードされる分離されたオプションファイルに移してください。

  5.6.  サーバ - sshd  を設定する

  次に挙げるのは私の /etc/sshd_configファイルの内容です。あなたのファイ
  ルも、同じか、または似た形式をしているはずです -

  # This is the ssh server system wide configuration file.

  Port 22
  ListenAddress 0.0.0.0
  HostKey /etc/ssh_host_key
  RandomSeed /etc/ssh_random_seed
  ServerKeyBits 768
  LoginGraceTime 600
  KeyRegenerationInterval 3600
  PermitRootLogin yes
  IgnoreRhosts yes
  StrictModes yes
  QuietMode no
  FascistLogging yes
  CheckMail no
  IdleTimeout 3d
  X11Forwarding no
  PrintMotd no
  KeepAlive yes
  SyslogFacility DAEMON
  RhostsAuthentication no
  RhostsRSAAuthentication no
  RSAAuthentication yes
  PasswordAuthentication no
  PermitEmptyPasswords no
  UseLogin no

  気をつけておくべき重要な点は、パスワード認証は "r" サービス全てにおい
  て無効になっているということです。私は、メールチェックやその日のメッセ
  ージも、クライアント側から pppd を混乱させ得るので無効にしていま
  す。root ログインは許可していますが、それはキーなしには実行できないた
  め、十分に安全です。

  5.7.  サーバ - ユーザアカウントを設定する

  次はユーザアカウントを設定します。

  5.7.1.  vpn-users  グループを追加する

  実行してください。

  # /usr/sbin/groupadd vpn-users

  では /etc/group ファイルを cat して最後の行を見てください。それは vpn-
  users グループのためのエントリになっているはずです。 3 番目のフィール
  ドに注意してください。これはグループ ID (GID) です。すぐに必要になるの
  でそれを書き留めておいてください。この例では GID は 101 です。

  5.7.2.  vpn-users  のホームディレクトリを作る

  私たちはユーザ全てのために一つのホームディレクトリを使おうとしていま
  す。では実行してください -

  # mkdir /home/vpn-users

  5.7.3.  .ssh  ディレクトリ

  .ssh ディレクトリを vpn-users ホームディレクトリの中に作成します。

  # mkdir /home/vpn-users/.ssh

  5.7.4.  ユーザを追加する

  さて面白い部分にやってきました。これから /etc/passwd ファイルを手で編
  集するわけです。:) 通常はシステムに操作させるファイルなのですが、こう
  いう変わった設定を行うときには自分で書き換える方が簡単です。最初に
  /etc/passwd ファイルを開いてそこに何があるか見てみましょう。ここは次の
  例のようになっているはずです -

  ....
  nobody:x:65534:100:nobody:/dev/null:
  mwilson:x:1000:100:Matthew Wilson,,,:/home/mwilson:/bin/bash
  joe:*:1020:101:Joe Mode (home),,,:/home/vpn-users:/usr/sbin/pppd
  bill:*:1020:101:Bill Smith (home),,,:/home/vpn-users:/usr/sbin/pppd
  frank:*:1020:101:Frank Jones (home),,,:/home/vpn-users:/usr/sbin/pppd
  ....

  殆どのシステムに最初の行のユーザが見つかるでしょう。 2 番目のユーザは
  私です。:) その次は何人かの作成された vpn-user です。最初のフィールド
  はユーザ名で、2 番目はパスワードのフィールドです。 3 番目はユーザ ID
  (UID) で 4 番目はグループ ID (GID) です。つづく 5 番目のフィールドは各
  ユーザの個人情報です。 6 番目のフィールドはユーザのホームディレクトリ
  で、最後は彼らのシェルです。ご覧のとおり、各フィールドはコロンで区切ら
  れています。最後の 3 行を見てください。それらの間での唯一の違いは、最
  初のフィールドのユーザ名と、5 番目のフィールドのユーザ情報です。やりた
  いのは、各ユーザに対してこのような行を作成することです。接続全てに単一
  のユーザを使わないでください。もしそうすると、彼ら個々を見分けることは
  できなくなります。そこで、上に示したような内容になるよう、このファイル
  の最後の行をコピーしてそれを編集してください。2 番目のフィールドにアス
  タリスク (*) があることを確認してください。3 番目のフィールドは、その
  ファイルの他の ID 全てと違っているべきです。私は 1020 を使いました。普
  通 1000 未満はシステムの利用のために予約されていますので、それ以上を使
  うべきです。 4 番目のフィールドは vpn-user のグループ ID のはずです。
  私は書き留めておくよう言いました。それが必要なときがやってきました。で
  はグループ ID をそこに入れてください。最後に、ホームディレクトリを
  /home/vpn-users 、シェルを /usr/sbin/pppd に変更してください。できまし
  た。ではその行を他のユーザを作成するためにコピーしてください。1 番目と
  5 番目のフィールドを編集して設定するだけです。

  5.8.  サーバ - 管理する

  ユーザアカウントに対してこのシステムを利用することの利点の一つは、
  UNIX ユーザ管理コマンドを利用することができるということです。クライア
  ントはユーザとしてログインしていますので、あなたはユーザの統計を得るた
  めに標準的な方法を使うことができます。次に挙げるのは、全てがどうなって
  いるのか見るために私が好んで使っている、少数のコマンドです。

     who
        現在ログインしているユーザ、それから彼らが何時、どこ (名前か IP)
        から、どのポートでログインしたかを表示します。

     w  このコマンドは現在ログインしている人についてより広範囲なリストを
        表示します。それはシステムの利用時間と平均負荷も知らせてくれま
        す。またユーザの、アイドル時間を含む現在のプロセス (VPN クライア
        ントにとっては -pppd のはずです)、それから現在のプロセスを含む全
        てのプロセスの CPU 利用方法も表示します。これ以上の情報について
        は w のマニュアルページを読んでください。

     last [username]
        これは指定されたユーザ、あるいはユーザ名が指定されなければ全ての
        ユーザのログイン履歴を表示します。それはユーザがログインしていた
        時間、あるいはユーザがまだログインしていることを示すので、トンネ
        ルがいかにうまく動作しているか確かめるには最も便利な方法です。シ
        ステムが長い時間 起動しつづけていると、このリストは非常に長くな
        り得るということを警告しておきます。パイプは grep あるいは head
        を通って、知りたいことを確実に見つけます。

  /home/vpn-users/.ssh/authorized_keys ファイルを変更して、接続を許可す
  るユーザを制御することもできます。もしそのユーザの公開キーの行をこの
  ファイルから削除すると、彼らはログインすることができなくなるでしょう。

  5.9.  クライアント - カーネルを構築する

  クライアントに移りましょう。最初に、必要とする機能全てをサポートできる
  ように、カーネルを再構築しなくてはなりません。最低限求められるのは、カ
  ーネル内に ppp を組み込むことです。その後、他のマシンに対してトンネル
  へのアクセスを許可しようとしている場合に限ると、フォワーディング、ファ
  イアウォール、ゲートウェイ機能が必要となるでしょう。この例では、例とし
  て示したレイアウトの中の、離れたところにあるオフィスのマシンのうちの一
  台を設定することにします。次に挙げるオプションを追加してください。繰り
  返しになりますが、もしあなたが以前にカーネルを構築したことがないのであ
  れば、 Kernel HOWTO
  <http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html>を読んでください。
  [訳注：日本語訳は  <http://www.linux.or.jp/JF/JFdocs/Kernel-
  HOWTO.html> にあります。]

  2.0 カーネルに対して -

  o  CONFIG_PPP

  o  CONFIG_FIREWALL

  o  CONFIG_IP_FORWARD

  o  CONFIG_IP_FIREWALL

  o  CONFIG_IP_ROUTER

  o  CONFIG_IP_MASQUERADE

  o  CONFIG_IP_MASQUERADE_ICMP

  2.2 カーネルに対して -

  o  CONFIG_PPP

  o  CONFIG_FIREWALL

  o  CONFIG_IP_ADVANCED_ROUTER

  o  CONFIG_IP_FIREWALL

  o  CONFIG_IP_ROUTER

  o  CONFIG_IP_MASQUERADE

  o  CONFIG_IP_MASQUERADE_ICMP

  5.10.  クライアント - ネットワークを設定する

  さて、クライアントボックスを設定しましょう。外部ネットワークの設定が済
  んで、それが動作していると想像しましょう。今度は、イントラネットをサー
  ビスするためにクライアントの内部インターフェースを設定することになるで
  しょう。

  5.10.1.  インターフェース

  まず最初に内部ネットワークインターフェースを設定する必要があります。こ
  れをやるには次を /etc/rc.d/rc.inet1 (あるいはそれに相当する) ファイル
  に追加してください -

  2.0 カーネルに対して -

  /sbin/ifconfig eth1 192.168.10.253 broadcast 192.168.10.255 netmask 255.255.255.0
  /sbin/route add -net 192.168.10.0 netmask 255.255.255.0 dev eth1

  2.2 カーネルに対して -

  /sbin/ifconfig eth1 192.168.10.253 broadcast 192.168.10.255 netmask 255.255.255.0

  5.10.2.  フィルタ規則

  離れた所にあるオフィスを設定するために、トンネルを通して双方向にトラ
  フィックが行き来することを許すようなフィルタ規則を設定した方がよいで
  しょう。次に挙げる行を /etc/rc.d/rc.inet1 (またはそれに相当する) ファ
  イルに追加してください -

  2.0 カーネルに対して -

  /sbin/ipfwadm -F -f
  /sbin/ipfwadm -F -p deny
  /sbin/ipfwadm -F -a accept -b -S 192.168.10.0/24 -D 192.168.0.0/16

  2.2 カーネルに対して -

  /sbin/ipchains -F forward
  /sbin/ipchains -P forward DENY
  /sbin/ipchains -A forward -j ACCEPT -b -s 192.168.10.0/24 -d 192.168.0.0/16

  あなたは、これらの行がサーバにあるものと似ていることに気づいたかもしれ
  ません。なぜかというとそれは同じものだからです。この規則はまさに、これ
  らの 2 つのネットワークの間でトラフィックが向かうことができる場所を述
  べています。

  5.10.3.  経路を設定する

  唯一必要な特別の経路はトンネルを構築するスクリプトによって作られます。

  5.11.  クライアント - pppd を設定する

  クライアントの /etc/ppp/options ファイルを編集する必要は全くないかもし
  れません。"auth" オプション、あるいは他の特権オプションが与えられた場
  合はその必要があるでしょう。やってみて駄目だったら、不正な
  /etc/ppp/options が動作するでしょう。どれ(もしそれが明白でなければ)が
  おかしくしたのかを見つけるために、古いファイルからオプションを追加しつ
  づけ、それを回避できるかどうか見極めてください。それらは全く必要ないか
  もしれません。あなたが pppd を他のことに使っていなければ、多分必要ない
  でしょう。

  5.12.  クライアント - ssh  を設定する

  クライアントの root で次の行を実行してください -

  # mkdir /root/.ssh
  # ssh-keygen -f /root/.ssh/identity.vpn -P ""

  これは .ssh ディレクトリに identity.vpn と identity.vpn.pub の 2 つの
  ファイルを作成するでしょう。最初はあなたのプライベートキーで、そのまま
  にしておくべきです。暗号化されたセッションを通すのでない限り、ネット上
  でこれを絶対に送信しないでください。2 番目のファイルはあなたの公開キー
  で、あなたが他のシステムにアクセスすることを許可するだけで、あなたのシ
  ステムに入るために使うことはできないので、これは何処でも好きなところへ
  送ることができます。それは実際のキーを 1 行含むテキストファイルです。
  行の最後は、キーを壊すことを怖がらずに変更できるコメントフィールドで
  す。例えばキーは次のようなものです -

  1024 35 1430723736674162619588314275167.......250872101150654839 root@vpn-client.mycompany.com

  実際にはそれよりかなり長いですが、全部を見せたとしてもページにはそぐわ
  ないでしょう。サーバの /home/vpn-users/.ssh/authorized_keys ファイルに
  キーをコピーしてください。1 行あたり 1 つのキーがあり、各キーが複数行
  にまたがって壊れていないことを確認してください。どの行がどのユーザに対
  応するのか思い出す助けになるよう、コメントフィールド全てを好きなように
  変更することができます。私はそうすることを強く勧めます。

  5.13.  クライアント - 接続を確立する

  では VPN サーバに実際に接続してみましょう。まず、単一の接続を行い、
  ssh のknown_hosts ファイルの設定をする必要があります。これを実行してく
  ださい -

  # ssh vpn.mycompany.com

  接続を続けたいかどうか質問されたときに ''yes'' と答えてください。サー
  バは ''permission denied'' と言うかも知れませんが、大丈夫です。サーバ
  に対して、接続スクリプトの中で使っているのと同じ名前を使うということは
  重要です。では、次の行を実行してください。きっと、設定を適合させるため
  にオプションの殆どを変更する必要があるでしょう。

  # /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l vpn-user vpn.mycompany.com > /tmp/vpn-device

  (10 秒ほど待ちましょう)

  # /usr/sbin/pppd `cat /tmp/vpn-device` 192.168.10.254:192.168.40.254

  pppd の行で指定されている IP アドレスに注意してください。最初はトンネ
  ルのクライアント側の端のアドレスです。2 番目はトンネルのサーバ側の端の
  アドレスでそれはサーバの内部アドレスになっています。もしそれらの全てが
  動作しているようなら、続けてください。もしそうでないなら、指定したオプ
  ション全てに対して、それらが正しくつづられているかチェックしてくださ
  い。もしまだ何かがうまくいかないなら、``落とし穴 セクション''をチェッ
  クしてみてください。

  5.14.  クライアント - 経路を設定する

  では、経路を、トンネルを通してトラフィックを送るように設定してくださ
  い。これを実行するだけです -

  # /sbin/route add -net 192.168.0.0 gw vpn-internal.mycompany.com netmask 255.255.0.0

  これでトンネルの他端にあるマシンと通信できるようになっているはずです。
  やってみてください。すんなりいった？ もしうまく動かないなら、どこに問
  題があるのかを突き止めるためにping や traceroute を使ってみてくださ
  い。もし実は動いているなら、スクリプトがあなたのためにその仕事をしてく
  れるよう設定を続けてください。

  5.15.  クライアント - スクリプトを書く

  私が ``ここ'' で示した vpnd スクリプトを使ってください。ただ、少し変更
  する必要があります。次の変更を行ってください -

  o  環境に合うよう先頭の変数を変更してください。殆どはそのままで大丈夫
     ですが、必要なら変えることができます。

  o  27 行目 - ローカル、それからリモートの IP アドレスを $PPP_OPTIONS
     の前に加えてください。

  o  31 行目 - この行と後の 2 行を、内部ネットの経路を設定するように変更
     してください。

  5.15.1.  実行させ続ける

  bash スクリプトは普通安定していますが、失敗することが知られています。
  vpnd スクリプトが動作を続けていることを確かめるためには、クライアント
  の crontab に check-vpnd スクリプトを起動するエントリを追加してくださ
  い。私は 5 分かそこいら毎に私のものを起動しています。もし vpnd が本当
  に実行されているとしても、 check-vpnd はそれ程多くの CPU を使用しませ
  ん。
  6.  付記

  6.1.  落とし穴

  このシステムを使う際、私が陥ったいくつかの思わぬ障害を挙げます。願わく
  ばあなたがそれらを避けることができるように、それらをここに示しました。
  もし新たな障害に陥ったなら、私がそれを見逃さず、そして他の人がそれらを
  避けることができるように、それらについてメール
  <mailto:matthew@shinythings.com>をください。

  6.1.1.  read: I/O error (読み込み - I/O エラー)

  このエラーは明らかに pppd からきています。それは pppd のバージョンの不
  整合に関連しています。それが起こったなら、接続の両端を pppd の最新のバ
  ージョンにアップグレードしてみてください。私は pppd のバージョン 2.2
  はこの問題があることに気づきましたので、代わりにバージョン 2.3.7 ある
  いは 2.3.8 を使ってください。

  6.1.2.  SIOCADDRT: Network is unreachable (SIOCADDRT - ネットワークは
  到達不能)

  この問題は route によって生み出されます。私は ssh と pppd の間のスリー
  プ時間が十分長くなかった場合にそれが起こることを知りました。もしこのエ
  ラーに遭遇したら、ifconfig を実行してみて下さい。 pppX インターフェー
  スがないのが分かるかもしれません。これは、 ssh が pppd が動き始める前
  に認証を行っておらず、 pppd が接続を実行していないためであるということ
  を意味しています。単純に遅延時間を引き延ばしてください。そうすれば問題
  は解決するでしょう。

  この問題を修正するような pppd のオプションは無いのでしょうか。

  6.1.3.  IPv4 フォワーディングと 2.2 カーネル

  新しい 2.2 カーネルでは、起動時にカーネルの中で IP フォワーディングを
  特に有効にする必要があります。これは次のコマンドで行います -

  # echo 1 > /proc/sys/net/ipv4/ip_forward

  これ無しでは、カーネルは如何なるパケットも転送せず、その結果サーバ、さ
  らにゲートウェイしているクライアントのいくらかが動作しないことになるで
  しょう。

  6.1.4.  経路を設定する

  言うまでもないことですが、実際の数値を設定するときには、トンネルを通っ
  て VPN サーバの外部アドレスに向かう経路をトラフィックに対して設定しな
  いよう注意してください。それはうまくいかないでしょう。 (そうです。これ
  は個人的な経験からきています。)

  6.2.  ハードウェアおよびソフトウェア要件

  6.2.1.  最低限のハードウェア要件

  信じようが信じまいが、このシステムは 8 メガバイト RAM の 486SX33 で動
  作していました。とはいっても大量のトラフィックを扱ううえで問題があり、
  さほどうまく動いてはいませんでした。

  しかし、動くようにするのにさほど多くは必要ありません。このシステムはフ
  ロッピー上で動作する LRP ディストリビューションを使い、6 メガの
  RAMDISK と 10 メガのメインメモリを備えた、RAM 16 メガの Pentium 75 の
  上で実に良好に動作します。私はこの環境を、700kbit の RealVideo を 1 時
  間以上流してテストしました。

  安っぽい 100Mbit イーサネットカードを挿したそれらの PCI がより良く時間
  を刻んでいるので、私は現在それを、概して Pentium 90 の上で動かしていま
  す。

  6.2.2.  ソフトウェア要件

  このシステムは 2.0 および 2.2 カーネルにおいて動作します。トンネルを開
  いたままにしておくスクリプトは、適度に新しい bash を必要とします。しか
  し私は、あるディストリビューションの bash のバージョンでは、スクリプト
  があまりうまく動作しないということに気づきました。

  それから、誰かが私のスクリプトを改善する (あるいは実行ファイルを作るの
  でも) 手助けをしてくれるなら、大変助かります。なぜ自分の bash スクリプ
  トが規則に従わず、信号を正しく解釈しないのかが分かっていません。あなた
  が何かしら改善したのであれば、どうか電子メールを
  matthew@shinythings.com <mailto:matthew@shinythings.com> 宛に送ってく
  ださい。

     [訳注 : 日本語版改訂履歴を以下に示します。

     v1.0j, 2000 年 8 月 18 日
        翻訳: 宮田 剛 <t-miya@rb3.so-net.ne.jp>

        菊谷 誠 <kikutani@galaxy.net>, 武井 伸光 <takei@kondara.org>, 中
        野 武雄 <nakano@apm.seikei.ac.jp>, 宮野 浩史
        <hmiyano@webjapan.com>, 山下 義之 <dica@eurus.dti.ne.jp> ]

