目次
概要
現在ではインターネット接続は安価なものとなり、ほとんどどこからでも利用できる ようになりました。そして接続に対してできる限りの機密を求めるため、仮想 プライベートネットワーク (VPN) という仕組みを、インターネットや無線 LAN の ような機密の保持が難しいネットワークに対して利用するようにもなってきました。 VPN は様々な方法で実装/提供されているものであることから、本章では VPN を 利用して機密を保持するワイドエリアネットワークを構築し、企業のオフィスに 接続する場合を想定して説明しています。
本章では VPN に関する各種の用語の定義と、いくつかのシナリオに沿った 大まかな概要について説明を行なっています。
トンネルの 「両端」 を指す言葉です。それぞれ発信元と 送信先の両方を意味します。
tap デバイスはイーサネットデバイス (OSI 参照モデルにおけるレイヤ 2) を擬似します。 tap デバイスは、ネットワークブリッジを構成する場合に 使用し、イーサネットのフレームを取り扱います。
tun デバイスは一対一のネットワーク (OSI モデルにおけるレイヤ 3) を擬似します。 tun デバイスはルーティングを扱う場合に利用するもので、 IP パケットを取り扱います。
一般に公衆ネットワークを介した、 2 拠点 (端末) の接続を意味する用語 です。より技術的な観点で言うと、トンネルはクライアント側のデバイスと サーバ側のデバイスの接続を意味します。通常トンネルは暗号化されて いますが、必須ではありません。
VPN 接続を設定するには、機密を保持した トンネル を用意し、その中に IP パケットを流します。トンネルは tun または tap デバイスと呼ばれるものを利用します。 これらはイーサネットフレームや IP パケットを流すことのできる機能を 実装した、仮想的なネットワークカーネルドライバです。
OpenVPN に対応した任意のユーザスペース (カーネル内蔵のものではない別個の) プログラムでは、 tun デバイスや tap デバイスに接続することで、 OS からの パケットを受け取ることができます。これらのプログラムはデバイスにパケットを 書き込むこともできます。
VPN の接続設定と環境構築には、多数の解決方法があります。本章では OpenVPN パッケージを利用して解決する場合を想定します。他の VPN ソフトウエアと 比較すると、 OpenVPN は 2 種類のモードで動作させることができるように なっています:
ルーティングはもっとも設定が簡単な方法です。ブリッジ型と比較すると、 効率と性能の両面で効率的になります。さらにユーザに対して MTU (Maximum Transfer Unit; 最大転送単位) の調整を許すことになるので、 より効率を上げる余地を与えることになります。しかしながら、ゲートウエイ 上に Samba サーバが存在しない場合、ルーティング型では NetBIOS の ブロードキャストパケットを通すことができません。また、 IPv6 を必要と する環境では、 VPN サーバとクライアントの両方の tun ドライバで IPv6 に対応する必要があります。詳しくは 図15.1「ルーティング型 VPN」 をご覧ください。
ブリッジ型はより複雑な設定方法です。 Samba や WINS サーバを利用しない ネットワークで、 VPN を介して Windows のファイル共有を参照する必要が ある場合、ブリッジ型を選択する必要があります。また、ブリッジ型 VPN は IP 以外のプロトコル (たとえば IPX) を利用する場合や、ネットワーク ブロードキャストを必要とするアプリケーションを利用するような場合にも 選択する必要があります。しかしながら、ルーティング型 VPN に比べると 効率が悪くなってしまうほか、大規模環境にも不向きです。詳しくは 下記をご覧ください。
また、ブリッジ型とルーティング型の大きな違いとして、ルーティング型 VPN では IP ブロードキャストを扱うことができないのにたいし、ブリッジ型 VPN ではそれを行なうことができるという点もあります。
下記の例では、一対一 (Point-To-Point) 接続の VPN トンネルを作成しています。
この実例を元にして、 1 台のクライアントと 1 台のサーバから構成される VPN
トンネルの作成方法を学習してください。なお、 VPN サーバとクライアントは
いずれもプライベート IP アドレスの環境で、それぞれサーバ側が
192.168.1.120
、クライアント側が
192.168.2.110
となっている場合を
想定しています。お使いの環境で上記のアドレスをそのまま利用することも
できますが、あらかじめ他の IP アドレスと矛盾がないことを確認しておいて
ください。
テスト用途にのみお使いください | |
---|---|
この設定例は VPN について学習するためのものとして、テスト用に用意されて いるものです。下記の設定をそのまま使用してしまうと、お使いのマシンの 安全を脅かすことになるばかりか、ネットワーク全体に危険をもたらす 可能性があり得るため、下記の設定をそのまま使用することは おやめください 。 |
To configure a VPN server, proceed as follows:
手順15.1 VPN サーバ設定¶
まずは VPN サーバとして利用したいマシンに対して、
openvpn
パッケージを
インストールします。
シェルを開いて root
になり、下記のように入力して VPN の
機密鍵を作成します:
openvpn --genkey --secret /etc/openvpn/secret.key
機密鍵をクライアント側にコピーします:
scp /etc/openvpn/secret.key root@192.168.2.110:/etc/openvpn/
/etc/openvpn/server.conf
ファイルを作成し、下記の
ように入力します:
dev tun ifconfig 192.168.1.120 192.168.2.110 secret secret.key
ファイアウオールをお使いの場合は、 YaST を起動してから
+ + を選び、 UDP ポート 1194 を開きます。
root
から OpenVPN サービスを起動します:
rcopenvpn start
VPN クライアントを設定するには、下記のようにして行ないます:
手順15.2 VPN クライアント設定
VPN クライアントマシンに対して、
openvpn
パッケージを
インストールします。
下記のような内容で /etc/openvpn/client.conf
ファイルを作成します:
remote サーバの IP アドレス
dev tun
ifconfig 192.168.2.110 192.168.1.120
secret secret.key
サーバの IP アドレス
の欄には、 VPN サーバの
ドメイン名 (FQDN) または IP アドレスを入力します。
ファイアウオールをお使いの場合は、 手順15.1「VPN サーバ設定」 内の ステップ 5 の説明に従い、 YaST を起動して UDP ポート 1194 を開きます。
root
から OpenVPN サービスを起動します:
rcopenvpn start
OpenVPN を正しく起動することができたら、 tun デバイスが利用可能かどうか を下記のコマンドで確認します:
ifconfig tun0
さらに VPN の接続を確認するには、クライアントとサーバの両方で ping コマンドを利用し、お互いにパケットが届くかどうか を確認します。クライアントからサーバに対してテストを行なうには、下記の ように実行します:
ping -I tun0 192.168.1.120
逆にサーバからクライアントに対してテストを行なう場合は、下記のように 実行します:
ping -I tun0 192.168.2.110
15.2項 で示した設定例は、単純にテストを行なう目的であれば簡単に実行できるものでは ありますが、実際の環境で使用するにはセキュリティ上の理由から不適切です。 この章では、同時に複数の接続を受け付ける VPN サーバの構築方法を説明して います。これは公開鍵インフラストラクチャ (PKI) と呼ばれる仕組みを利用して 行なうもので、それぞれサーバとクライアントに対して、公開鍵と機密鍵からなる 鍵対を配置します。さらに、マスター証明機関 (CA) と呼ばれる仕組みを用意し、 サーバやクライアントの証明書を検証させるようにするものです。
設定手順を大まかに分けると、下記のようになります:
VPN 接続が確立する前の段階で、クライアントはサーバに対して認証を行なわなければ なりません。また逆に、サーバもクライアントに対して認証を行なわなければ なりません。これは 相互認証 と呼びます。
それぞれ必要な証明書と鍵を作成するには、下記の 2 つの方法のうちのいずれかを 実行します:
YaST の証明機関モジュール (詳しくは 第16章 X.509 証明書の管理 をお読みください) を使用する
openvpn
パッケージに含まれる
スクリプトを使用する
easy-rsa ユーティリティは
/usr/share/openvpn/easy-rsa/
ディレクトリ内にある バージョン
openssl.cnf
ファイルを使用します。
ほとんどの場合、このファイルをそのまま使用するだけで設定が完了します。
手順15.3 マスター証明機関と鍵の作成¶
シェルを開いて root
に移行します。
/usr/share/openvpn/easy-rsa/
ディレクトリに移動します。ここで、 バージョン
/バージョン
には
1.0
や 2.0
など、現在のバージョンが
入ります。
vars
ファイルを /etc/openvpn
ディレクトリにコピーし、 /usr/share/openvpn/easy-rsa
内で export EASY_RSA
を設定します:
export EASY_RSA="/usr/share/openvpn/easy-rsa/VER
"
vars
ファイル内で、それぞれ
KEY_COUNTRY
, KEY_PROVINCE
,
KEY_CITY
, KEY_ORG
, and
KEY_EMAIL
の値を必要に応じて修正します。
PKI (公開鍵インフラストラクチャ) を初期化します:
source /etc/openvpn/vars && ./clean-all && ./build-ca
build-ca スクリプトで要求されたデータをそれぞれ
入力します。通常は ステップ 4 で設定した
既定値を利用することができます。追加で、左記では設定していなかった
Organizational Unit Name
(部署名) と Common
Name
(汎用名) を入力することもできます。
完了すると、マスター証明書と鍵が
/usr/share/openvpn/easy-rsa/
に保存されます。
バージョン
/keys/ca.*
手順15.4 プライベートサーバ鍵の作成¶
/usr/share/openvpn/easy-rsa/
ディレクトリに移動します。
バージョン
/
下記のスクリプトを実行します:
./build-key-server server
パラメータ (ここでは サーバ
) には、機密鍵の
ファイル名を指定します。
パラメータは基本的に既定値をそのまま受け入れてかまいませんが、
Common Name
(汎用名) の項目だけは
サーバのホスト名 (FQDN) または IP アドレス
を指定してください。
続く 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 クライアントに対する証明書と鍵の作成¶
/usr/share/openvpn/easy-rsa/
ディレクトリに移動します。ここで、 バージョン
/バージョン
には
1.0
や 2.0
など、現在のバージョンが
入ります。
手順15.4「プライベートサーバ鍵の作成」 の ステップ 2 にある手順に従い、 鍵を作成します:
./build-key client
上記の手順を、 VPN サーバへの接続を許可するクライアントの数だけ繰り返します。
なお、それぞれ実行するごとに 「client
」 と
問い合わせの途中で表示される Common Name
の欄には、
クライアントごとに異なる名前を指定してください。
作業を完了すると、クライアントの証明書と鍵は
/usr/share/openvpn/easy-rsa/keys/client.*
に保存されます (build-key コマンドに指定した名前で
作成されます) 。
手順15.6 最後の設定作業
まずはカレントディレクトリが
/usr/share/openvpn/easy-rsa/
.
であることを確認します。
バージョン
/
Diffie-Hellman パラメータを作成します:
./build-dh
/etc/openvpn/ssl
ディレクトリを作成します。
下記のファイルを /etc/openvpn/ssl
内に
コピーします:
cp keys/ca.{crt,key} keys/dh1024.pem keys/server.{crt,key} /etc/openvpn/ssl
作成しておいたクライアントの鍵を、クライアントにコピーします。具体的には、
各クライアントの /etc/openvpn/ssl
ディレクトリ内に、
client.crt
と client.key
ファイルを配置します。
設定ファイルは、
/usr/share/doc/packages/openvpn/sample-config-files/server.conf
にあるサンプルを雛形にして作成することができます。なお、パス設定なども一部修正する
必要がある場合があります。
例15.1 VPN サーバの設定ファイル¶
# /etc/openvpn/server.conf port 1194 proto udp dev tun0 # セキュリティ 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 ifconfig-pool-persist /var/run/openvpn/ipp.txt # 権限 user nobody group nobody # その他の設定 keepalive 10 120 comp-lzo persist-key persist-tun status /var/log/openvpn-status.log log-append /var/log/openvpn.log verb 4
OpenVPN が待ち受ける TCP/UDP ポートを指定します。ファイアウオールをお使い の場合は、ファイアウオールの設定でポートを開く必要があります (第14章 マスカレードとファイアウオール をお読みください) 。なお、 VPN で使用する標準のポートは 1194 で、特に要件がないかぎり、そのままの設定で かまいません。 | |
プロトコルを指定します。 UDP または TDP を指定します。 | |
tun または tap デバイスを指定します。違いについては 15.1.1項 「用語」 をお読みください。 | |
この行以後には、それぞれルート CA (証明機関) の証明書 ( | |
VPN のサブネットを指定します。このとき、サーバは
| |
クライアントと割り当てた IP アドレスの一覧を、指定したファイルに保存する 設定です。サーバがいったん再起動するような状況で、再起動後にもクライアントが 同じアドレスで通信できるようにしたい場合に便利です。 | |
セキュリティ保持の目的から、 OpenVPN は制限された権限下で動作させておく
ことをお勧めします。この例では | |
その他のいくつかの設定です。詳しくは設定ファイルの雛形
|
設定を完了したら、 OpenVPN サーバのログメッセージが
/var/log/openvpn.log
内に記録されるようになります。
初回に起動した場合は、下記のような出力が現われているはずです:
... Initialization Sequence Completed
もしも上記のようなメッセージが表示されていない場合は、まずログをよくお読み ください。通常は OpenVPN 側で、設定ファイルのどこに問題があるのかヒントを 表示しているはずです。
設定ファイルは、
/usr/share/doc/packages/openvpn/sample-config-files/client.conf
にあるサンプルを雛形にして作成することができます。なお、パス設定なども一部修正する
必要がある場合があります。
例15.2 VPN クライアントの設定ファイル
# /etc/openvpn/client.conf
client
dev tun
proto udp
remote IP アドレスまたはホスト名
1194
resolv-retry infinite
nobind
# 権限
user nobody
group nobody
# 再起動しても同じ状態を維持しようとするための設定
persist-key
persist-tun
# セキュリティ
ca /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/client.crt
key /etc/openvpn/ssl/client.key
comp-lzo
このマシンをクライアントとして動作させる指定です。 | |
ネットワークデバイスを指定します。クライアントとサーバの両方で、同じ デバイスを使用しなければなりません。 | |
プロトコルを指定します。サーバと同じ設定を使用します。 | |
まず | |
セキュリティ保持の目的から、 OpenVPN は制限された権限下で動作させておく
ことをお勧めします。この例では | |
クライアント側の証明書類を指定しています。セキュリティ保持の目的から、 各クライアントに対して共通の証明書を使用したりはせず、別々のファイル にしておくことをお勧めします。 | |
圧縮機能を有効にする設定です。サーバ側でも同様に圧縮機能を有効にして いる場合にのみ有効です。 |
VPN セッションの前または途中でネームサーバを変更する必要がある場合は、 netconfig を使用して行ないます。
ネームサーバを変更するには、下記の手順を実行します:
手順15.7 ネームサーバの変更¶
シェルを開いて root
に移行します。
/etc/openvpn/client.up
ファイルを作成し、下記の
内容を入力します:
/sbin/netconfig modify -i "${1}" -s openvpn <<EOT DNSSEARCH='${domain}' DNSSERVERS='${dns[*]}' EOT
rcopenvpn start
を実行し、
VPN 接続を開始します。
/etc/openvpn/client.down
ファイルを作成し、下記の
内容を入力します:
/sbin/netconfig remove -i "${1}" -s openvpn
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
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
優先するサービス名に対しては頭に +
を、フォールバック
サービスに対しては頭に -
を付与します。
下記の章では、 GNOME や KDE のデスクトップツールを利用して OpenVPN の 接続を設定する方法を説明しています。
KDE4 で OpenVPN の設定を行なったり、有効と無効の切り替えを簡単に行なったり するには、下記の手順を実施します:
まずは NetworkManager-openvpn-kde4
パッケージと、このパッケージが必要とするパッケージをすべて
インストールしていることを確認します。
パネル内のウイジェットでマウスの右ボタンを押し、
+ を選択します。を選択します。
アイコンの上でマウスの右ボタンを押し、
を選択します。+ を選択し、新しい VPN 接続を作成します。新しいウインドウが開きます。
では または を選択します。これはお使いの VPN サーバの設定に従って選択してください。
あとはそれぞれ関連するテキスト項目に必要なファイルを挿入します。 上述の例では、設定は下記のようになります:
|
|
|
|
|
|
|
ユーザ名 |
|
ユーザに対するパスワード |
KDE ウォレットシステムを初めてお使いになる場合は、ここで設定を行なうか どうかを尋ねられます。ウイザードの示す手順に従って作業を行なってください。 設定手順が終わったら、
ダイアログに 戻ってきます。を押して完了します。
あとは Network Manager のアプレットを利用することで、接続を行なうことが できるようになります。
GNOME で OpenVPN の設定を行なったり、有効と無効の切り替えを簡単に行なったり するには、下記の手順を実施します:
まずは NetworkManager-openvpn-gnome
パッケージと、このパッケージが必要とするパッケージをすべて
インストールしていることを確認します。
Alt+F2 を押してから、表示されたテキスト枠に nm-connection-editor と入力し、ネットワーク接続エディタを起動します。新しいウインドウが 表示されます。
タブを選択して を 押します。
まずは VPN の接続タイプを選択します。この場合は
を選択します。の種類では、 または を選択します。これはお使いの VPN サーバの設定に従って選択してください。 server.
あとはそれぞれ関連するテキスト項目に必要なファイルを挿入します。 上述の例では、設定は下記のようになります:
|
ユーザ名 ( を 選択した場合のみ) |
|
ユーザに対するパスワード ( を選択した場合のみ) |
|
|
|
|
|
|
最後に
と を 押せば完了です。あとは NetworkManager のアプレットを利用することで、接続を行なう ことができるようになります。
VPN について、さらに詳しい情報は下記をお読みください:
http://www.openvpn.net: VPN の Web ページ
/usr/share/doc/packages/openvpn/sample-config-files/
:
様々なシナリオに対応する設定例
/usr/src/linux/Documentation/networking/tuntap.txt
:
kernel-source
パッケージを
インストールすると閲覧できるドキュメント (英語)