- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

Ubuntu/OpenVPN

はじめに Edit

OpenVPNサーバーをローカルのVirtualBoxに入れてみて、まずはOpenVPN試してみる試み。
いきなり稼働中のサーバーに入れるのは不安なので。

現在導入お試し中に付き、記述が中途になってます。ご注意ください

想定環境 Edit

  • Oracle VM VirtualBox ver 3.2.4(with Portable-VirtualBox)
  • ホストOS Windows XP SP3, NATでつないでる(サブネットA)
  • ゲストOS Ubuntu 8.04 LTS, ホストOS上にNATでつなぐ
    (not ブリッジ, つまり サブネットAでもなく、ホスト内の仮想マシン上だけのローカルネット)
  • LAN内マシンUbuntu 8.04マシン(サブネットA)

すごい紛らわしいですね…

目標 Edit

openvpn_server_on_local_virtualbox.png
  • ゲストOSにOpenVPNサーバーとhttpサーバー(apache)とsshサーバーを立てる
  • ホストOS&LAN内マシンにOpenVPNクライアントを入れる
  • ホストOS&LAN内マシン→ゲストOSでhttpサーバーにアクセスできればOK
  • 同様にsshも確認

※ VirtualBox仮想マシン内のNATでOpenVPNサーバー立てるってのがそもそもありなのかというアレがあります( ´д`)

BridgeモードでのOpenVPNインストールと設定 Edit

Ubuntuの公式ドキュメント を参考にOpenVPNを入れてみます。

インストール Edit

まずはインストール

sudo apt-get install openvpn bridge-utils

ネットワーク設定の編集 Edit

次にネットワーク設定を変更するために /etc/network/interfaces を編集します。

※注意:デスクトップ版だと /etc/network/interfaces を直接編集しても有効にならないので、
NetwokManagerの「ローミングモード」を切って置く必要があります。

# server版つかっていてデスクトップ版使おうとすると、 /etc/network/interfaces にdhcpの設定すらなく、最初、面食らいました

「ローミングモード」無効にするには、
「システム」→「システム管理」→「ネットワーク」の各種デバイスで「ローミングモードを有効にする」チェックボックスを外し、
dhcpに設定すれば良いです。

参考:Hardyで静的アドレスを設定する - ubuntu日記

さて、/etc/network/interfaces を編集に戻ります。
上記ようにdhcpに設定した状態で

cat /etc/network/interfaces

してみると、下記のような感じになっているかと思います。

auto lo
iface lo inet loopback

iface eth1 inet dhcp
auto eth1

上記の設定の意味:

  • "eth1"はネットワークインターフェース名で環境によっては違うかもしれない(eth0とか)
  • "auto lo" と "auto eth1" で自動的に "lo" と "eth1" を有効化
  • "lo" をループバックデバイスとして設定(127.0.0.1で自ホストを返すアレ)
  • "eth1" を dhcpにて動的にIP取得などしてつなぐ

以下のように変更してみます。
(Ubuntu公式のドキュメントだと eth0でしたが、こちらの環境の設定に合わせて eth1になっているので注意)

$ sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
  bridge_ports eth1
  bridge_fd 9      ## from the libvirt docs (forward delay time)
  bridge_hello 2   ## from the libvirt docs (hello time)
  bridge_maxage 12 ## from the libvirt docs (maximum message age)
  bridge_stp off   ## from the libvirt docs (spanning tree protocol)

iface eth1 inet manual
  up ifconfig $IFACE 0.0.0.0 up
  up ip link set $IFACE promisc on
  down ip link set $IFACE promisc off
  down ifconfig $IFACE down
  • "lo"は前と一緒でループバック
  • "br0"をdhcpに指定
    • "bridge_ports eth0": eth0をブリッジで接続
    • "bridge_fd 9": forward delay, リスニング、ラーニングの時間(秒)
      (以下、bridge_〜 は仮想マシン用として指定してある。この辺かなり理解不足に付き注意!!
      Ubuntu公式ドキュメントにはlibvertドキュメント由来とあるけど見つけられず)
    • "bridge_hello 2": helloパケット送信間隔(秒)
    • "bridge_maxage 12": ?
    • "bridge_stp off": STP(スパニングツリープロトコル)をOFFる(man brctlのstpのところも参照)
  • "eth1"にて
    • eht1がONされた直後("up"="post-up")に行う処理
      • "ifconfig $IFACE 0.0.0.0 up": インターフェースを有効化。$IFACEはこの場合"eth1"ね
      • "ip link set $IFACE promisc on": プロミスキャス(promiscuous)モード(来たパケット全部受けるモード)を有効化
    • eth1がOFFられる直前("down"="pre-down")
      • "down ip link set $IFACE promisc off": プロミスキャス(promiscuous)モードを切る
      • "ifconfig $IFACE down": インターフェースを無効化

この辺の詳細は以下も読むことをオススメ(Ubuntu 8.04用のドキュメントなので環境に合わせて右上のタブでバージョン選択してください)

※ bridge_ports以外のbridge_〜〜についてはこの指定だと実際にどうメリットがあってデメリットがあるのか見えてこない。うーん。

設定したら、ネットワークをリスタートします。

$ sudo /etc/init.d/networking restart

サーバー用の証明書と鍵などの作成

サンプルの証明書を元に作成してみます。

まずは、サンプルをコピーしてきます。

$ sudo mkdir /etc/openvpn/easy-rsa/ 
$ sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/ 

編集します。

$ sudo vim /etc/openvpn/easy-rsa/vars

以下の部分を自分の環境に合わせて変更します。

export KEY_COUNTRY="JP"
export KEY_PROVINCE="TOYAMA"
export KEY_CITY="TOYAMA"
export KEY_ORG="example.com"
export KEY_EMAIL="fuck_me@example.com"

各項目は以下のような感じで。

  • KEY_COUNTRY:国名。日本なのでJPにしました。
  • KEY_PROVINCE:都道府県名あたり
  • KEY_CITY:市町村あたり
  • KEY_ORG:組織名。ここではドメイン名にしておきました
  • KEY_EMAIL:管理者のe-mailアドレス

さて以下のようにして認証局と証明書の準備をします。

cd /etc/openvpn/easy-rsa/ ## move to the easy-rsa directory
sudo chown -R root:admin .  ## make this directory writable by the system administrators
sudo chmod g+w . ## make this directory writable by the system administrators
source ./vars ## execute your new vars file
./clean-all  ## Setup the easy-rsa directory (Deletes all keys)
./build-dh  ## takes a while consider backgrounding
./pkitool --initca ## creates ca cert and key
./pkitool --server server ## creates a server cert and key
cd keys
openvpn --genkey --secret ta.key  ## Build a TLS key
sudo cp server.crt server.key ca.crt dh1024.pem ta.key ../../

簡単な説明

  • cd /etc/openvpn/easy-rsa/ :上でコピーしたディレクトリに移動
  • sudo chown -R root:admin . :(以下の実行尾楽にするために)adminグループにする
  • sudo chmod g+w : adminグループでディレクトリ以下に書き込み権限を与える
  • source ./vars : 設定を読み込み
  • ./clean-all :初期化
  • ./build-dh : DH(Diffie Hellman)パラメータ(dh1024.pem)を生成
  • ./pkitool --initca 認証局(CA)の証明書(ca.crt)と鍵(ca.key)の生成
  • ./pkitool --server server :"server"という名前(なんとかserverみたいな適当な名前つける)でサーバー証明書(server.crt)と鍵の生成(server.key)
  • cd keys : キーを生成したディレクトリに移動
  • openvpn --genkey --secret ta.key : TLS証明鍵の生成(ta.key)
  • sudo cp server.crt server.key ca.crt dh1024.pem ta.key ../../ :必要なファイルを /etc/openvpn にコピる

※build-dhあたりは少し時間かかります

サーバー用の設定を記述する Edit

openvpnサーバーの設定用ファイルを /etc/openvpn/server.conf として作りたいのですが、その前に
openvpnサーバー起動用/終了用のスクリプトを /etc/openvpn/up.sh と /etc/openvpn/down.sh に作成しておきます。

$ sudo vim /etc/openvpn/up.sh

以下を記述

#!/bin/sh

BR=$1
DEV=$2
MTU=$3
/sbin/ifconfig $DEV mtu $MTU promisc up
/usr/sbin/brctl addif $BR $DEV
$ sudo vim /etc/openvpn/down.sh

以下を記述

#!/bin/sh

BR=$1
DEV=$2

/usr/sbin/brctl delif $BR $DEV
/sbin/ifconfig $DEV down

上記ファイルに実行権限を付加しておきます

sudo chmod +x /etc/openvpn/up.sh /etc/openvpn/down.sh

さて、設定ファイルの server.conf を書きます。

sudo vim /etc/openvpn/server.conf

以下例:

mode server
tls-server

#local <your ip address> ## ip/hostname of server
port 1194 ## default openvpn port
proto udp

#bridging directive
dev tap0 ## If you need multiple tap devices, add them here
up "/etc/openvpn/up.sh br0"
down "/etc/openvpn/down.sh br0"
 
persist-key
persist-tun

#certificates and encryption
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh1024.pem
tls-auth ta.key 0 # This file is secret

cipher BF-CBC        # Blowfish (default)
comp-lzo

#DHCP Information
ifconfig-pool-persist ipp.txt

server-bridge 10.0.2.15 255.255.255.0 10.0.2.100 10.0.2.150
#push "dhcp-option DNS your.dns.ip.here"
#push "dhcp-option DOMAIN example.com"
max-clients 10 ## set this to the max number of clients that should be connected at a time

#log and security
user nobody
group nogroup
keepalive 10 120
status openvpn-status.log
verb 3

以下注意点:

server-bridge の設定ではVPNを利用しようとつないできたマシンのDHCP用の設定をします。
書式は以下のような感じ。

server-bridge (サーバーのIPアドレス) (サブネットマスク) (VPNのDHCPで割り振る開始IP) (VPNのDHCPで割り振る終了IP)

ここでVPNサーバーのIPを入れるところがあります。今の場合、ゲストOSのIPですね。
ただ、ここではゲストOSはdhcp接続なのでifconfigを元に書きます
(仮想マシン上とはいえ、本来は固定IPにすべきだよなーと思うけど)

$ ifconfig br0
br0       Link encap:イーサネット  ハードウェアアドレス xx:xx:xx:xx:xx:xx  
          inetアドレス:10.0.2.15  ブロードキャスト:10.0.2.255  マスク:255.255.255.0
:(略)

  • VPNサーバーのIP: 10.0.2.15
  • ネットマスク: 255.255.255.0
  • 割り当てる範囲は、10.0.2.100〜10.0.2.150 にしてみる
    (今は仮想環境のNAT上で他にマシンがないので適当でいいですが、
    実際の環境ではちゃんとネットワーク管理者に利用許可を得ていて、空いているIPの範囲を選びます(ようは勝手に使うとトラブる))

#pre{
server-bridge 10.0.2.15 255.255.255.0 10.0.2.100 10.0.2.150
}}

OpenVPNをリスタートします。

sudo /etc/init.d/openvpn restart

ゲストOSでの確認 Edit

ifconfigで br0 と eth1 が立ち上がっているか確認

$ ifconfig 
br0       Link encap:イーサネット  ハードウェアアドレス xx:xx:xx:xx:xx:xx
          inetアドレス:10.0.xx.xx  ブロードキャスト:10.0.xx.255  マスク:255.255.255.0
 :(略)

eth1      Link encap:イーサネット  ハードウェアアドレス xx:xx:xx:xx:xx:xx
 :(略)
lo        Link encap:ローカルループバック  
 :(略)

curlで外部のwebにアクセスできるか確認

$ curl example.com
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
  <META http-equiv="Content-Type" content="text/html; charset=utf-8">
  <TITLE>Example Web Page</TITLE>
</HEAD> 
<body>  
<p>You have reached this web page by typing &quot;example.com&quot;,
&quot;example.net&quot;,
  or &quot;example.org&quot; into your web browser.</p>
<p>These domain names are reserved for use in documentation and are not available 
  for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 
  2606</a>, Section 3.</p>
</BODY>
</HTML>

OK。外へはつながっているみたいです。

digとかnslookupだとレスポンス返ってこない?あれ???
→digとnslookupの書式間違ってた orz ちゃんと通りますね
(webブラウザでホスト名でアクセスできるのにnslookupとかで名前引けない!?かと一瞬思って怖い)

ポートフォワードの設定 Edit

Ubuntu/VirtualBox/NAT接続でもポートフォワードでゲストOSに接続する方法 を参考にして
ポートフォワードでホストOSからゲストOSのVPNサーバーにつながるように設定しておいて下さい。
(このままだと、ゲストOSのVPNサーバーにはつなげません)

実際にはゲストOSを終了しておいて、
ホストOSのコマンドラインにて以下のようなコマンドでポートフォワードの設定をします。
(Ubuntu/VirtualBox/NAT接続でもポートフォワードでゲストOSに接続する方法 でも書きましたが、この辺、VirtualBoxのバージョンによって違うので注意してください)

VBoxManage modifyvm "(仮想マシン名)" --natpf<数字> "guestvpn,udp,,(転送先のホストOS側のポート),,(server.confで設定したゲストOSのVPNサーバーのポート)"

具体例:

  • 仮想マシン名:"Ubuntu 8.04LTS"
  • <数字>:ポートフォワード設定番号。もし、この仮想マシンでまだ他にポートフォワード設定してないなら --natpf1でよい。
    してことがあるなら、空いている番号を指定。
  • guestvpn:ポートフォワードの設定名
  • ゲストOSのVPNサーバーのポート(server.confで設定したもの):1194
  • ホストOSの転送先ポート(任意):51194
  • 設定名(任意、他のポートフォワード設定とかぶらないもの):guestvpn

の場合、

VBoxManage modifyvm "Ubuntu 8.04LTS" --natpf1 "guestvpn,udp,,51194,,1194"

になります。

※もし"VBoxManage modifyvm"の設定を間違えた場合は、再度上記を実行しても上書きされないようなので、

VBoxManage modifyvm "Ubuntu 8.04LTS" --natpf1 delete "guestvpn"

のようにして delete と 仮想マシン名を指定して削除した後再設定してください。

詳細はやはり Ubuntu/VirtualBox/NAT接続でもポートフォワードでゲストOSに接続する方法 を参考に。

ホストOSのWindowsからOpenVPNクライアントで繋いでみる Edit

OpenVPN Downloads から Windows Installerをダウンロードしてきます。
Portable派の方は OpenVPN Portable | Download OpenVPN Portable software for free at SourceForge.net の方を。

こちらでは OpenVPN Portable 1.6.6(OpenVPN 2.1.1バージョン確認中)を利用しました。

クライアント用の証明書とキーの作成 Edit

おっとその前に、クライアント用の証明書とキーを作成しておきます。

仮想マシンのVPNサーバー側にログインして、

$ cd /etc/openvpn/easy-rsa/ # VPNサーバーのeasy-rsaディレクトリに移動
$ source ./vars             # 初期設定をする
$ ./pkitool --pass my_win_client   # my_win_clientという名前(他のクライアントとかぶらないようにする)
                                 # でクライアント用証明書とキーをパスワードつきで作成
: (略)
writing new private key to 'my_win_client.key'
Enter PEM pass phrase:              # ←パスフレーズを入力
Verifying - Enter PEM pass phrase:  # ←パスフレーズを再入力
-----
: (署名の確認等)

あとは、以下の /etc/openvpn/easy-rsa/keys/ 内のファイルを安全にクライアントマシンにコピー(scpやsftpを使うなど)します。

  • my_win_client.crt : クライアント用証明書 (./pkitool --pass my_win_clientで生成したファイル)
  • my_win_client.key : クライアント要鍵(同上)
  • ca.crt : ルート証明書(サーバーの設定の時に生成したファイル)
  • ta.key : tls-authの共有静的鍵(サーバーの設定の時に生成したファイル)

コピー先は、

  • Windows版Portable OpenVPNの場合は、 "(OpenVPNPortableのディレクトリ)\data\config"
  • Windows版OpenVPN GUIの場合は "C:\Program Files\OpenVPN\config" (かな? Vista以降でUAC ONの場合どうするか未確認)

でOK。

今回のようなローカルのVirtualBoxの環境からコピー場合は、 Ubuntu/VirtualBox/共有フォルダ周り のように共有フォルダ経由でコピーしてもよいかと思います。

クライアント用の設定ファイルを書く Edit

  • Windows版Portable OpenVPNの場合は、 "(OpenVPNPortableのディレクトリ)\data\config"

に my_win_client.crt を作り以下のようなVPNのクライアント用の設定を書きます。


[TODO]: OpenVPN サーバー設定 クライアントの設定の途中

うまくいかない… ポートフォワードのプロトコルのミスでした(TCP→UDPにしたら行けた)

TODO:

  • クライアント用の証明書と鍵を作成
  • クライアント側Windowsで試すために設定ファイルを作成
  • (途中)クライアント側Windowsで試す
  • 別マシンのクライアント(Ubuntu)で同様に証明書と鍵作成、設定ファイル書いて試す

証明書や鍵ファイルの扱い Edit

生成した証明書や鍵など一部のファイルは秘密にしておかなくてはなりません

パスワードはもちろんですが、秘密にしておく必要のあるファイルはsshの秘密鍵のように「暗号化なしで(改ざんされる可能性ある)通信経路を使って転送しない」「原則他人に渡さない」「誰でもアクセスできる場所におかない」等が必要になってきます
(この辺の細かいところは突っ込みあり)

ファイル名必要となる利用者内容秘密にすべきファイルか?備考
ca.crtサーバーと全クライアントに必要ルート証明書秘密でなくてもよい./pkitool --initca で生成したもの
ca.key署名するマシンのみに必要ルートCA鍵要秘密!!./pkitool --initca 生成したもの
dh{n}.pemサーバーのみ必要Diffie-Hellmanパラメータ(日本語)秘密でなくてもよい./build-dh で生成したもの
server.crtサーバーのみ必要サーバーの証明書秘密でなくてもよい./pkitool --server server で生成したもの
server.keyサーバーのみ必要サーバーの鍵要秘密!!./pkitool --server server で生成したもの
ta.keyサーバーとすべてのクライアントに必要tls-authの共有静的鍵要秘密!!openvpn --genkey --secret ta.keyで生成
(セキュアにするためのtls-auth用)
my_win_client.crtクライアントのみ必要クライアントmy_win_clientの証明書秘密でなくてもよい./pkitool --pass my_win_client で生成したもの
my_win_client.keyクライアントのみ必要クライアントmy_win_clientの鍵要秘密!!
client1.crtその他 クライアントその1にのみ必要クライアントその1の証明書秘密でなくてもよい./pkitool --pass client1 で生成したもの
client1.keyその他 クライアントその1にのみ必要クライアントその1の鍵要秘密!!
client2.crtその他 クライアントその2にのみ必要クライアントその2の証明書秘密でなくてもよい./pkitool --pass client2 で生成したもの
client2.keyその他 クライアントその2にのみ必要クライアントその2の鍵要秘密!!
client3.crtその他 クライアントその3にのみ必要クライアントその3の証明書秘密でなくてもよい./pkitool --pass client3 で生成したもの
client3.keyその他 クライアントその3にのみ必要クライアントその3の鍵要秘密!!

参照:KeyFiles - HOWTO

参考サイト Edit


No comment. Comments/Ubuntu/OpenVPN/ローカルのVirtualBoxにインストールして試してみる?

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2010-07-05 Mon 19:44:15 JST (2692d)