OpenVPNでVPNしよう

2006/03/25

自宅と会社とで、ファイル共有などをしたかったのでオープンソースのVPNソフトウェア = OpenVPNをVine Linuxへインストールしてみました。

この例ではVine Linux3.2を利用しています。

少し使った感じでは、たいへん安定しているし、UDP接続した場合、それなりのスループットは出るようです。また、IPSecよりも設定が簡単です。


目次


ネットワーク環境

自宅のWindowsXP(192.168.10.20)
  |
  +--- ルータ(192.168.10.1)
			|
		   WAN (フレッツADSLの動的IP)
			|
			.
			.
			.
			.
			.
			|
		   WAN (固定IP=202.a.b.c)
			|
		会社のルータ(192.168.0.1) ------+----------------------+
										|					   |
						  Vine Linux (192.168.0.30)   会社のWindows2000(192.168.0.40)

ここで、自宅設置のWindowsXPから会社のWindows2000の共有フォルダを見たいので、これをVPNでトンネルさせます。VPNで接続すると次のような感じになります。

自宅のWindowsXP(192.168.10.20)
  |
OpenVPN (192.168.128.0/255.255.255.0)
  |
  +--- ルータ(192.168.10.1)
			|
		   WAN (フレッツADSLの動的IP)
			|
			.
			.
			.
			.
			.
			|
		   WAN (固定IP=202.a.b.c)
			|
		会社のルータ(192.168.0.1) ------+
										|
				 OpenVPN (192.168.128.1/255.255.255.0)
										|
						  Vine Linux (192.168.0.30)
										|
										+-------------+---------------+
										|			  | 			  |
					   会社のWindows(192.168.0.40)	  | 			  |
													  | 			  |
									会社のWindows(192.168.0.41) 	  |
																	  |
												   会社のWindows(192.168.0.42)

この図のように、自宅WindowsXPからは192.168.128.xxに、会社のLANがつながっているのと同等になります。 Vine Linuxがトンネリングするため、会社の他のPCへはすべてアクセス可能となります。


VineLinuxにOpenVPNをインストール

  1. まず、OpenVPNで必要となるlzoパッケージをインストールします。
    Vine標準では配布されていないので、ここではうちで作ったパッケージを使っています。
    $ su
    # rpm -Uvh http://tsuttayo.sytes.net/apt/vine3.2/RPMS.i386/lzo-1.08-0vl0.i386.rpm
    # rpm -Uvh http://tsuttayo.sytes.net/apt/vine3.2/RPMS.i386/lzo-devel-1.08-0vl0.i386.rpm
    # exit
  2. OpenVPNのソースファイルをダウンロードします。
    OpenVPN DownloadからSource Tarballをダウンロードします。 これを書いている時点では「openvpn-2.0.5.tar.gz」でしたが、最新版をダウンロードしてください。
    ファイルは「/home/USERNAME/rpm/SOURCES」の中に保存します。
  3. RPMパッケージを作ります。
    OpenVPNのソースはSPECファイルが同梱されているため、自分で簡単にrpmを作れます。
    $ cd ~/rpm/SOURCES
    $ rpmbuild -tb openvpn-2.0.5.tar.gz
  4. 作成したrpmをインストールします。
    $ su
    # rpm -Uvh ../RPMS/i386/openvpn-2.0.5-1.i386.rpm
  5. キー生成スクリプトをインストールします。
    # cp /usr/share/doc/openvpn-2.0.5/easy-rsa/2.0/* /etc/openvpn
  6. サンプル設定ファイルをコピーします。
    # cp /usr/share/doc/openvpn-2.0.5/sample-config-files/server.conf /etc/openvpn

パケット転送の有効化

  1. OpenVPNではパケット転送を有効にしないとうまく機能してくれません。
    次のようにして有効にしましょう。
    # echo 1 > /proc/sys/net/ipv4/ip_forward
    さらに、サーバ再起動時に、自動的にパケット転送が有効になるようにしておきます。 /etc/sysctl.confを編集します。
    # emacs /etc/sysctl.conf
    以下の個所を変更します。
    # Controls IP packet forwarding
    net.ipv4.ip_forward = 1

OpenVPNの各種キーを生成

OpenVPNではOpenSSLで生成したキーを利用して認証/暗号化が可能です。

  1. キー生成の条件を設定します。
    # cd /etc/openvpn
    # emacs vars
    設定するのは最後の数行です。
    これを設定しなくてもいんですが、これ以降、同様の入力を何度もする必要があるために、 ここでまとめて設定てしまったほうが便利かと思います。
    # 国
    export KEY_COUNTRY="JP"
    # 都道府県
    export KEY_PROVINCE="Mie"
    # 町
    export KEY_CITY="Kuwana"
    # 組織名
    export KEY_ORG="tsuttayo.sytes.net"
    # メールアドレス
    export KEY_EMAIL="sg@tsuttayo.sytes.net"
  2. まず、設定値で初期化します。
    # . ./vars
    # ./clean-all
  3. CAを作成します。
    # ./build-ca
    先ほどvarsに設定した内容が表示されるので、そのままEnterしていきます。
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
  4. サーバ・キーを生成します。
    # ./build-key-server server
    先ほどvarsに設定した内容が表示されるので、そのままEnterしていきます。
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
  5. dhキーを生成します。
    # ./build-dh
    これは少し時間がかかります。
  6. クライアント用のキーを生成します。
    ここでは「cl01」などとしていますが、適当に変えてください。キーのファイル名になります。
    # ./build-key cl01
    先ほどvarsに設定した内容が表示されるので、そのままEnterしていきます。
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
    VPN接続するクライアントの台数分、キーを生成します。
    なお、ここで作ったクライアント用ファイルは、各クライアントへ配布する必要があります。

サーバ側の設定

サーバ側の設定ファイル (/etc/openvpn/server.conf)を編集します。以下は設定例です。

# TLSハンドシェイクによる認証を行う
tls-server
 
# ポートの指定
port 1194
 
# UDPによりトンネルさせる
proto udp
 
# TAPデバイスを利用する
dev tap
 
# キーファイルの指定
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
 
# VPNセグメントを指定する。
# このサーバのIPアドレスはxxx.xxx.xxx.1となるので、
# この例では192.168.128.1がこのサーバのIPアドレスとなります。
# このようにserver句を指定すると、自動的にDHCPサーバ機能も有効となるようです。
server 192.168.128.0 255.255.255.0
 
# このサーバのIPアドレスをxxx.xxx.xxx.1以外に設定する場合、
# ifconfigで設定するといいようです。
#ifconfig 192.168.128.55 255.255.255.0
 
# クライアントへ通知するルーティングを定義します。
# 以下では、192.168.0.0/24と192.168.16.0/24へのパケットは
# このOpenVPNサーバへ送られることとなります。
push "route 192.168.0.0 255.255.255.0"
push "route 192.168.16.0 255.255.255.0"
 
# DHCPクライアントとして接続してきたとき、DNSサーバのアドレスを通知します。
# セグメント内にDNSサーバが設置してあるなら、指定すると便利です。
push "dhcp-option DNS 192.168.0.20"
 
# DHCPクライアントとして接続してきたとき、WINSサーバのアドレスを通知します。
# セグメント内にDNSサーバが設置してあるなら、指定すると便利です。
push "dhcp-option WINS 192.168.0.22"
 
# pingを定期的に送信する。
keepalive 10 120
 
# lzo圧縮を有効にする
comp-lzo
 
# OpenVPNデーモンの権限を下げる
user nobody
group nobody
 
# オプションpersisi-*によって,再起動時に,権限を落した
# ことでアクセスできなくなった資源に対するアクセスを避ける
# ことができる.
persist-key
persist-tun
 
# 現在の接続状況をファイルに出力する.この小ファイルは,
# 一分間単位で内容が消されて上書きされる.
status openvpn-status.log
 
# ログファイルの詳細さについて適切なレベルを指定する.
verb 3

OpenVPNサーバの起動

  1. サーバを起動して、エラー表示されないかを確認します。
    # /etc/init.d/openvpn start
    万一、エラーとなったら/var/log/messagesを見てみましょう。
  2. サーバ起動時、OpenVPNサーバを自動起動させます。
    # /sbin/chkconfig openvpn on

ブロードバンド・ルータのnatを変更

この例ではブロードバンド・ルータを経由してVPNが確立されるので、サーバ側LANに設置してあるルータの設定を変える必要があります。

nat設定を変えて、1194ポートのUDPパケットを、OpenVPNをインストールしたLinuxに転送するようにしてください。

これについては、各ルータの説明書を読んでください。 最近のルータであれば、「サーバ公開」といった説明が書かれていることが多いようです。たいていはTCPの80番ポートを例にして書いていますので、 UDPの1194番ポートに読み替えて設定するとうまくいくと思います。


OpenVPNのWindowsクライアントをインストール

ここではGUIもインストールします。

  1. OpenVPN GUI for Windowsの「Download/Stable」からopenvpn-2.0.5-gui-1.0.3-install.exeをダウンロードします。
  2. ダウンロードしたopenvpn-2.0.5-gui-1.0.3-install.exeを実行してインストールします。これは「Next」をクリックしていくだけです。

OpenVPNクライアントの設定

  1. フォルダ「C:\Program Files\OpenVPN\sample-config」の中にclient.ovpnというのがあるので、これを「C:\Program Files\OpenVPN\config」へコピーして利用します。
  2. フォルダ「C:\Program Files\OpenVPN\config」に、サーバ側で作成したキーを保存します。 xxxx.crt, xxxx.keyという2つのファイルが必要です。
  3. 設定ファイルをエディタで編集してください。
    以下に設定サンプルを書きます。
    ##########################################
    #
    # OpenVPN クライアント用設定ファイル
    #
    ##########################################
    
    # TLS認証を利用
    tls-client
    
    
    # OpenVPNサーバのDHCP機能を利用して動的にIPアドレスを取得する場合はpullに設定
    pull
    
    #========= ここからVPNを固定IPアドレスで接続するときの定義 ==========
    #========= 上記で「pull」とする場合は、この部分は不用です =================
    # 固定IPアドレスにする場合は、ここに指定する
    # この例では、このクライアントのIPアドレスが192.168.128.10となります。
    #ifconfig 192.168.128.10 255.255.255.0
    # 固定IPアドレスではクライアント側でルーティングを明示する必要がある。
    #route 192.168.0.0 255.255.255.0 192.168.128.1
    #route 192.168.16.0 255.255.255.0 192.168.128.1
    # 固定IPアドレスの時は、DNSやWINSも明示する
    #dhcp-option DNS 192.168.0.20
    #dhcp-option WINS 192.168.0.22
    #====================================================================
    
    
    # 接続モードを指定
    dev tap
    
    
    # プロトコル指定
    # proto tcp
    proto udp
    
    
    # 接続先サーバとポート番号
    # IPアドレスなどで指定します。
    remote 202.a.b.c 1194
    
    
    # サーバホスト名の名前解決を永遠に試みる
    resolv-retry infinite
    
    
    # 特定なローカルポート番号をバインドしない
    nobind
    
    
    # Downgrade privileges after initialization (non-Windows only)
    ;user nobody
    ;group nobody
    
    
    # 再起動のために状態をいくつか覚えておく.
    persist-key
    persist-tun
    
    
    # HTTPプロキシ経由で本当のOpenVPNサーバに
    # 接続しているなら,プロキシサーバ/IPと
    # ポートをここにおく.プロキシサーバが
    # 認証を要求する場合は,manページを参照.
    ;http-proxy-retry # 接続失敗の場合は再試する
    ;http-proxy [proxy server] [proxy port #]
    
    
    # SSL/TLS parms.
    # See the server config file for more
    # description.	It's best to use
    # a separate .crt/.key file pair
    # for each client.	A single ca
    # file can be used for all clients.
    ca ca.crt
    cert cl01.crt
    key cl01.key
    
    
    # サーバ証明書のnsCertTypeフィールドが"server"に
    # 設定されているか検証する.これは#mitmで考えた
    # 起こり得る攻撃に対し,抵抗策として重要である.
    ns-cert-type server
    
    
    # VPNリンクに対する圧縮を有効にする.
    comp-lzo
    
    
    # ログファイルの詳細度を指定する.
    verb 2
    
    # 重複メッセージを抑制する.
    ;mute 20
    		

設定が完了したら、テストで接続してみましょう。client.ovpnを右クリックすると「Start OpenVPN on the config file」というメニューが表示されるので、これを選択します。

最後に「Initialization Sequence Completed」と表示されれば接続は成功しています。

pingなどで接続テストをしてみます。

また、IPアドレスが正常に受け取られているかを確認するため、コマンドプロンプトで「ipconfig /all」として、DNSなども設定されているかを確認するといいかと思います。
また、コマンドプロンプトで「route print」として、ルーティング情報を確認してみます。

ここまでOKであれば、普通に使えると思います。


参考サイト

上記以外にも、OpenVPNはhttpプロクシ経由など、色々な機能があるようです。 参考サイトも是非、見てみることをお勧めします。

Copyright©2001-2017 釣ったよ! All Right Reserved.    sg@tsuttayo.jpn.org