OpenVPN on FreeBSD


OpenVPNによる安全な遠隔地接続

2010年6月18日

目次

  1. はじめに
  2. 構成例
  3. 静的鍵と電子証明書
  4. ルーティングとブリッジング
  5. サーバーのインストール
  6. クライアントのインストール
  7. サーバーの設定
  8. クライアントの設定
  9. 注意事項
  10. おわりに

はじめに

  事務所の外から、事務所の中で業務に使っているパソコンにアクセスしたいと思うことがたまにあります。例えば、出張先のホテルで、翌日のプレゼンテーションに使うデータファイルが持参したノートパソコンに保存されていないことに気付いたときや、期日が目前に迫ったプロジェクトの責任者なのに「ぎっくり腰」になって自宅のベッドから這い出せないときなどです(どちらも懐かしい思い出です。)

  昔はこのようなニーズに対して、パソコンにモデムを接続し、一般電話網を通じて社内ネットワークにあるRAS(Remote Access Server)と呼ばれるノードに接続していました。

  今では、自宅にインターネット接続環境があることは珍しくなく、空港や主要な駅などでは無線LANアクセスポイントと呼ばれるインターネット接続環境が整備されています。また最近では、通信事業者から移動体データ通信サービスが提供されており、名刺程度の大きさのデータ通信装置をパソコンに接続するだけで、いつでも、どこでも、インターネットに接続することができます。(「どこでも」というのは少し言い過ぎかもしれませんが。)

  このように、インターネットに接続できる環境が充実してくると、電話回線を通じて遠隔地のコンピュータを接続するよりインターネットを通じてそれらを接続したいというニーズが高まってきました。

  ですが、これには問題があります。それはいかにして安全を確保するかということです。インターネットは世界中のたくさんの人が共同利用している公衆データ通信網と言えます。このような通信網を通じて機密情報が溢れている社内ネットワークに接続させる場合、正当な利用者だけに接続を許し、万一、通信データが第三者に盗聴されても情報が漏えいしないようにデータを暗号化する仕組みが必要です。

  VPN(Virtual Private Network)はこのような問題に対する解決策です。VPNは公衆通信網の中に作り出される概念上の専用通信網です。VPNは公衆網の中に作られますが特定の利用者だけに接続が許可され、その他の利用者はVPNを使うことはできません。例えば、A社の支店や倉庫など6つの事業所がそれぞれインターネットに接続されている場合、その6つの事業所だけを結ぶ仮想的な専用網(VPN)を作り出します。他のインターネットユーザーはA社のVPNにアクセスすることはできません。

  VPNの実装の一つにOpenVPNがあります。OpenVPNはフリーソフトウェアです。この記事では、OpenVPNを用いて会社の外から安全に社内ネットワークに接続する方法を紹介します。

  ただ、この記事ではOpenVPNのマニュアルで説明されている方法とは違った方法を紹介します。特に電子証明書の作成について大きく異なります。

  電子証明書はOpenVPNだけでなく、他のシステムの安全性を高めるためにも利用できます。例えば、社内の無線LANのアクセスポイントに接続できる正当な端末を識別したり、POPサーバーにログインするときにパスワードを暗号化したりすることにも利用できます。つまり、電子証明書の発行はOpenVPNとは離して運用管理するほうが望ましいと考えられます。

  そこで、この記事の中では電子証明書の発行について、その実装の一つであるOpenSSLのスクリプトやコマンドを紹介します。OpenVPNのパッケージにも電子証明書を発行するスクリプトが含まれていますが、その内容は実はOpenSSLのコマンドです。(OpenVPNのパッケージに含まれているスクリプトが悪いと言っているのではありません。誤解しないでくださいね。)

  この記事ではFreeBSD 8.0-RELEASEにopenvpn-2.0.6をインストールして、設定例などを示します。

  なお、この記事の中で使用しているグローバルIPアドレスは例として用いているだけであり、実際のアドレスおよびその所有者とは一切関係ありません。

ページのトップ

構成例

詳しい説明をする前に、説明をなるべく具体的にするために用いるシステムの構成例について述べます。

遠隔地のコンピュータを接続する場合、二つの形態が考えられます。

・LAN間接続
本社と営業所など、二つの事務所に施設されているLANをVPNを通じて相互接続する形態です。
この場合は、利用者が操作するパソコンにVPNソフトウェアをインストールする必要はありません。
・モバイル接続
自宅にあるパソコンや社外に持ち出したパソコンをVPNを通じて社内ネットワークに接続します。
この場合は、利用者が操作するパソコンにVPNソフトウェアをインストールする必要があります。

この記事では、モバイル接続を主に説明します。

以下に、構成例を示します。

            +-----+
            | PCm | (VPN Client)
            +--+--+
               | PPP: 1.0.0.1/32
               |
               |
         (           )
         ( Internet  )
         (           )
               |
               | 
               | WAN: Un-numbered
           +---+---+                     +-------+
           | Ex.RT |                     |  DNS  |
           +---+---+                     +---+---+
               | LAN: 2.0.0.14/29            | re0: 2.0.0.9/29 
               |      (Default Gateway)      |
               |                             |
    -----+-----+-----------------------+-----+-----
         |                             |
         |                             |
         | eth0: 2.0.0.13/29           | re0: 2.0.0.12/29
     +---+---+                     +---+---+ 
     | In.RT |(IP Masquerade)      |  VPN  |
     +---+---+                     +---+---+ 
         | eth1: 192.168.0.254/24      | rl0: 192.168.0.253/24
         |      (Default Gateway)      |
         |                             |
    -----+-----+-----------------------+-----+-----
               |                             |
               |                             |
               | eth0: 192.168.0.16/24       | eth0: 192.168.0.1/24
            +--+--+                      +---+---+
            | PCo |                      |  FTP  |
            +-----+                      +-------+

        【図2-1】システムの構成例
 【図 2-2】OpenVPN の構成図(画像をクリックして拡大表示)

PCmは、社外にあるパソコンです。例えば、自宅にある個人用のパソコンや出張先に持ち出した会社のパソコンなどです。利用者はインターネットサービスプロバイダー(以降ISPと略します)と契約しており、モバイルデータ通信カードをパソコンに装備しています。この例では、ISPに接続した結果、グローバルIPアドレス1.0.0.1/32が割り当てられたと仮定します。

この例における事業所は、2.0.0.8/29のグローバルIPアドレスを持っています。また、社内ネットワークには192.168.0.0/24のプライベートIPアドレスが割り当てられています。

Ex.RTは、ISPに接続する為の外部ルーターです。IPSとはアンナンバードで接続しているので、回線側のインターフェース(WAN)にIPアドレスはありません。一方、LAN側のインターフェース(LAN)にはIPアドレスが設定されています。Ex.RTは、2.0.0.8/29のサブネットに設置されているホストにとってのデフォルトゲートウェイです。

In.RTは、外部に公開するネットワーク(2.0.0.8/29)と外部に公開しないネットワーク(192.168.0.0/24)とを接続する内部ルーターです。In.RTは、IPマスカレードの機能を有し、社内ネットワークのパソコンから外部ネットワークにアクセスする際、外部に向かうパケットの発信元IPアドレスとTCP/UDPポートを適切に変換します。In.RTは、192.168.0.0/24のサブネットに設置されているホストにとってのデフォルトゲートウェイです。

VPNは、VPNサーバーです。VPNとIn.RTは一つのホストの上で実行することができるかもしれません。むしろ、その方がグローバルIPアドレスを一つ節約できます。ですが、In.RTがネットワーク専用のボックスでソフトウェアを追加出来ない場合や、単にIn.RTに変更を加えたくないときは、VPNサーバーをIn.RTとは別のホストにインストールしてください。

PCoは、社内ネットワークの中にあるパソコンです。

FTPは、社内でファイルを共有するためのファイルサーバーです。このホストでは、社内ネットワークからのみFTPの利用ができるようにTCP Wrapperが設定されていると仮定します。

ページのトップ

静的鍵と電子証明書

OpenVPNでは、接続相手を認証したり暗号鍵を生成したりするときに、静的鍵を用いる方法と電子証明書を用いる方法があります。

ページのトップ

3.1 静的鍵

静的鍵とはVPNサーバーとVPNクライアントが共通で使用する1つの秘密鍵のことです。具体的にはシステム管理者が事前に文字列を決め、それを書き込んだテキストファイルをサーバーとクライアントに保存します。

静的鍵を用いる場合の長所はVPNを容易に構築できることです。この方法では電子証明書を使いませんので、認証局の設置や運用に掛る手間が省けます。

その反面、拡張性が低いという短所があります。この方法では1台のVPNサーバー(プロセス)に対して1台のVPNクライアントしか接続できません。

もし、VPNクライアントが1台しかなく、とにかくOpenVPNを使ってみたいというのであれば、静的鍵を利用したVPNを構築すると良いでしょう。

とはいえ、この記事では静的鍵を用いた具体的な構築方法については割愛しています。(この記事がお役に立てなくて残念です。)

ページのトップ

3.2 電子証明書

電子証明書を利用する場合は、基本的に、個々のホストがそれぞれ固有の証明書を保持します。例えば、VPNクライアントが3台あったとすると、VPNサーバーおよび認証局(CA)の証明書を合わせて、合計5つの証明書が必要になります。もし、個々のパソコンにそれぞれ証明書を発行するのは管理が煩わしいというのであれば、複数のVPNクライアントで一つの証明書を共通して利用することもできます。

電子証明書を用いる場合の利点は複数のVPNクライアントを同時にVPNサーバーに接続できることです。

その反面、電子証明書を発行する認証局を必要としますので、設定と運用に少し手間が掛ります。

公に利用できる(パブリック)電子証明書を運用しようとすると、サービスプロバイダー、例えばベリサイン社などのサービスを利用しなければならず費用がかかります。費用は、導入時の初期費用の他にも証明書を更新する際にも発生します。ですが、私的利用に限った(プライベート)電子証明書であれば費用はかかりません。それに、世間で云われているほど難しいものではありません。

ページのトップ

ルーティングとブリッジング

社外にあるパソコンをVPNを通じて社内ネットワークに接続するとき、そのパソコンに割り当てるIPアドレスを考えなければなりません。構成図に示したPCmは既にISPからグローバルIPアドレス1.0.0.1/32が割り当てられていますが、実はもう一つ、トンネルの終端のIPアドレスについても検討する必要があります。

VPNは、インターネットの中にあたかも二地点間だけを結ぶ仮想的な専用通信回線を作ります。これをトンネルと呼びます。以下に概念図を示します。

    +--------------+          ##############          +--------------+
    |  VPN Client  |         #   Internet   #         |  VPN Server  | 
    |              |        #                #        |              |
    |    tun/tap  +----------                ----------+  tun/tap   +--------------------
    |          ===|====================================|===         |   
    |             +----------     Tunnel     ----------+            +--------------------
    |          PPP |        #                #        | re0      rl0 |   Private Network
    |              |         #              #         |              |
    +--------------+          ##############          +--------------+

                        【図4-1】トンネルの概念

TUN/TAPはトンネルインターフェースのデバイス名です。

VPNサーバーの社内ネットワーク側のインターフェースrl0のIPアドレスは192.168.0.253/24です。設計者はトンネルインターフェースに割り当てるIPアドレスを社内ネットワークと同じ192.168.0.0/24に含めるか、それとも、10.8.0.0/24など異なるサブネットに含めるかを決めなければなりません。

ページのトップ

4.1 ルーティング

トンネルインターフェースに割り当てるIPアドレスを社内ネットワークと違うサブネットワークに含める場合、VPNクライアントはVPNサーバー内のルーター機能によって社内ネットワークと接続されます。

    +--------------+          ##############          +--------------+
    |  VPN Client  |         #   Internet   #         |  VPN Server  | 
    |              |        #                #        |              |
    |    tun/tap  +----------                ----------+  tun       +--------------------
    |          ===|====================================|===+{ROUTER}+   
    |             +---------- (10.8.0.0/24)  ----------+            +--------------------
    |          PPP |        #                #        | re0      rl0 |   (192.168.0.0/24)
    |              |         #              #         |              |
    +--------------+          ##############          +--------------+

                        【図4-2】ルーティングの概念

ルーティング接続するときは、TUNデバイスを使用します。

以下にインターフェースの状態とルーティングテーブルがどのように変化するか具体例を示します。

  1. VPNサーバーのインターフェース
  2. 先ず、VPNサーバーのインターフェースについて、VPNサーバー(プロセス)を実行する前と実行中の状態を比べます。

        # ifconfig
        rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:01:80:40:f8:be
                inet 192.168.0.253 netmask 0xffffff00 broadcast 192.168.0.255
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
        re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:0a:79:69:f2:95
                inet 2.0.0.12 netmask 0xfffffff8 broadcast 2.0.0.15
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
    
            【図4-3】実行前のVPNサーバーのインターフェース(ルーティングの場合)
    
        #ifconfig
        rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:01:80:40:f8:be
                inet 192.168.0.253 netmask 0xffffff00 broadcast 192.168.0.255
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
        re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:0a:79:69:f2:95
                inet 2.0.0.12 netmask 0xfffffff8 broadcast 2.0.0.15
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
        tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
                inet 10.8.0.1 --> 10.8.0.2 netmask 0xffffffff
                Opened by PID 1471
    
            【図4-4】実行中のVPNサーバーのインターフェース(ルーティングの場合)
    
    

    実行中のVPNサーバーにはインターフェースtun0が生成されています。tunは仮想的なPoint-to-pointネットワークデバイスです。この場合10.8.0.1が自分(VPNサーバー)側のアドレスで、10.8.0.2が相手(VPNクライアント)側のアドレスです。

  3. VPNサーバーのルーティングテーブル
  4. 次は、VPNサーバーのルーティングテーブルについて、VPNサーバー(プロセス)を実行する前と実行中の状態を比べます。

        # netstat -r
        Routing tables
    
        Internet:
        Destination        Gateway            Flags    Refs      Use  Netif Expire
        default            2.0.0.14           UGS         0        0    re0
        localhost          link#5             UH          0        0    lo0
        192.168.0.0        link#1             U           0       29    rl0
        192.168.0.253      link#1             UHS         0        0    lo0
        2.0.0.8/29         link#2             U           1       10    re0
        2.0.0.12           link#2             UHS         0        0    lo0
    
            【図4-5】実行前のVPNサーバーのルーティングテーブル(ルーティングの場合)
    
        #netstat -r
        Routing tables
    
        Internet:
        Destination        Gateway            Flags    Refs      Use  Netif Expire
        default            2.0.0.14           UGS         1      103    re0
        10.8.0.0           10.8.0.2           UGS         0        0   tun0
        10.8.0.1           link#7             UHS         0        0    lo0
        10.8.0.2           link#7             UH          0        0   tun0
        localhost          link#5             UH          0        0    lo0
        192.168.0.0        link#1             U           0       59    rl0
        192.168.0.253      link#1             UHS         0        0    lo0
        2.0.0.8/29         link#2             U           1       22    re0
        2.0.0.12           link#2             UHS         0        0    lo0
    
            【図4-6】実行中のVPNサーバーのルーティングテーブル(ルーティングの場合)
    

    実行中のVPNサーバーのルーティングテーブルには、1つのネットワークのエントリーと2つのホストのエントリー、合計3つのエントリーがOpenVPNによって追加されています。10.8.0.0はネットワークのエントリーで、そのサブネットに到達するためのネクストホップは10.8.0.2、出力インターフェースはtun0です。

    このエントリーは少し混乱するかもしれませんので注意してください。VPNサーバーは自ホスト内に10.8.0.1のインターフェースを持っています。ですから、ネットワーク10.8.0.0には直接つながっていることになるのですが、ネットワーク10.8.0.0宛のパケットをゲートウェイ(相手側のトンネルインターフェース10.8.0.2)に送っています。

  5. VPNクライアントのインターフェース
  6. 次は、VPNクライアントのインターフェースの状態について接続前と接続後を比べます。

        C:\>ipconfig
    
        PPP アダプタ isp.domain:
           
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : isp.domain
           物理アドレス. . . . . . . . . . . :
           DHCP 有効 . . . . . . . . . . . . : いいえ
           IPv4 アドレス . . . . . . . . . . : 1.0.0.1(優先)
           サブネット マスク . . . . . . . . : 255.255.255.255
           デフォルト ゲートウェイ . . . . . : 0.0.0.0
           NetBIOS over TCP/IP . . . . . . . : 無効
    
        イーサネット アダプタ ローカル エリア接続 2:
    
           メディアの状態. . . . . . . . . . : メディアは接続されていません
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : TAP-Win32 Adapter V9
           物理アドレス. . . . . . . . . . . : 00-FF-8A-DF-A7-A6
           DHCP 有効 . . . . . . . . . . . . : はい
           
            【図4-7】接続前のVPNクライアントのインターフェース(ルーティングの場合)
    
        C:\>ipconfig
    
        PPP アダプタ isp.domain:
        
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : isp.domain
           物理アドレス. . . . . . . . . . . :
           DHCP 有効 . . . . . . . . . . . . : いいえ
           IPv4 アドレス . . . . . . . . . . : 1.0.0.1(優先)
           サブネット マスク . . . . . . . . : 255.255.255.255
           デフォルト ゲートウェイ . . . . . : 0.0.0.0
           NetBIOS over TCP/IP . . . . . . . : 無効
    
        イーサネット アダプタ ローカル エリア接続 2:
    
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : TAP-Win32 Adapter V9
           物理アドレス. . . . . . . . . . . : 00-FF-8A-DF-A7-A6
           DHCP 有効 . . . . . . . . . . . . : はい
           IPv4 アドレス . . . . . . . . . . : 10.8.0.6(優先)
           サブネット マスク . . . . . . . . : 255.255.255.252
           リース取得. . . . . . . . . . . . : 2010年6月4日 14:36:47
           リースの有効期限. . . . . . . . . : 2011年6月4日 14:36:47
           デフォルト ゲートウェイ . . . . . :
           DHCP サーバー . . . . . . . . . . : 10.8.0.5
           NetBIOS over TCP/IP . . . . . . . : 有効
    
            【図4-8】接続後のVPNクライアントのインターフェース(ルーティングの場合)
    
    

    VPNサーバーに接続した結果、VPNクライアントのトンネルインターフェースには、IPアドレス10.8.0.6が割り当てられました。

  7. VPNクライアントのルーティングテーブル
  8. 最後に、VPNクライアントのルーティングテーブルについて接続前と接続後を比べます。

        C:\>netstat -r
    
        IPv4 ルート テーブル
        ===========================================================================
        アクティブ ルート:
        ネットワーク宛先       ネットマスク    ゲートウェイ  インターフェイス  メトリック
                  0.0.0.0          0.0.0.0        リンク上           1.0.0.1     31
                  1.0.0.1  255.255.255.255        リンク上           1.0.0.1    286
                127.0.0.0        255.0.0.0        リンク上         127.0.0.1   4531
                127.0.0.1  255.255.255.255        リンク上         127.0.0.1   4531
          127.255.255.255  255.255.255.255        リンク上         127.0.0.1   4531
                (省略)
        ===========================================================================
        固定ルート:
          なし
          
            【図4-9】接続前のVPNクライアントのルーティングテーブル(ルーティングの場合)
    
        C:\>netstat -r
    
        IPv4 ルート テーブル
        ===========================================================================
        アクティブ ルート:
        ネットワーク宛先       ネットマスク    ゲートウェイ   インターフェイス  メトリック
                  0.0.0.0          0.0.0.0        リンク上           1.0.0.1     31
                 10.8.0.1  255.255.255.255         10.8.0.5         10.8.0.6   4256
                 10.8.0.4  255.255.255.252        リンク上          10.8.0.6   4511
                 10.8.0.6  255.255.255.255        リンク上          10.8.0.6   4511
                 10.8.0.7  255.255.255.255        リンク上          10.8.0.6   4511
                  1.0.0.1  255.255.255.255        リンク上           1.0.0.1    286
                127.0.0.0        255.0.0.0        リンク上         127.0.0.1   4531
                127.0.0.1  255.255.255.255        リンク上         127.0.0.1   4531
          127.255.255.255  255.255.255.255        リンク上         127.0.0.1   4531
              192.168.0.0    255.255.255.0         10.8.0.5         10.8.0.6   4256
                (省略)
        ===========================================================================
        固定ルート:
          なし
    
            【図4-10】接続後のVPNクライアントのルーティングテーブル(ルーティングの場合)
    
    

OpenVPNのクライアントはVPNサーバーとは違うアドレスを持った仮想的なPoint-to-pointネットワークを作っています。

そのIPネットワークアドレスは10.8.0.4/30、自分(VPNクライアント)側のアドレスは10.8.0.6、相手側(VPNサーバー)側にアドレスは10.8.0.5、10.8.0.7はブロードキャストアドレスです。

注目する点は、192.168.0.0/24のネットワークのエントリーが追加されていることです。このエントリーがあるおかげで、VPNクライアントは社内ネットワーク内の資源にアクセスすることができます。

ページのトップ

4.2 ブリッジング

トンネルのインターフェースに割り当てるIPアドレスを社内ネットワークと同じサブネットワークに含める場合、VPNクライアントはVPNサーバー内のブリッジ機能によって社内ネットワークと接続されます。

    +--------------+          ##############          +--------------+
    |  VPN Client  |         #   Internet   #         |  VPN Server  | 
    |              |        #                #        |              |
    |    tun/tap  +----------                ----------+  tap       +--------------------
    |          ===|====================================|===+{BRIDGE}+   
    |             +--------- (192.168.0.0/24) ---------+            +--------------------
    |          PPP |        #                #        | re0      rl0 |   (192.168.0.0/24)
    |              |         #              #         |              |
    +--------------+          ##############          +--------------+

                        【図4-11】ブリッジングの概念

ブリッジング接続するときは、TAPデバイスを使用します。

このとき、VPNサーバーの社内ネットワーク側のインターフェースrl0にはIPドレスは割り当てられません。ネットワーク管理者は、先ず、VPNサーバー内にブリッジインターフェース、例えばbridge0を作成します。次いでrl0とトンネルインターフェースtap0をブリッジインターフェースにメンバーとして加えます。

一連の流れは次のようになります。

以下にインターフェースの状態とルーティングテーブルがどのように変化するか具体例を示します。

  1. VPNサーバーのインターフェース
  2. 先ず、VPNサーバーのインターフェースについて、VPNサーバー(プロセス)を実行する前と実行中の状態を比べます。

        # ifconfig
        rl0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:01:80:40:f8:be
                media: Ethernet autoselect
                status: active
        re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:0a:79:69:f2:95
                inet 2.0.0.12 netmask 0xfffffff8 broadcast 2.0.0.15
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
    
            【図4-12】実行前のVPNサーバーのインターフェース(ブリッジングの場合)
    
        # ifconfig
        rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:01:80:40:f8:be
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
        re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:0a:79:69:f2:95
                inet 2.0.0.12 netmask 0xfffffff8 broadcast 2.0.0.15
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
        bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 72:4a:14:91:ab:1b
                inet 192.168.0.253 netmask 0xffffff00 broadcast 192.168.0.255
                id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
                maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
                root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
                member: rl0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
    
                        ifmaxaddr 0 port 1 priority 128 path cost 55
                member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                        ifmaxaddr 0 port 8 priority 128 path cost 2000000
        tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
                ether 00:bd:7d:d0:0b:00
                Opened by PID 1339
    
            【図4-13】実行中のVPNサーバーのインターフェース(ブリッジングの場合)
    

    実行中のVPNサーバーにはブリッジインターフェースbridge0とトンネルインターフェースtap0が生成されています。bridge0はそのメンバーとしてrl0とtap0を含んでいます。

    注目する点は、bridge0にIPアドレスが割り当てられており、rl0にはIPアドレスが割り当てられていないこと。また、rl0にPROMISCフラグがセットされていることです。

  3. VPNサーバーのルーティングテーブル
  4. 次は、VPNサーバーのルーティングテーブルについて、VPNサーバー(プロセス)を実行する前と実行中の状態を比べます。

        # netstat -r
        Routing tables
    
        Internet:
        Destination        Gateway            Flags    Refs      Use  Netif Expire
        default            219.96.231.102     UGS         0        0    re0
        localhost          link#5             UH          0        0    lo0
        2.0.0.8/29         link#2             U           1        6    re0
        2.0.0.12           link#2             UHS         0        0    lo0
    
         【図4-14】実行前のVPNサーバーのルーティングテーブル(ブリッジングの場合)
    
        # netstat -r
        Routing tables
    
        Internet:
        Destination        Gateway            Flags    Refs      Use  Netif Expire
        default            219.96.231.102     UGS         1      113    re0
        localhost          link#5             UH          0        0    lo0
        192.168.0.0        link#7             U           0        0 bridge
        192.168.0.253      link#7             UHS         0        0    lo0
        2.0.0.8/29         link#2             U           1       12    re0
        2.0.0.12           link#2             UHS         0        0    lo0
    
         【図4-15】実行中のVPNサーバーのルーティングテーブル(ブリッジングの場合)
    

    VPNサーバーを実行すると、bridgeに割り当てたIPホストアドレスとIPネットワークアドレスのエントリーが追加されます。

  5. VPNクライアントのインターフェース
  6. 次は、VPNクライアントのインターフェースの状態について接続前と接続後を比べます。

        C:\>ipconfig
    
        PPP アダプタ isp.domain:
    
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : isp.domain
           物理アドレス. . . . . . . . . . . :
           DHCP 有効 . . . . . . . . . . . . : いいえ
           IPv4 アドレス . . . . . . . . . . : 1.0.0.1(優先)
           サブネット マスク . . . . . . . . : 255.255.255.255
           デフォルト ゲートウェイ . . . . . : 0.0.0.0
           NetBIOS over TCP/IP . . . . . . . : 無効
    
        イーサネット アダプタ ローカル エリア接続 2:
    
           メディアの状態. . . . . . . . . . : メディアは接続されていません
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : TAP-Win32 Adapter V9
           物理アドレス. . . . . . . . . . . : 00-FF-8A-DF-A7-A6
           DHCP 有効 . . . . . . . . . . . . : はい
    
         【図4-16】接続前のVPNクライアントのインターフェース(ブリッジングの場合)
    
        C:\>ipconfig
    
        PPP アダプタ isp.domain:
    
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : isp.domain
           物理アドレス. . . . . . . . . . . :
           DHCP 有効 . . . . . . . . . . . . : いいえ
           IPv4 アドレス . . . . . . . . . . : 1.0.0.1(優先)
           サブネット マスク . . . . . . . . : 255.255.255.255
           デフォルト ゲートウェイ . . . . . : 0.0.0.0
           NetBIOS over TCP/IP . . . . . . . : 無効
    
        イーサネット アダプタ ローカル エリア接続 2:
    
           接続固有の DNS サフィックス . . . :
           説明. . . . . . . . . . . . . . . : TAP-Win32 Adapter V9
           物理アドレス. . . . . . . . . . . : 00-FF-8A-DF-A7-A6
           DHCP 有効 . . . . . . . . . . . . : はい

    IPv4 アドレス . . . . . . . . . . : 192.168.0.240(優先) サブネット マスク . . . . . . . . : 255.255.255.0 リース取得. . . . . . . . . . . . : 2010年6月4日 16:18:35 リースの有効期限. . . . . . . . . : 2011年6月4日 16:18:35 デフォルト ゲートウェイ . . . . . : NetBIOS over TCP/IP . . . . . . . : 有効  【図4-17】接続後のVPNクライアントのインターフェース(ブリッジングの場合)

    VPNサーバーに接続した結果、VPNクライアントのトンネルインターフェースには、192.168.0.240/24が割り当てられました。このIPアドレスのネットワークプレフィックスは、社内ネットワークのそれと同じです。

  7. VPNクライアントのルーティングテーブル
  8. 最後に、VPNクライアントのルーティングテーブルについて接続前と接続後を比べます。

        C:\>netstat -r
    
        IPv4 ルート テーブル
        ===========================================================================
        アクティブ ルート:
        ネットワーク宛先       ネットマスク    ゲートウェイ  インターフェイス  メトリック
                  0.0.0.0          0.0.0.0        リンク上           1.0.0.1     31
                  1.0.0.1  255.255.255.255        リンク上           1.0.0.1    286
                127.0.0.0        255.0.0.0        リンク上         127.0.0.1   4531
                127.0.0.1  255.255.255.255        リンク上         127.0.0.1   4531
          127.255.255.255  255.255.255.255        リンク上         127.0.0.1   4531
                (省略)
        ===========================================================================
        固定ルート:
          なし
    
         【図4-18】接続前のVPNクライアントのルーティングテーブル(ブリッジングの場合)
    
        C:\>netstat -r
    
        IPv4 ルート テーブル
        ===========================================================================
        アクティブ ルート:
        ネットワーク宛先       ネットマスク    ゲートウェイ  インターフェイス  メトリック
                  0.0.0.0          0.0.0.0        リンク上           1.0.0.1     31
                  1.0.0.1  255.255.255.255        リンク上           1.0.0.1    286
                127.0.0.0        255.0.0.0        リンク上         127.0.0.1   4531
                127.0.0.1  255.255.255.255        リンク上         127.0.0.1   4531
          127.255.255.255  255.255.255.255        リンク上         127.0.0.1   4531
              192.168.0.0    255.255.255.0        リンク上     192.168.0.240   4511
            192.168.0.240  255.255.255.255        リンク上     192.168.0.240   4511
            192.168.0.255  255.255.255.255        リンク上     192.168.0.240   4511
                (省略)
        ===========================================================================
        固定ルート:
          なし
    
         【図4-19】接続後のVPNクライアントのルーティングテーブル(ブリッジングの場合)
    

VPNクライアントには192.168.0.240が割り当てられましたので、192.168.0.0/24の社内ネットワークに直接つながっていることを示すエントリーがあります。

ページのトップ

サーバーのインストール

VPNサーバーを設置するためには、まず、必要なファイルをホストにコピーするインストール作業を行い、その後どのように動作するかを指示する設定作業を行います。

VPNサーバーにインストールするファイルは2種類あります。一つはソフトウェアのコード群、そしてもう一つは電子証明書等です。

ページのトップ

5.1 サーバーのソフトウェア

OpenVPNのソフトウェアをインストールすること自体は難しい作業ではありません。

この記事では、FreeBSD 8.0-RELEASEにopenvpn-2.0.6をインストールしています。FreeBSDにopenvpnのパッケージを追加する場合は、次のコマンドを実行します。

    # pkg_add -r openvpn

また、PORTコレクションを使って、make installする方法もあります。この場合はPORTコレクションの情報を更新してからmakeコマンドを実行して下さい。

Linuxにインストールする場合は、dpkgやaptitudeあるいはrpmやyumなど各ディストリビューションに合ったコマンドでインストールしてください。

もちろん、OpenVPNのウェブサイトからソースコードをダウンロードして、コンパイルおよびインストールすることもできます。

ページのトップ

5.2 サーバーの電子証明書

  1. 認証局(CA)の証明書と秘密鍵
  2. OpenVPNをインストールすると、ディレクトリー/usr/local/share/doc/openvpn/easy-rsa/2.0/に電子証明書を作成するためのスクリプトが展開されます。

    OpenVPNのHOWTOには、認証局(Certificate Authority: CA)の証明書と秘密鍵を生成するために、スクリプトbuild-caを実行するように説明されています。

        ./build-ca
    

    ですが、必ずしもこのスクリプトを使う必要はありません。例えば、IEEE802.1x EAP-TLSによる無線LAN端末の認証を行う為に既に私的な認証局を設置している場合は、その認証局を利用する方が望ましいでしょう。

    スクリプトbuild-caは、スクリプトpkitoolを実行します。

        pkitool --interact --initca
    

    pkitoolは、同じディレクトリの中にあるスクリプトです。pkitoolの中でCAの証明書と秘密鍵を生成する部分は次のとおりです。

        $OPENSSL req $BATCH -days $CA_EXPIRE $NODES_REQ -new -x509 \
                -keyout "$CA.key" -out "$CA.crt" -config "$KEY_CONFIG"
    
    

    $OPENSSLはスクリプトの中でopensslと定義されています。上のコマンドを書き直すとおおよそ次のようになります。

        openssl req -days 3650 -nodes -new -x509 \
                -keyout ca.key -out ca.crt -config openssl.cnf
    

    なお、OpenSSLのウェブサイトにある"HOWTO certificates <DRAFT!>"を見ると、上のようなコマンドでCAの証明書を作成することを推奨していません。CAの証明書を作成するときは、OpenSSLのパッケージに含まれるスクリプトCA.plなどを使ったほうが良いでしょう。

        ./CA.pl -newca
    

    このコマンドを実行し質問に答えていけば、2つのファイルが出来上がります。

        cacert.pem    cakey.pem
    

    cacert.pemはCAの証明書、cakey.pemはCAの秘密鍵です。

  3. VPNサーバーの証明書と秘密鍵
  4. CAの証明書が出来たら、VPNサーバーの証明書と秘密鍵を作成します。OpenVPNのHOWTOには、VPNサーバーやVPNクライアントの証明書と秘密鍵を生成するために、スクリプトbuild-reqとsign-reqを実行するように説明されています。

        ./build-key-server server
    

    スクリプトbuild-key-serverはスクリプトpkitoolを実行します。

        pkitool --interact --server
    

    スクリプトpkitoolの中でサーバーの証明書と秘密鍵を生成する部分は次のとおりです。

        $OPENSSL req $BATCH -days $KEY_EXPIRE $NODES_REQ -new \
                -keyout "$KEY_CN.key" -out "$KEY_CN.csr" $REQ_EXT -config "$KEY_CONFIG"
    
        $OPENSSL ca $BATCH -days $KEY_EXPIRE -out "$KEY_CN.crt" \
                -in "$KEY_CN.csr" $CA_EXT -config "$KEY_CONFIG"
    

    大まかに述べると、"openssl req"コマンドで証明書のリクエストを作成し、"openssl ca"コマンドで認証局の秘密鍵を使ってサインしています。

    OpenSSLのパッケージに含まれているCA.plを使用する場合は、次のように実行します。

        ./CA.pl -newreq-nodes
        ./CA.pl -sign
    

    直接opensslを実行するなら、次のようにします。

        openssl req -new -nodes -keyout newkey.pem -out newreq.pem -days 3650 \
                -config openssl.cnf
        openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem \
                -config openssl.cnf
    

    このコマンドを実行し質問に答えていけば、次の3つのファイルが出来上がります。

        newcert.pem    newkey.pem    newreq.pem
    

    このうち、2つのファイルの名前を変更し、1つのファイルを捨てます。

        mv ./newcert.pem ./vpncert.pem
        mv ./newkey.pem ./vpnkey.pem
        rm ./newreq.pem
    

    vpncert.pemはVPNサーバーの証明書、vpnkey.pemはVPNサーバーの秘密鍵です。

    ./build-key-serverを使うと証明書の有効期間が3650日(約10年)になります。一方、CA.plでは365日になります。CA.plを使うときはスクリプトの中の有効期間の値を変更してください。次の例は一般の証明書の有効期間を1095日(約3年)、認証局の証明書の有効期間を3650日に設定しています。

        $DAYS="-days 1095";     # 3 year
        $CADAYS="-days 3650";   # 10 years
    

    CAとVPNの証明書ができたら、VPNサーバー証明書とVPNサーバー秘密鍵をVPNサーバー(ホスト)の任意のディレクトリに移動し、CA証明書をVPNサーバーにコピーします。ディレクトリはどこでもかまいません。例えば、/etc/openvpn/や/etc/ssl/などです。この記事では定石を避け、あえて/etc/ssl/にコピーします。(OpenVPNのHOWTOでは、ソフトウェアパッケージをインストールしたあと、電子証明書などを作成する前に、ディレクトリ/usr/local/share/doc/openvpn/easy-rsa/を/etc/openvpnなどにコピーすることをすすめています。デフォルトのまま使用し、ディレクトリeasy-rsa/の中に証明書のデータベースを作成すると、パッケージをアップグレードしたときにそれらが破壊されるかもしれないからです。)

    ただし、ディレクトリがどこであれ、VPNサーバーの秘密鍵は所有者だけが読みだせるようにアクセス権を変更することを忘れないでください。

    それからもう一つ、Diffie Hellman(DH)パラメータを作成して、これもVPNサーバーの任意のディレクトリに格納して下さい。証明書を格納したディレクトリで良いでしょう。

    ・DHパラメータ: dh1024.pem

    DHパラメータはOpenVPNのパッケージに含まれているスクリプトbuild-dhで作成することができます。

    opensslコマンドを使う場合は次のようにします。

        openssl dhparam -out dh1024.pem 1024
    

ページのトップ

クライアントのインストール

VPNクライアントもVPNサーバーと同じように、ソフトウェアと電子証明書をインストールします。

ページのトップ

6.1 クライアントのソフトウェア

自宅にあるパソコンや社外に持ち出すパソコンは、多くの場合、マイクロソフト社のWindows OSを搭載していると思います。このような場合は、Mathias Sundmanが開発したOpenVPN GUI for Windowsを使うと操作が簡単です。

インストール用パッケージはOpenVPN GUI for WIndowsのウェブサイトからダウンロードできます。

また、OpenVPN 2.1.1からはWindows用インストーラーの中にOpenVPN GUIが含まれています。

インストールは、ダウンロードした.exeファイルを実行し、画面の指示に従うだけです。途中、TAP-Win32というデバイスをインストールするときに、管理者の許可が求められるかもしれません。

ページのトップ

6.2 クライアントの電子証明書

OpenVPNのクライアントに電子証明書をインストールするには、通常、VPNクライアントの証明書と秘密鍵それにCAの証明書をそれぞれ別のファイルとして任意のディレクトリにコピーします。

OpenVPNのHOWTOには、クライアントの証明書と秘密鍵を生成するために、ディレクトリ/usr/local/share/doc/openvpn/easy-rsa/2.0/の中にあるスクリプトbuild-keyまたはbuild-key-passを実行するように説明されています。

    ./build-key client1

スクリプトbuild-keyは、スクリプトpkitoolを実行します。

    pkitool --interact

OpenSSLのパッケージに含まれているCA.plを使用する場合は、次のように実行します。

    ./CA.pl -newreq-nodes
    ./CA.pl -sign
    mv ./newcert.pem ./pc01cert.pem
    mv ./newkey.pem ./pc01key.pem
    rm ./newreq.pem

pc01cert.pemはVPNクライアントの証明書、pc01key.pemはVPNクライアントの秘密鍵です。

CAの証明書、VPNクライアントの証明書、VPNクライアントの秘密鍵をクライアントのホストに格納するとき、3つのファイルを1つのPKCS#12形式のファイルにまとめて格納することもできます。

    ./CA.pl -newreq-nodes
    ./CA.pl -sign
    ./CA.pl -pkcs12
    mv ./newcert.pem ./pc01cert.pem
    mv ./newkey.pem ./pc01key.pem
    mv ./newcert.p12 ./pc01cert.p12
    rm ./newreq.pem

拡張子.p12を持ったファイルがPKCS#12形式のファイルです。

OpenVPNのパッケージに含まれているスクリプトを使うときは次のようにします。

    ./build-key-pkcs12 client1

この結果、次の4つのファイルができます。

    client1.csr    client1.key    client1.crt    client1.p12

client1.csrはVPNクライアントの証明書要求、client1.keyはVPNクライアントの秘密鍵、client1.crtはVPNクライアントの証明書、そしてclient1.p12がPKCS#12形式のファイルです。

作成した証明書などをOpenVPNのためだけに使うのであれば、3つのファイルをわざわざ1つにまとめる必要はありません。ですが、証明書を他の用途、例えば無線LAN認証などにも利用したいのであれば、PKCS#12形式のファイルを使うことをお勧めします。なぜなら、3つのファイルがばらばらだと、Windows OSで証明書や秘密鍵を管理するユーティリティ、certmgr.mscにインポート出来ないからです。

ページのトップ

サーバーの設定

サーバーでの設定は、OSの設定とOpenVPNの設定の2つに大別できます。OSの設定とは、OSがパケットを転送できるようにルーターまたはブリッジの設定をします。OpenVPNの設定とは、OpenVPNの設定ファイルを編集します。IPルーティングの場合とEthernetブリッジングの場合で編集する項目が異なります。

ページのトップ

7.1 ルーターサーバーの設定

ルーターサーバーとして設定する場合は、次に示す4つの設定を行います。

具体的にはOSの設定ファイルを編集します。FreeBSDの場合は/etc/rc.confに次のようなもコマンドを記述します。

    ifconfig_re0="inet 2.0.0.12 netmask 255.255.255.248"
    ifconfig_rl0="inet 192.168.0.253 netmask 255.255.255.0"
    defaultrouter="2.0.0.14"

    gateway_enable="YES"

      【図7-1】ルーティングの場合の/etc/rc.conf

ページのトップ

7.2 ブリッジサーバーの設定

ブリッジサーバーとして設定する場合は、内部側インターフェースにIPアドレスを割り当てません。内部側インターフェースはホストに生成されるブリッジインターフェースにメンバーとして追加します。/etc/rc.confに当該コマンドがあればコメントにしてください。

フォワーディング機能を有効にするコマンドがあれば、それもコメントにします。

    ifconfig_re0="inet 2.0.0.12 netmask 255.255.255.248"
    # ifconfig_rl0="inet 192.168.0.253 netmask 255.255.255.0"
    defaultrouter="2.0.0.14"

    # gateway_enable="YES"

        【図7-2】ブリッジングの場合の/etc/rc.conf

OSの設定ファイルの編集が終わったら、ブリッジを生成してメンバーを追加するためのスクリプトを作ります。ディレクトリ/usr/local/share/doc/openvpn/sample-script/に雛型のbridg-startがありますので、それを適当なディレクトリにコピーします。多くの場合、ディレクトリ/etc/openvpn/、あるいは/usr/local/etc/openvpn/を作成して、その中にコピーします。

FreeBSDの場合は、次のように編集します。


    br="bridge0"
    br_ip="192.168.0.253"
    br_netmask="255.255.255.0"
    br_broadcast="192.168.0.255"
    tap="tap0"

    eth="rl0"
    #
    ifconfig bridge create
    ifconfig tap create
    ifconfig $br addm $tap addm $eth up
    ifconfig $tap up
    ifconfig $eth up
    ifconfig $br $br_ip netmask $br_netmask broadcast $br_broadcast

        【図7-3】bridge-start

bridge-startと対をなすもう一つのスクリプトbridge-stopは、VPNサーバー(プロセス)を停止した後、ブリッジインターフェースとトンネルインターフェースを削除します。bridg-stopもディレクトリ/usr/local/share/doc/openvpn/sample-script/にありますので、bridge-startを格納したディレクトリーにコピーして編集します。

FreeBSDの場合は、次のように編集します。

    br="bridge0"

    tap="tap0"
    #
    ifconfig $br down
    ifconfig $tap destroy
    ifconfig $br destroy

        【図7-4】bridge-stop

OpenVPNをブリッジングで実行するときは、まずスクリプトbridge-startを実行し、その後openvpnを実行します。また、openvpnを停止した後は、スクリプトbridge-stopを実行します。

  cd /usr/local/etc/openvpn
    sh ./bridge-start
    /usr/local/sbin/openvpn ./openvpn.conf
    ^C
    sh ./bridge-stop

ページのトップ

7.3 起動用スクリプトの準備

OpenVPNをインストールすると、ディレクトリ/usr/local/share/doc/openvpn/sample-script/にLinux用の起動スクリプトopenvpn.initが格納されます。このスクリプトのインストール方法はスクリプトファイル自信の中に書かれています。

FreeBSDの場合、ディレクトリ/usr/local/etc/rc.dの中に起動スクリプトopenvpnが格納されます。

ブリッジルーターの場合、openvpnが実行される前にスクリプトbridge-startが実行されるように、そしてopenvpnが停止されたあとにスクリプトbridge-stopが実行されるように、起動スクリプトを編集します。FreeBSDの場合、openvpn_precmd()とstop_postcmd()にコマンドを追加します。

    openvpn_precmd()
    {
      if [ -f /usr/local/etc/openvpn/bridge-start ]; then
                    . /usr/local/etc/openvpn/bridge-start
            ]
     (省略)
    }

    stop_postcmd()
    {
      if [ -f /usr/local/etc/openvpn/bridge-stop ]; then
                    . /usr/local/etc/openvpn/bridge-stop
            }
     (省略)
    }

        【図7-5】ブリッジルーターの為の起動用スクリプト

FreeBSDの場合、/etc/rc.confにopenvpn_enableの設定を追加すると、ホストが立ち上がる際に起動用スクリプトによって/usr/local/sbin/openvpnが実行されます。このとき合わせてopenvpn_ifも設定して下さい。詳しくはスクリプトファイル自信の中に書かれています。

    openvpn_enable="YES"
    openvpn_if="tap"

        【図7-6】ブート時に自動実行させる為の/etc/rc.conf

ページのトップ

7.4 server.confの設定

ディレクトリ/usr/local/share/doc/openvpn/sample-config-files/に設定ファイルの雛型server.confがあります。これを適当なディレクトリにコピーします。多くの場合、ディレクトリ/etc/openvpn/、または/usr/local/etc/openvpn/を作成して、その中に設定ファイルをコピーします。起動スクリプトをデフォルトのまま使用するなら、Linuxの場合は/etc/openvpnを、FreeBSDの場合は/usr/local/etc/openvpnを作成するといいでしょう。

server.confをコピーするときファイル名を変えても構いません。例えば、openvpn.confなどです。

    cd /usr/local/share/doc/openvpn/sample-config-files/
    cp ./server.conf /usr/local/etc/openvpn/openvpn.conf

設定ファイルをコピーしたら、編集します。

  1. port(ポート番号)
  2. VPNサーバーのプロセスが接続要求を待ち受けるポート番号です。昔は5000番がデフォルトとして使われていましたが、今は1194がデフォルトです。

        port 1194
    
  3. proto(プロトコル)
  4. IPの上位プロトコルを指定します。行の先頭にセミコロン";"を挿入すると、その行はコメント行になります。使用するプロトコルの行を残し、他方の行をコメントにします。

        ;proto tcp
        proto udp
    
  5. dev(デバイス)
  6. ルーターサーバーの場合は、TUNデバイスを生成するために"dev tun"を指定します。一方、ブリッジサーバーの場合は、TAPデバイスを生成するために"dev tap"を指定します。残った方はコメントにしてください。

        ;dev tap
        dev tun
    

    ブリッジサーバーの場合で、事前にトンネルインターフェースtap0を作成し、Ethernetインターフェースと共にブリッジの設定を済ませているなら、"dev tap0"と記述します。

        dev tap0
    
  7. ca, cert, key(電子証明書と秘密鍵)
  8. CAの証明書、VPNサーバーの証明書、それとVPNサーバーの秘密鍵を指定します。3つのファイルがディレクトリー/etc/ssl/の中にあるとすると、次のように記述します。

        ca   /etc/ssl/cacert.pem
        cert /etc/ssl/vpncert.pem
        key  /etc/ssl/vpnkey.pem
    

    PKCS#12形式のファイルを指定する方法は次節の「クライアントの設定」で説明します。言い忘れていましたが、VPNサーバーでもPKCS#12形式のファイルを使うことはできます。

  9. crl-verify(失効リスト)
  10. 電子証明書を保存したモバイルパソコンを紛失してしまった場合、そのパソコンを手に入れた人物が無断でVPNサーバーに接続してくるかもしれません。そのような事態を防ぐために、効力を失った証明書がある場合、それらのリスト(crl:失効リスト)をホストに保存して指定します。

        crl-verify /etc/ssl/crl.pem
    
  11. dh(DHパラメータ)
  12. DHパラメータを指定します。ファイルがディレクトリー/etc/ssl/の中にあるとすると、次のように記述します。

        dh /etc/ssl/dh1024.pem
    
  13. server(サーバー)
  14. ルーターサーバーの場合、生成するVPNのIPネットワークアドレスを指定する必要があります。そのIPネットワークアドレスはローカル(社内)のIPネットワークアドレスと異っていなければなりません。デフォルトではVPNのIPネットワークアドレスは次のように指定されています。

        server 10.8.0.0 255.255.255.0
    

    もし、社内ネットワークのIPネットワークアドレスが10.8.0.0/24なら、違うIPネットワークアドレスを指定してください。

        server 172.16.0.0 255.255.255.0
    

    ブリッジサーバーの場合はこのディレクティブをコメントにします。

        ;server 10.8.0.0 255.255.255.0
    

  15. server-bridge(ブリッジサーバー)
  16. ブリッジサーバーの場合、VPNクライアントに割り当てるIPアドレスの範囲を指定する必要があります。そのIPアドレスのネットワークプレフィックスはローカルネットワークのIPアドレスのネットワークプレフィックスと同じでなければなりません。デフォルトでは次のように指定されています。

        server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
    

    上の設定は、ブリッジサーバーのIPアドレスを10.8.0.4とし、VPNクライアントに割り当てるIPアドレスの範囲を10.8.0.50から10.8.0.100までと指定しています。ローカルネットワークのIPネットワークアドレスが10.8.0.0/24でないなら、適切なアドレスを指定します。構成例の場合では次のようになります。

        server-bridge 192.168.0.253 255.255.255.0 192.168.0.240 192.168.0.250
    

    このディレクティブはデフォルトではコメントになっています。ルーターサーバーの場合はそのままにしてください。

        ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
    

  17. push(経路情報の告知)
  18. ルーターサーバーの場合、VPNクライアントにはローカルネットワークとは異なるIPネットワークアドレスが割り当てられます。VPNクライアントはローカルネットワークへの経路情報を自分のルーティングテーブルに追加する必要があります。そのためにVPNサーバーはローカルネットワークのネットワークアドレスをVPNクライアントに伝えます。

    例えば、VPNクライアントにIPネットワークアドレス"192.168.0.0/24"を伝えたいときは、次のように指定します。

        push "route 192.168.0.0 255.255.255.0"
    

    この結果、VPNクライアントのから見て、自ホストのトンネルインターフェースが10.8.0.6、トンネルの相手側終端が10.8.0.5の場合、ネットワーク192.168.0.0/24へはゲートウェイ10.8.0.5を経由して到達出来ることを示すエントリーがVPNクライアントのルーティングテーブルに追加されます。

    ブリッジサーバーの場合は基本的には必要ありませんが、社内ネットワークが複数のサブネットを持っているなら、VPNサーバーを設置したサブネット以外のIPネットワークアドレスをpushしてください。

    マイクロソフト社のWindows VistaのVPNクライアントで経路情報が追加されないときは、管理者としてプログラム(openvpn)を実行できるように設定して下さい。

  19. nobody(プロセスのUID)
  20. FreeBSDやLinuxなどでopenvpnをデーモンとして実行するとき、権限を低くしてセキュリティを高めます。デフォルトでは次の設定がコメントになっていますので、先頭のセミコロンを外してください。

        user nobody
        group nobody
    
  21. log
  22. OpenVPNの動作を記録したいときは、"log"か"log-append"のどちらかをアンコメント(Uncomment)してください。

        log         openvpn.log
        ;log-append  openvpn.log
    

ページのトップ

クライアントの設定

VPNクライアントがモバイルパソコンの場合、インストールが終わったら設定ファイルを編集するだけです。VPNサーバーと違って、パソコンの中にルーターの設定やブリッジの設定をする必要はありません。

8.1 client.ovpnの設定

OpenVPN GUI for Windowsの場合、設定ファイルの雛型がディレクトリ(フォルダー?)\Program Files\OpenVPN\sample-config\の中に入っています。sample-configの中のclient.ovpnをディレクトリ\Program Files\OpenVPN\config\にコピーします。

client.ovpnをコピーしたら編集します。

  1. dev(デバイス)
  2. クライアントのデバイスの設定は、接続するサーバーの設定と同じにします。サーバーの設定が"dev tap0"なら"dev tap"を選択してください。

        ;dev tap
        dev tun
    
  3. proto(プロトコル)
  4. クライアントのプロトコルの設定は、接続するサーバーの設定と同じにします。

        ;proto tcp
        proto udp
    
  5. remote(サーバー)
  6. 接続するVPNサーバーのグローバルアドレスとTCP/UDPポート番号を指定します。構成例の場合は次のように指定します。

        remote 2.0.0.12 1194
    
  7. ca, cert, key(電子証明書と秘密鍵)
  8. CAの証明書、VPNクライアントの証明書、それとVPNクライアントの秘密鍵を指定します。3つのファイルがディレクトリーC:\Cert\の中にあるとすると、次のように記述します。

        ca   /Cert/cacert.pem
        cert /Cert/pc01cert.pem
        key  /Cert/pc01key.pem
    

    PKCS#12形式のファイルを使う場合は、次のように指定します。

        pkcs12  /Cert/pc01cert.p12
    

ページのトップ

注意事項

9.1 ルーティングのリダイレクト

VPNをローカルネットワークにルーティング接続した場合、ローカルネットワーク内部での経路制御に注意して下さい。VPN接続が成功すると、VPNクライアントとVPNサーバーの間でICMP EchoとICMP Echo-Replyが送受信可能になります。ですが、ローカルネットワーク内の他のホストでは通信できな場合があります。

例えば、構成例においてVPNクライアントPCmのトンネルインターフェースのIPアドレスが10.8.0.6/24だと仮定します。このとき、PCmからPCoにICMP Echoを送っても、PCoからPCmにICMP Echo-Replyが返りません。なぜなら、PCoは10.8.0.6宛のICMP Echo-Replyを包んだEthernetフレームをデフォルトゲートウェイであるIn.RT(192.168.0.254)に伝送するからです。

このような事態を避けるため、デフォルトゲートウェイのルーティングテーブルに、ネットワーク10.8.0.0/24へは192.168.0.253を経由して接続できることを示すエントリーを手動で追加してください。

ページのトップ

9.2 wrappedサービス

構成例では、FTPは社内ネットワークからのみ利用ができるようにTCP Wrapperが設定されていいると仮定します。そのため、ルーティングの場合はVPNクライアントからFTPサーバーにアクセスできません。このような場合はTCP Wrapperの設定を見直して下さい。

ページのトップ

10 おわりに

VPNを導入する方法はいくつもあります。例えば、通信事業者が所有している通信網を用いて加入者にVPNを提供するサービスがあります。一般的にIP-VPNと呼ばれるこのサービスは、インターネットを経由しないためサービス品質を保証するなどの付加価値があります。

また、簡易VPNと呼ばれるサービスもあります。サービスプロバイダーがVPNサーバーを用意し、加入者が2拠点からインターネットを経由してサーバーに接続してVPNを確立します。この結果、2つのVPNクライアント間で暗号化通信が可能になります。このサービスではユーザーが固定IPアドレスを取得する必要がありませんので、SOHO(Small Office/Home Office)でよく利用されます。

そして、この記事で紹介したようなインターネットVPNがあります。

いづれの方法を採るかは、利用目的に合っているか、会社のセキュリティーポリシーに反していないか、運用管理を任せられる人は社内にいるか、ランニングコストは予算化できるかなどをよく検討した上で決めるべきです。

ですが、会社の判断はさておき、もしあなたがネットワーク技術者で、インターネットVPNの知識を習得し、実作業を経験したいと望むのであれば、OpenVPNを使ってVPNを構築してみると良いと思います。この記事が少しでもそのお役に立てれば幸いです。

ページのトップ

著作権者の文書による承諾を得ずに、本記事の一部または全部を無断で複写・複製・転載することはできません。