第15章 VPN サーバの設定

目次

15.1. 考え方の概要
15.2. 最も簡単な VPN の作成例
15.3. 証明機関を利用する VPN サーバの設定
15.4. VPN 内でのネームサーバの変更
15.5. クライアント向けの KDE および GNOME アプレット
15.6. さらなる情報

概要

現在ではインターネット接続は安価なものとなり、ほとんどどこからでも利用できる ようになりました。そして接続に対してできる限りの機密を求めるため、仮想 プライベートネットワーク (VPN) という仕組みを、インターネットや無線 LAN の ような機密の保持が難しいネットワークに対して利用するようにもなってきました。 VPN は様々な方法で実装/提供されているものであることから、本章では VPN を 利用して機密を保持するワイドエリアネットワークを構築し、企業のオフィスに 接続する場合を想定して説明しています。

15.1. 考え方の概要

本章では VPN に関する各種の用語の定義と、いくつかのシナリオに沿った 大まかな概要について説明を行なっています。

15.1.1. 用語

エンドポイント

トンネルの 両端 を指す言葉です。それぞれ発信元と 送信先の両方を意味します。

tap デバイス

tap デバイスはイーサネットデバイス (OSI 参照モデルにおけるレイヤ 2) を擬似します。 tap デバイスは、ネットワークブリッジを構成する場合に 使用し、イーサネットのフレームを取り扱います。

tun デバイス

tun デバイスは一対一のネットワーク (OSI モデルにおけるレイヤ 3) を擬似します。 tun デバイスはルーティングを扱う場合に利用するもので、 IP パケットを取り扱います。

トンネル

一般に公衆ネットワークを介した、 2 拠点 (端末) の接続を意味する用語 です。より技術的な観点で言うと、トンネルはクライアント側のデバイスと サーバ側のデバイスの接続を意味します。通常トンネルは暗号化されて いますが、必須ではありません。

15.1.2. VPN のシナリオ

VPN 接続を設定するには、機密を保持した トンネル を用意し、その中に IP パケットを流します。トンネルは tun または tap デバイスと呼ばれるものを利用します。 これらはイーサネットフレームや IP パケットを流すことのできる機能を 実装した、仮想的なネットワークカーネルドライバです。

OpenVPN に対応した任意のユーザスペース (カーネル内蔵のものではない別個の) プログラムでは、 tun デバイスや tap デバイスに接続することで、 OS からの パケットを受け取ることができます。これらのプログラムはデバイスにパケットを 書き込むこともできます。

VPN の接続設定と環境構築には、多数の解決方法があります。本章では OpenVPN パッケージを利用して解決する場合を想定します。他の VPN ソフトウエアと 比較すると、 OpenVPN は 2 種類のモードで動作させることができるように なっています:

ルーティング型 VPN

ルーティングはもっとも設定が簡単な方法です。ブリッジ型と比較すると、 効率と性能の両面で効率的になります。さらにユーザに対して MTU (Maximum Transfer Unit; 最大転送単位) の調整を許すことになるので、 より効率を上げる余地を与えることになります。しかしながら、ゲートウエイ 上に Samba サーバが存在しない場合、ルーティング型では NetBIOS の ブロードキャストパケットを通すことができません。また、 IPv6 を必要と する環境では、 VPN サーバとクライアントの両方の tun ドライバで IPv6 に対応する必要があります。詳しくは 図15.1「ルーティング型 VPN」 をご覧ください。

図15.1 ルーティング型 VPN

ルーティング型 VPN

ブリッジ型 VPN

ブリッジ型はより複雑な設定方法です。 Samba や WINS サーバを利用しない ネットワークで、 VPN を介して Windows のファイル共有を参照する必要が ある場合、ブリッジ型を選択する必要があります。また、ブリッジ型 VPN は IP 以外のプロトコル (たとえば IPX) を利用する場合や、ネットワーク ブロードキャストを必要とするアプリケーションを利用するような場合にも 選択する必要があります。しかしながら、ルーティング型 VPN に比べると 効率が悪くなってしまうほか、大規模環境にも不向きです。詳しくは 下記をご覧ください。

図15.2 ブリッジ型 VPN - シナリオ 1

ブリッジ型 VPN - シナリオ 1

図15.3 ブリッジ型 VPN - シナリオ 2

ブリッジ型 VPN - シナリオ 2

図15.4 ブリッジ型 VPN - シナリオ 3

ブリッジ型 VPN - シナリオ 3

また、ブリッジ型とルーティング型の大きな違いとして、ルーティング型 VPN では IP ブロードキャストを扱うことができないのにたいし、ブリッジ型 VPN ではそれを行なうことができるという点もあります。

15.2. 最も簡単な VPN の作成例

下記の例では、一対一 (Point-To-Point) 接続の VPN トンネルを作成しています。 この実例を元にして、 1 台のクライアントと 1 台のサーバから構成される VPN トンネルの作成方法を学習してください。なお、 VPN サーバとクライアントは いずれもプライベート IP アドレスの環境で、それぞれサーバ側が 192.168.1.120 、クライアント側が 192.168.2.110 となっている場合を 想定しています。お使いの環境で上記のアドレスをそのまま利用することも できますが、あらかじめ他の IP アドレスと矛盾がないことを確認しておいて ください。

[Warning]テスト用途にのみお使いください

この設定例は VPN について学習するためのものとして、テスト用に用意されて いるものです。下記の設定をそのまま使用してしまうと、お使いのマシンの 安全を脅かすことになるばかりか、ネットワーク全体に危険をもたらす 可能性があり得るため、下記の設定をそのまま使用することは おやめください

15.2.1. VPN サーバの設定

To configure a VPN server, proceed as follows:

手順15.1 VPN サーバ設定

  1. まずは VPN サーバとして利用したいマシンに対して、 openvpn パッケージを インストールします。

  2. シェルを開いて root になり、下記のように入力して VPN の 機密鍵を作成します:

    openvpn --genkey --secret /etc/openvpn/secret.key
  3. 機密鍵をクライアント側にコピーします:

    scp /etc/openvpn/secret.key root@192.168.2.110:/etc/openvpn/
  4. /etc/openvpn/server.conf ファイルを作成し、下記の ように入力します:

    dev tun
    ifconfig 192.168.1.120 192.168.2.110
    secret secret.key
  5. ファイアウオールをお使いの場合は、 YaST を起動してから セキュリティとユーザ+ファイアウオール+許可するサービス を選び、 UDP ポート 1194 を開きます。

  6. root から OpenVPN サービスを起動します:

    rcopenvpn start

15.2.2. VPN クライアントの設定

VPN クライアントを設定するには、下記のようにして行ないます:

手順15.2 VPN クライアント設定

  1. VPN クライアントマシンに対して、 openvpn パッケージを インストールします。

  2. 下記のような内容で /etc/openvpn/client.conf ファイルを作成します:

    remote サーバの IP アドレス
    dev tun
    ifconfig 192.168.2.110 192.168.1.120
    secret secret.key

    サーバの IP アドレス の欄には、 VPN サーバの ドメイン名 (FQDN) または IP アドレスを入力します。

  3. ファイアウオールをお使いの場合は、 手順15.1「VPN サーバ設定」 内の ステップ 5 の説明に従い、 YaST を起動して UDP ポート 1194 を開きます。

  4. root から OpenVPN サービスを起動します:

    rcopenvpn start

15.2.3. VPN 設定のテスト

OpenVPN を正しく起動することができたら、 tun デバイスが利用可能かどうか を下記のコマンドで確認します:

ifconfig tun0

さらに VPN の接続を確認するには、クライアントとサーバの両方で ping コマンドを利用し、お互いにパケットが届くかどうか を確認します。クライアントからサーバに対してテストを行なうには、下記の ように実行します:

ping -I tun0 192.168.1.120

逆にサーバからクライアントに対してテストを行なう場合は、下記のように 実行します:

ping -I tun0 192.168.2.110

15.3. 証明機関を利用する VPN サーバの設定

15.2項 で示した設定例は、単純にテストを行なう目的であれば簡単に実行できるものでは ありますが、実際の環境で使用するにはセキュリティ上の理由から不適切です。 この章では、同時に複数の接続を受け付ける VPN サーバの構築方法を説明して います。これは公開鍵インフラストラクチャ (PKI) と呼ばれる仕組みを利用して 行なうもので、それぞれサーバとクライアントに対して、公開鍵と機密鍵からなる 鍵対を配置します。さらに、マスター証明機関 (CA) と呼ばれる仕組みを用意し、 サーバやクライアントの証明書を検証させるようにするものです。

設定手順を大まかに分けると、下記のようになります:

15.3.1. 証明書の作成

VPN 接続が確立する前の段階で、クライアントはサーバに対して認証を行なわなければ なりません。また逆に、サーバもクライアントに対して認証を行なわなければ なりません。これは 相互認証 と呼びます。

それぞれ必要な証明書と鍵を作成するには、下記の 2 つの方法のうちのいずれかを 実行します:

  • YaST の証明機関モジュール (詳しくは 第16章 X.509 証明書の管理 をお読みください) を使用する

  • openvpn パッケージに含まれる スクリプトを使用する

15.3.1.1. easy-rsa を利用した証明書の作成

easy-rsa ユーティリティは /usr/share/openvpn/easy-rsa/バージョン ディレクトリ内にある openssl.cnf ファイルを使用します。 ほとんどの場合、このファイルをそのまま使用するだけで設定が完了します。

手順15.3 マスター証明機関と鍵の作成

  1. シェルを開いて root に移行します。

  2. /usr/share/openvpn/easy-rsa/バージョン/ ディレクトリに移動します。ここで、 バージョン には 1.02.0 など、現在のバージョンが 入ります。

  3. vars ファイルを /etc/openvpn ディレクトリにコピーし、 /usr/share/openvpn/easy-rsa 内で export EASY_RSA を設定します:

    export EASY_RSA="/usr/share/openvpn/easy-rsa/VER"
  4. vars ファイル内で、それぞれ KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, and KEY_EMAIL の値を必要に応じて修正します。

  5. PKI (公開鍵インフラストラクチャ) を初期化します:

    source /etc/openvpn/vars && ./clean-all && ./build-ca
  6. build-ca スクリプトで要求されたデータをそれぞれ 入力します。通常は ステップ 4 で設定した 既定値を利用することができます。追加で、左記では設定していなかった Organizational Unit Name (部署名) と Common Name (汎用名) を入力することもできます。

完了すると、マスター証明書と鍵が /usr/share/openvpn/easy-rsa/バージョン/keys/ca.* に保存されます。

手順15.4 プライベートサーバ鍵の作成

  1. /usr/share/openvpn/easy-rsa/バージョン/ ディレクトリに移動します。

  2. 下記のスクリプトを実行します:

    ./build-key-server server

    パラメータ (ここでは サーバ) には、機密鍵の ファイル名を指定します。

  3. パラメータは基本的に既定値をそのまま受け入れてかまいませんが、 Common Name (汎用名) の項目だけは サーバのホスト名 (FQDN) または IP アドレス を指定してください。

  4. 続く 2 つの質問 ((Sign the certificate? [y/n] (証明書に署名しますか?) と 1 out of 1 certificate requests certified, commit? [y/n] (1 つのうち 1 つの証明書要求に署名 しました。確定してよろしいですか?)) に対しては、いずれも y (はい) を入力します。

作業を完了すると、サーバの機密鍵は /usr/share/openvpn/easy-rsa/バージョン/keys/server.* に保存されます。

手順15.5 クライアントに対する証明書と鍵の作成

  1. /usr/share/openvpn/easy-rsa/バージョン/ ディレクトリに移動します。ここで、 バージョン には 1.02.0 など、現在のバージョンが 入ります。

  2. 手順15.4「プライベートサーバ鍵の作成」ステップ 2 にある手順に従い、 鍵を作成します:

    ./build-key client
  3. 上記の手順を、 VPN サーバへの接続を許可するクライアントの数だけ繰り返します。 なお、それぞれ実行するごとに client と 問い合わせの途中で表示される Common Name の欄には、 クライアントごとに異なる名前を指定してください。

作業を完了すると、クライアントの証明書と鍵は /usr/share/openvpn/easy-rsa/keys/client.* に保存されます (build-key コマンドに指定した名前で 作成されます) 。

手順15.6 最後の設定作業

  1. まずはカレントディレクトリが /usr/share/openvpn/easy-rsa/バージョン/. であることを確認します。

  2. Diffie-Hellman パラメータを作成します:

    ./build-dh
  3. /etc/openvpn/ssl ディレクトリを作成します。

  4. 下記のファイルを /etc/openvpn/ssl 内に コピーします:

    cp keys/ca.{crt,key} keys/dh1024.pem keys/server.{crt,key} /etc/openvpn/ssl
  5. 作成しておいたクライアントの鍵を、クライアントにコピーします。具体的には、 各クライアントの /etc/openvpn/ssl ディレクトリ内に、 client.crtclient.key ファイルを配置します。

15.3.1.2. YaST CA モジュールを利用した証明書の設定について

この時点で easy-rsa ユーティリティを利用して証明書を作成してある場合は、 本章を読み飛ばしてかまいません。

15.3.2. サーバの設定

設定ファイルは、 /usr/share/doc/packages/openvpn/sample-config-files/server.conf にあるサンプルを雛形にして作成することができます。なお、パス設定なども一部修正する 必要がある場合があります。

例15.1 VPN サーバの設定ファイル

# /etc/openvpn/server.conf
port 1194 1
proto udp 2
dev tun0 3

# セキュリティ 4
ca   /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/server.crt
key  /etc/openvpn/ssl/server.key
dh   /etc/openvpn/ssl/dh1024.pem

server 192.168.1.120 255.255.255.0 5
ifconfig-pool-persist /var/run/openvpn/ipp.txt 6

# 権限 7
user nobody
group nobody

# その他の設定 8
keepalive 10 120
comp-lzo
persist-key
persist-tun
status      /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 4

1

OpenVPN が待ち受ける TCP/UDP ポートを指定します。ファイアウオールをお使い の場合は、ファイアウオールの設定でポートを開く必要があります (第14章 マスカレードとファイアウオール をお読みください) 。なお、 VPN で使用する標準のポートは 1194 で、特に要件がないかぎり、そのままの設定で かまいません。

2

プロトコルを指定します。 UDP または TDP を指定します。

3

tun または tap デバイスを指定します。違いについては 15.1.1項 「用語」 をお読みください。

4

この行以後には、それぞれルート CA (証明機関) の証明書 (ca) とルート CA の鍵 (cert) 、プライベートサーバ鍵 (key) と Diffie-Hellman パラメータ (dh) を指定しています。これらは 15.3.1項 「証明書の作成」 の手順で作成してあるものです。

5

VPN のサブネットを指定します。このとき、サーバは 192.168.1.120 のアドレスにあるものとします。

6

クライアントと割り当てた IP アドレスの一覧を、指定したファイルに保存する 設定です。サーバがいったん再起動するような状況で、再起動後にもクライアントが 同じアドレスで通信できるようにしたい場合に便利です。

7

セキュリティ保持の目的から、 OpenVPN は制限された権限下で動作させておく ことをお勧めします。この例では nobody という ユーザ/グループを指定しています。

8

その他のいくつかの設定です。詳しくは設定ファイルの雛形 /usr/share/doc/packages/openvpn/sample-config-files にあるコメントをお読みください。

設定を完了したら、 OpenVPN サーバのログメッセージが /var/log/openvpn.log 内に記録されるようになります。 初回に起動した場合は、下記のような出力が現われているはずです:

... Initialization Sequence Completed

もしも上記のようなメッセージが表示されていない場合は、まずログをよくお読み ください。通常は OpenVPN 側で、設定ファイルのどこに問題があるのかヒントを 表示しているはずです。

15.3.3. クライアントの設定

設定ファイルは、 /usr/share/doc/packages/openvpn/sample-config-files/client.conf にあるサンプルを雛形にして作成することができます。なお、パス設定なども一部修正する 必要がある場合があります。

例15.2 VPN クライアントの設定ファイル

# /etc/openvpn/client.conf
client 1
dev tun 2
proto udp 3
remote IP アドレスまたはホスト名 1194 4
resolv-retry infinite
nobind

# 権限 5
user nobody
group nobody

# 再起動しても同じ状態を維持しようとするための設定
persist-key
persist-tun

# セキュリティ 6
ca   /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/client.crt
key  /etc/openvpn/ssl/client.key

comp-lzo 7

1

このマシンをクライアントとして動作させる指定です。

2

ネットワークデバイスを指定します。クライアントとサーバの両方で、同じ デバイスを使用しなければなりません。

3

プロトコルを指定します。サーバと同じ設定を使用します。

4

まず IP アドレスまたはホスト名 の項目は、 お使いの VPN サーバのホスト名または IP アドレスを指定します。これに 続いて、ポート番号を指定します。複数の remote 行を設定して、複数の VPN サーバを使用するように指定することもできます。 この場合は、複数の VPN サーバ間で負荷分散を行なう場合に有効です。

5

セキュリティ保持の目的から、 OpenVPN は制限された権限下で動作させておく ことをお勧めします。この例では nobody という ユーザ/グループを指定しています。

6

クライアント側の証明書類を指定しています。セキュリティ保持の目的から、 各クライアントに対して共通の証明書を使用したりはせず、別々のファイル にしておくことをお勧めします。

7

圧縮機能を有効にする設定です。サーバ側でも同様に圧縮機能を有効にして いる場合にのみ有効です。


15.4. VPN 内でのネームサーバの変更

VPN セッションの前または途中でネームサーバを変更する必要がある場合は、 netconfig を使用して行ないます。

ネームサーバを変更するには、下記の手順を実行します:

手順15.7 ネームサーバの変更

  1. シェルを開いて root に移行します。

  2. /etc/openvpn/client.up ファイルを作成し、下記の 内容を入力します:

    /sbin/netconfig modify -i "${1}" -s openvpn <<EOT
    DNSSEARCH='${domain}'
    DNSSERVERS='${dns[*]}'
    EOT
  3. rcopenvpn start を実行し、 VPN 接続を開始します。

  4. /etc/openvpn/client.down ファイルを作成し、下記の 内容を入力します:

    /sbin/netconfig remove -i "${1}" -s openvpn
  5. netconfig コマンドを実行します。なお、 DNSSERVERS の行には設定したいネームサーバを指定します:

    netconfig modify -i tun0 -s openvpn <<EOT
    DNSSEARCH='mt-home.net'
    DNSSERVERS='192.168.1.116' 
    EOT

    正しく設定されたかどうかを確認するには、 /etc/resolv.conf ファイル内に設定した はずの項目が挿入されているかどうかを確認します。下記のように 実行してください:

    grep -v ^# /etc/resolv.conf 
    search mt-home.net mat-home.net
    nameserver ...
    nameserver ...
    nameserver 192.168.1.116
  6. DNS の設定を削除するには、下記のように実行します:

    netconfig remove -i tun0 -s openvpn

上記以外の設定例については、 /usr/share/doc/packages/openvpn/contrib/pull-resolv-conf/ をお読みください。

フォールバック (あるものが使用できない場合の代替) サービスの順位リストを 設定する必要がある場合は、 /etc/sysconfig/network/config 内の NETCONFIG_DNS_RANKING 変数を使用します。既定値は auto で、下記の設定になっています:

+strongswan +openswan +racoon +openvpn -avahi

優先するサービス名に対しては頭に + を、フォールバック サービスに対しては頭に - を付与します。

15.5. クライアント向けの KDE および GNOME アプレット

下記の章では、 GNOME や KDE のデスクトップツールを利用して OpenVPN の 接続を設定する方法を説明しています。

15.5.1. KDE

KDE4 で OpenVPN の設定を行なったり、有効と無効の切り替えを簡単に行なったり するには、下記の手順を実施します:

  1. まずは NetworkManager-openvpn-kde4 パッケージと、このパッケージが必要とするパッケージをすべて インストールしていることを確認します。

  2. パネル内のウイジェットでマウスの右ボタンを押し、 パネルのオプション+ウィジェットの追加... を選択します。

  3. ネットワーク を選択します。

  4. アイコンの上でマウスの右ボタンを押し、 接続の管理 を選択します。

  5. 追加+OpenVPN を選択し、新しい VPN 接続を作成します。新しいウインドウが開きます。

  6. 接続タイプ では X.509 証明書 または パスワード付き X.509 証明書 を選択します。これはお使いの VPN サーバの設定に従って選択してください。

  7. あとはそれぞれ関連するテキスト項目に必要なファイルを挿入します。 上述の例では、設定は下記のようになります:

    CA ファイル

    /etc/openvpn/ssl/ca.crt

    証明書

    /etc/openvpn/ssl/client1.crt

    /etc/openvpn/ssl/client1.key

    ユーザ名

    ユーザ名

    パスワード

    ユーザに対するパスワード

  8. KDE ウォレットシステムを初めてお使いになる場合は、ここで設定を行なうか どうかを尋ねられます。ウイザードの示す手順に従って作業を行なってください。 設定手順が終わったら、 ネットワーク設定 ダイアログに 戻ってきます。

  9. Ok を押して完了します。

  10. あとは Network Manager のアプレットを利用することで、接続を行なうことが できるようになります。

15.5.2. GNOME

GNOME で OpenVPN の設定を行なったり、有効と無効の切り替えを簡単に行なったり するには、下記の手順を実施します:

  1. まずは NetworkManager-openvpn-gnome パッケージと、このパッケージが必要とするパッケージをすべて インストールしていることを確認します。

  2. Alt+F2 を押してから、表示されたテキスト枠に nm-connection-editor と入力し、ネットワーク接続エディタを起動します。新しいウインドウが 表示されます。

  3. VPN タブを選択して Add を 押します。

  4. まずは VPN の接続タイプを選択します。この場合は OpenVPN を選択します。

  5. Authentication の種類では、 Certificates (TLS) または Password with Certificates (TLS) を選択します。これはお使いの VPN サーバの設定に従って選択してください。 server.

  6. あとはそれぞれ関連するテキスト項目に必要なファイルを挿入します。 上述の例では、設定は下記のようになります:

    Username

    ユーザ名 (Password with Certificates (TLS) を 選択した場合のみ)

    Password

    ユーザに対するパスワード (Password with Certificates (TLS) を選択した場合のみ)

    User Certificate

    /etc/openvpn/ssl/client1.crt

    CA Certificate

    /etc/openvpn/ssl/ca.crt

    Private Key

    /etc/openvpn/ssl/client1.key

  7. 最後に ApplyClose を 押せば完了です。

  8. あとは NetworkManager のアプレットを利用することで、接続を行なう ことができるようになります。

15.6. さらなる情報

VPN について、さらに詳しい情報は下記をお読みください:

  • http://www.openvpn.net: VPN の Web ページ

  • /usr/share/doc/packages/openvpn/sample-config-files/: 様々なシナリオに対応する設定例

  • /usr/src/linux/Documentation/networking/tuntap.txt: kernel-source パッケージを インストールすると閲覧できるドキュメント (英語)


openSUSE セキュリティガイド 13.1