2009-07-24

OpenVPN で自宅のネットワークに接続する

VPN を使ったネットワーク構成

以前PPTP を使った VPN の構築なんて言うことをやっていたのだが、PPTP ってそのままではパケット暗号化されていないので、暗号化もできる を導入してみることにした。 かなり手こずった。


後で調べていたら、 なるものがあった。 英語だが、こっちのほうが参考になるかも。


今回使ったのは、OpenVPNのサーバを Ubuntu 9.04 で、クライアントは Windows XP という具合。 しかもOpenVPNのサーバがNATルータの内側にいるという、これまた困った状況ではありますが。



インストール


ソフトウェアのインストールですが、Ubuntu では apt-get で openvpn のパッケージをインストールします。 また今回は Ethernetブリッジを用いるため bridge-utils も一緒にインストールしています。


 sudo apt-get update
sudo apt-get install openvpn bridge-utils

 Windows側には openvpn-gui をインストールしました。からダウンロードしてインストールできます。


IPルーティングトンネルとEthernet トンネル


OpenVPN でサポートされているトンネリングの方法では、IPルーティングによるトンネルと、Ethernetのトンネリングがある。 IPルーティングの場合は、VPNサーバの中で経路情報などを持ってトンネルに向かってパケットを投げたりするようだ。 Ethernet トンネルの場合は、接続している Ethernet とのトンネルを開けるようだ。 今回は Ethernet トンネルを使ってみた。


非対称鍵による認証


OpenVPN では OpenSSL などで作成した非対称鍵による認証を行っている。 クライアントとサーバでは別々の非対称鍵を設定し、それらの認証 (Certification) が同じ鍵によって行われており、認証に利用した鍵が一致する場合、接続を許可するという具合になっている。 PPTPだとPPPと同じように ID + パスワードの認証なのだが、OpenVPN では鍵認証になる。 また ssh と違うところとしては、ssh では接続してくる非対称鍵の公開鍵を接続先サーバに登録し、それに対する秘密鍵で接続してきたクライアントを認証するようになっている。 OpenVPNでは、自分のところで認証のとれた公開鍵を認証するという具合になっている。


非対称鍵の作成はディレクトリ /usr/share/doc/openvpn/examples/easy-rsa/2.0 の中にあるスクリプトを用いて実行する。 まずは esay-rsa に渡す変数を、vars というファイルに記述する。 vars の中では、これらの部分を変更しておく。


export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Setagaya"
export KEY_ORG="masaru.org"
export KEY_EMAIL="info@masaru.org"

あとは下記の手順で CA (認証局)、サーバ、クライアントの鍵を作成する。



sudo -s
source vars
./clean-all
./build-dh
./build-ca
# サーバの鍵を作成 : 鍵の名前は "server"
./build-key server

# クライアントの鍵を作成 : 鍵の名前は "client1"
# クライアントの数だけ、鍵の名前を変更しながら作成。
./build-key client1

上記の操作で、ディレクトリ /usr/share/doc/openvpn/examples/easy-rsa/2.0/keysの中に鍵ファイルが作成されます。 鍵ファイルは、サーバ・クライアントに必要なものを配置します。


サーバには、下記のファイルをディレクトリ /etc/openvpn/keys にコピーしました。


ca.crt
dh1024.pem
server.crt
server.csr
server.key

クライアント (Windows)側には、これらのファイルをコピーしておきます。


ca.crt
client1.crt
client3.key

サーバ側の設定


サーバ側の設定は、openvpn そのものの設定と、Ethernet のブリッジ設定が必要になります。


openvpn の設定は /etc/openvpn/server.conf が設定ファイルとなります。 およそこのような内容を書きました。


# 今回は TCP を使ってみました。 たぶんUDPでも動きます。
proto tcp-server

# デバイスのインターフェースは tap0 を使っています
dev tap0

# 鍵ファイル類の設定
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem

# サーバブリッジの設定
# 192.168.3.16 はサーバのIPアドレス
# 192.168.3.209 から 192.168.3.225 の範囲でIPアドレスを割り振り、
# ネットマスクは /24 ( 255.255.255.0 )
server-bridge 192.168.3.16 255.255.255.0 192.168.3.209 192.168.3.225

# 経路の設定
# 192.168.3.0/24 をクライアントに追加する。
route 192.168.3.0 255.255.255.0

# TLS-Server にする
tls-server

# 圧縮を有効にする
comp-lzo

次に Ethernet ブリッジの設定を行います。 EthernetブリッジはOS起動時から使いたいので、/etc/network/interfacesの設定ファイルに下記のように記述しました。


auto br0
# br0 : bridge のインターフェースにIPアドレスを割り当てる
iface br0 inet static
address 192.168.3.16
gateway 192.168.3.1
netmask 255.255.255.0
# bridge に eth0 と tap0 を追加する
bridge_ports eth0 tap0
iface eth0 inet manual
iface tap0 inet manual

今回の設定を行うと、いままでeth0でホスト外とIPの通信を行っていたかと思いますが、仮想デバイスのbr0からIP通信をおこなうようになります。また、br0を使うには bridge-utils が必要になります。 /usr/sbin/brctlがあるかどうか確認しておいてください。 ない状態で設定すると、サーバにIPv4アドレスが設定できず、SSHとか全部とまります。


ネットワークの設定が終わったら、ネットワークの再設定と openvpn の起動をしてください。


sudo /etc/init.d/network restart
sudo /etc/init.d/openvpn restart

Windows 側の設定


まずはサーバ側で作成した鍵のファイルを C:Program FilesOpenVPNconfig に配置しました。 あとは設定ファイルの編集です。 設定ファイルは C:Program FilesOpenVPNconfigclient.ovpn というファイルになります。 これをテキストエディタで編集します。 設定は、OpenVPN GUI のプログラムが、スタートバーのアイコンの中にありますので、そいつを右クリックして「Edit Config」をクリックしても開けます。 内容は下記の通り。


# クライアントモード
client

# デバイスのモード : tap
dev tap

# デバイス名 : tap0
# ネットワーク接続内にあるTAPのインターフェース名と同じ名前を指定してください。
dev-node tap0

# 利用するプロトコル。 今回はTCPを使っています。
proto tcp

# OpenVPN サーバのホスト名かIPアドレスとポート
# Dynamic DNS を使っている場合は、そのホスト名を設定すると便利。
remote hogehoge.hogehoge.jp 1194

# 鍵ファイルの設定:コピーしたものをフルパスで指定
# Windows のパス区切り文字「」は「\」と2つ書くこと。
ca "C:\Program Files\OpenVPN\config\ca.crt"
cert "C:\Program Files\OpenVPN\config\client1.crt"
key "C:\Program Files\OpenVPN\config\client1.key"

Windows のネットワーク接続ネットワークインターフェース名ですが、Windowsのネットワーク接続内にあるインターフェース名を指定します。 そのままだと「ローカル接続 1」とか担っているかと思うのですが、ファイル内容のエンコードとかの事情で日本語が使われていると面倒なので、英数字で tap0 としました。



ルータの設定


ルータの設定

今回の構築では、OpenVPNサーバをホームゲートウェイ(ルータ)の内側に配置しています。 内側に配置しているため、ルータのポートマッピングの設定が必要になります。 OpenVPNのサーバへTCPとUDPのポート1194への接続を転送するようにしています。


写真の例は、うちにあるNECアクセステクニカさんのルータの設定画面で、IPアドレス 192.168.3.16 が OpenVPN サーバのIPアドレスになります。



現状残っている問題点


現状だとサーバ側の openvpn のリスタート ( sudo /etc/init.d/openvpn restart ) を実行すると、インターフェース tap0 がブリッジから外れて、tap0をifconfig で見ると down となってしまう。 どっかに何かしらのスクリプトを設定しないとダメなのかな。 とりあえず現状では openvpn の restart をかましたときに、下記のコマンドをたたいています。


sudo ifconfig tap0 up
sudo brctl br0 tap0

以上!


あとは、WindowsのOpenVPN GUI から Connect とか実行してみてください。 以上です。 よいネットワーク環境を!


0 件のコメント:

コメントを投稿