OpenVPNをインストールしよう

OpenVPNとは
OpenVPNの特徴としては、 1.巷を賑わせたSoftEther同様、最近流行のSSL VPNの一種 2.L2トンネリングであり、Broadcast も転送可能 3.オープンソースソフトウェアであるが、Windowsに対してはインストーラパッケージが用意される等、 とっても親切 # マニュアルは分かりにくくてしゃ〜ないけど 4.Windows版でのインストール/アンインストールには再起動が不要 と、この時点で「その道」の人でないと既に(; ̄▽ ̄)<ハァ? かも。 そこで、も〜バキバキ噛み砕いて説明することにします(正確さは有る程度犠牲にしますた)。 ※ かなりざっくりの説明なんで、テストとかレポートに書かないように( ̄▽ ̄;)<怒られても知らんよ〜 [VPNとは] 「Virtual Private Network」の略。日本では「仮想専用線」なんて訳もあるみたいです。 物理的に離れたネットワーク間で情報のやり取りを行おうとした場合(例えば「東京本社」←→「大阪支社」)、 この二つのネットワークを論理的に繋がなきゃいかんわけです。 でも、例えばLANケーブルをなが〜〜〜〜く這わせて、とかだと設置も運用もわけわからんコストが掛かっ てしまいます。 そこで一昔前から、いわゆる専用線や、ダイアルアップ回線(いわゆる音声電話回線を使ってモデムで データ信号を変復調して通信する)を利用して繋いでいました。 この方式だと途中経路の回線が独占できるんで、安定した通信が出来、情報漏えいもそれなりに防げるので、 実際この方式は現在でも使われている方式です。効果に見合った結構なお金はかかりますけど。 ただ、最近は世界を股にかけた企業間通信なんてのも行われるようになったり、いわゆるSOHOなんかも 出てきちゃって、「安定性を犠牲にしてでもインターネットみたいな安価な公衆回線を利用して接続したい!」 というニーズが出てきました。 でもまあ、そのまま繋いだのではインターネットではグローバルアドレスを持つ機器間でしか通信できないので、 駄目なわけです。 そこで、色々と小細工して専用線みたいなことを、インターネットみたいな事をみんなで利用する回線(公衆回線) で実現しちゃう技術なのです。 # 「小細工」についての解説は、理解するのに激しくネットワークの知識がいるので省きます。 TCP/IPはもちろん、OSI参照層とかethernetの基礎知識も必須になっちまいますので…(;´д`) この辺の知識に興味があればオーム社が出版している「マスタリングTCP/IP」やCiscoの資格であるCCNAを勉強 するといいかもですね〜 [SSLとは] SSLってのは「Secure Socket Layer」の略で、新人SIerの友「e-word」なんかでは小難しい言葉でもって 色々と書かれてますが、よーするに色んなセキュリティ技術(暗号化技術とか安全な鍵交換技術とか)を 突っ込んで、通信の中身を見られたり、騙ってデータを盗んだり、データを書き換えたり、というのを防ぐ 仕組みです。 [SSL VPNとは] てことで、SSL VPNとは中身が見られたりしないよう暗号化しつつ、公衆回線をあたかも専用線のように 利用することが出来るもの、というわけですな。(専門家が見たら怒りそうな説明だなぁ( ̄▽ ̄;) [オープンソース] オープンソースについてはネット上に文献が腐るほどあるので、そっちを参照してくらはい。 [Broadcast(ブロードキャスト)] 簡単に言うと、あるネットワーク区域(ネットワークセグメント)内の全てのPCとかルータとかが受け 取って、何らかの処理(捨てるなり応答するなり)を強要する甚だ迷惑なパケットの事。 その為、これがネットワークにガンガン流れちゃってるとネットワークノード(ネットワークに繋がっ てる機器のこと)の負荷は高くなってしまいます。 ただ、LAN対応ゲームとかでいちいち相手のPCのIPを指定するのが面倒ってんで、これが使われる場合 が未だ多いです。 あと、lmhostを書いてないWindowsPCがドメインコントローラに繋ぐときもブロードキャストを使っ てた…はず(;´д`) 種類としては、2つあってそれぞれこんな感じ。 ・ローカルブロードキャスト あて先IPアドレスが255.255.255.255のもの。ルーティング不可 ・ダイレクトブロードキャスト あて先IPアドレスがネットマスクによって区切られたホストアドレスの全てのビットが1のもの。 ルーティング可(とはいえ、ルータによってはルーティングしない設定がデフォルトになってたりする)。 ※ ちなみにブロードキャストが届く範囲の事を「ブロードキャストドメイン」という。 [Broadcast も転送可能] 従来のVPNであるIPSec と呼ばれる方式では出来なかったのだけど、 このOpenVPN やSoftetherでは出来る為、激しく一部で話題になったのです。 さて、ここからいきなり少々専門的な情報になっちゃいます。 ま〜専門的なネタが分からなくても大丈夫。 「その道」の人でなくても手順を踏めば動くようにはなるはずだし。 ま、後からe-wordとかで勉強してください(ぉ
OpenVPNのインストール
WindowsXPが動くPCでVPN環境を構築します。 ※ 一応公式サイトでもWindows2000で動くことにはなってるけど、後述の理由により、今の ところ上手く動かせてません。 1.OpenVPNの公式サイトからインストーラパッケージをダウンロードしてきます。 ※2005/12/10時点では2.0.5が最新ですな 2.ダウンロードしたファイルをおもむろにダブルクリック実行にてインストールします。 …というのもアレなので、画像使って説明します。(^^; [1] ダウンロードしたインストーラを実行するとこんな画面が出るので[Next>]をクリック [2] agreementが表示されるので[I Agree]をクリック [3] インストールするコンポーネントの選択が表示されるので、下の画面のようにスクロー ルして一番下のsourcecodeを外して[Next>]をクリック [4] インストール場所の選択画面が出るので[Install]をクリック [5] こんな感じでインストールが開始される [6] インストール途中でTAPドライバ(L2トンネリングするための仮想インターフェースの ドライバ)をインストールするか問い合わせてくるので[続行(c)]をクリックしてインス トールする [7] こんな感じでcompletedとでたら[NEXT>]をクリック。 ※ 途中でエラーっぽいのが出るがこれは単に既にOpenVPNがインストールされている場合に TAPと本体をアップデートしようとして出るエラーなので気にしなくてもいい [8] この画面が出ればインストールが無事完了[finish]をクリックして画面を閉じる。 [9] エクスプローラ等でc:\Program Files\openvpn\の下(OpenVPNのインストールフォルダ) にcaというフォルダを作成します
Openssl側の設定
OpenVPNのサーバ+証明書発行機関(CA)サーバとなるPC(別立てでもOK)ではさらに以下の手順でOpensslが 動くように設定します [1] OpenSSLのサイトから最新のソースファイルをダウンロードし、解凍してopenssl.cnfという コンフィグファイルを取り出します [2] [1]で取り出したopenssl.cnfをc:\Program Files\openvpn\ca\にコピーします [3] openssl.cnfを38行目から下記のように書き換えます certs = $dir # Where the issued certs are kept crl_dir = $dir\\crl # Where the issued crl are kept database = $dir\\index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir # default place for new certs. certificate = $dir\\my-ca.crt # The CA certificate serial = $dir\\serial # The current serial number #crlnumber = $dir\\crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir\\crl.pem # The current CRL private_key = $dir\\my-ca.key # The private key RANDFILE = $dir\\.rand # private random number file [4] 環境変数OPENSSL_CONFを設定します。設定値はc:\Program Files\OpenVPN\ca です。 環境変数はマイコンピュータを右クリック→プロパティで詳細設定タブの[環境変数(N)] ボタンで設定できるようになっています [5] c:\Program Files\OpenVPN\caの中に以下の2つのファイルを作成します ・serial メモ帳で01とだけ入力してセーブします(改行しちゃ駄目) ・index.txt これはテキストファイルを新規作成するだけ。中は空。 [6] コマンドプロンプトを開き、カレントディレクトリをc:\Program Files\OpenVPN\caに移動します ※ 下記のコマンドを順に入力します(自信のない人はコピペでもOK) c: cd "\Program Files\OpenVPN\ca" [7] まずはCA自身の証明書(CA証明書)を発行します。下記のコマンドを実行します openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650 ※ この時いくつか質問されるので、下記の説明を参考にしてください Country Name (2 letter code) [AU]:JP →国。日本人なら JP になる State or Province Name (full name) [Some-State]:saitama →都道府県(みたいなもん)。埼玉県民ならsaitama ってとこ Locality Name (eg, city) []:higasimurayama →市とか村とか。自分の住んでいる市でも村でもいれときましょう。 東村山ならhigasimurayama Organization Name (eg, company) [Internet Widgits Pty Ltd]:GRNBBS →機関名。GRNBBSならGRNBBS Organizational Unit Name (eg, section) []:CA →部署名。証明書機関だからCAとか。まあ何でもいい。 Common Name (eg, YOUR name) []:CA →貴方の名前。彼女の名前でも良いが、とりあえず何でもいい。 Email Address []:ca@ca.com →メールアドレス。適当でも良いし、モノホンでも良い。 ※この後の2つの質問は単にenterで良い このとき作成されたmy-ca.crtがCAの証明書でmy-ca.keyがCAの秘密鍵です。 今後、my-ca.crtはOpenVPNのクライアントにもコピーが必要になります。 と、ここまでで証明書を発行する準備が整いました。
証明書を発行する
[1] OpenVPNサーバの証明書(ローカル証明書)を作成します。下記のコマンドを実行します openssl req -nodes -new -keyout server.key -out server.csr ここでもOpenssl側の設定の[7]と同じようなことが聞かれるが、基本的に自由に入力してよい。 ただし、Country NameとState or Province、そしてOrganization Nameは必ずCAと同じものにすること! [2] OpenVPNサーバのローカル証明書に署名をします。 openssl ca -out server.crt -in server.csr コマンド実行後に証明書の内容が表示されて、その後に以下の2つの質問がくるので、どっちもyを入力 Certificate is to be certified until Aug 20 03:54:18 2005 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y ここまでで出来たファイルのうち、server.crtおよびserver.keyが証明書の組です。server.csrは削除してOKです。 [3] Diffie-Hellmanのパラメータ生成(つか1024bitの安全な素数作成)。以下のコマンドを実行します openssl dhparam -out dh1024.pem 1024 このコマンドの実行が終わるには10〜20分程度掛かっちゃうので、暫く放置プレイ。 信onでもやって待ってましょう。 [4] クライアントの証明書を作成します。この作業は[1]、[2]と同様です。コマンド中の*.key、*.csr *.crtの名前がかぶらない様に気をつけてください(前のが消えちゃいます)。 [5] 他にもOpenVPNクライアントが居る場合には、[1]、[2]の作業を繰り返します。 ※ 1クライアントに1証明書が必要です。ファイル名はユーザごとに変えた方が無難です。 ここまでで証明書の準備が出来ました。 各クライアント用のローカル証明書とCA証明書は、各クライアントのc:\Program Files\OpenVPN\ca以下にコピー しておいてください。
TLSモード+クライアント/サーバシステムで動かす
証明書の作成が出来ていれば、もうこのTLSモードでのC/Sシステムは8割方動いたようなものです。 ここでは、残りの2割にあたる仮想ネットワークの設計とコンフィグ設定を行います。 [1] ネットワーク設計 まずどのようなネットワークを構成するかを考えます。 今回は簡単にするため、下記の様な構成にしました。 <実際の論理構成図> 実構成 <VPN内の論理構成図> VPN構成 [2] コンフィグ設計 サンプルやマニュアルを見ながらコンフィグを設計します。 コンフィグ内では#や;がコメント文として扱われ、また、\は\\と2回記述する必要があります。 # 詳細はOpenVPNのマニュアルを参照してください。英語だけどね(;´д`) 今回のコンフィグ設計に当たって下記の前提条件を作成しました 1. TLSサーバ/クライアントモードで設計 2. クライアント間の通信を許可する 3. L2トンネリングを使用する(TAPインターフェイスを使用) 4. TCP over TCP問題を回避するため、UDPモードでポート番号1194で動作させる 5. IPアドレスは個々のクライアントごとに設定する 6. LZO compression(通信経路データ圧縮)を使用する 7. Keep-alive Pingは10秒間隔とする 8. サーバ側はクライアント側実アドレスに関する制限をかけない 9. 暗号形式はAES-128-CBCとする(openvpn --show-ciphersで使用できる暗号化形式の一覧が見れます) 10. Serverの証明書はserver.crtで秘密鍵はserver.keyである 11. Client1の証明書はclient1.crtで秘密鍵はclient1.keyである 12. Client2の証明書はclient2.crtで秘密鍵はclient2.keyである 13. CA証明書はmy-ca.crtである これらの前提条件を満たすべく私がコンフィグを記述したら下記のようなコンフィグと なりました。 Server 側 Client1 側 Client2 側 作成したコンフィグはC:\Program Files\OpenVPN\config\以下に*.ovpnとして保存します。 # *は英数字であればなんでもいいです(例: server.ovpn)
動作テスト
動作テストはコンフィグファイルを右クリックし「Start OpenVPN on this Config file」をクリックします。 これで下図のようなコマンドプロンプトが立ち上がり、起動時のログが表示されます。 特にエラーが発生していないことを確認してください。 ※ クライアント側ではVPNが正常に繋がると、ログの最後に「Initialization Sequence Completed」という メッセージが表示されます。 コンフィグ設計時の前提条件にあう動作をしているか各種コマンドにて確認してください。 正しく動かない場合は、ネットワーク設計やマニュアル等を確認して調査する必要があります。 接続を確認したらログが表示されているコマンドプロンプトにフォーカスを与え、ファンクションキーのF4を 押します。これでVPNが切断されます。 今後VPNを繋ぎたい場合には、サービスに「OpenVPN Service」というのがあるので、こちらを起動するようにします。 # でも自動で動作するように設定するのはお勧めしません
Windows2000 Local Broadcast問題
※ ちょっと難しい話です。分かる人が限られちゃうと思いますがご容赦ください。 Windows2000では、複数のインターフェイスがある場合、 「IPアドレスを持っているインターフェースのバインド順で一番最初にバインドされたインターフェースのアドレスを、 ローカルブロードキャストのソースアドレスとして使用する」 という、甚だ迷惑な仕様があるようです。 少し考えれば分かるように、これは時に通信不能を引き起こします。 しかし、インターフェースのバインド順はOSのハードウェア認識順であり、変更は物理的構成を変更しない限り不可能。 つまり、物理的デバイスを持たないOpenVPNのインターフェースのアドレスがローカルブロードキャストのアドレスになる 可能性は、かなり低い。 現在のところ、私はこう考えています。 この問題については現在も調査中です。 ひょっとしたらOpenVPN側で何とかなるかもしれないし、またはWindows2000起動後にローカルブロードキャスト のソースアドレスが変更できるかもしれないし。 もし、情報をお持ちの方がいらっしゃれば、是非とも情報提供をメールまたは掲示板にてお願いいたします。m(_ _)m
OpenVPN 2.0.5リリース(2005/12/10 追記)
最近、様々なセキュリティホールなんぞを修正したバージョン2.0.5がリリースされました。 IANAにポート番号も承認されたらしく、今までUDP/5000(UDPの5000番)だったのが、UDP/1194 に変更されています。 ※ 折角IANAに承認されたので、このポート番号を使ってあげたいですね また、keepalive の設定も変更されました。 以前は「ping 10」てな形で指定していた物が、「keepalive 10 120」のように設定しないと、バッチリエラー になります。(;´д`) Openvpn2.0betaからopenvpn2.0.5へのアップデートは単にopenvpnのインストーラを実行して起動するだけで OKなんですが、コンフィグの一部修正と、ポート番号の変更に気をつけてください。 なお、ポート番号だけなら、コンフィグ上で「port 5000」と書くことで、以前のポート番号も使えます。
OpenVPN 2.0.9リリース(2006/10/07 追記:2006/11/05 修正)
最近、OpenSSLにRSA鍵に絡む脆弱性が発見されています。 このページで紹介している方法は、RSA鍵を利用する方法ですので、ひょ〜〜〜っとしたら影響が出るかも 知れません。 # 影響が出る条件が微妙なので、正直実際影響が出るかは謎ですけどね 本バージョンはこのOpenSSLの脆弱性に対応したバージョンとの事です。 他に、Windows Vista(まだβ版ですが)で発生するTAPの不具合も修正されているようです。 何にせよ、今回はバージョンアップする必要があります。 あと、普段OpenVPNを使ってない人(私もだけど(^^;)はお忘れかと思いますが、そろそろクライアントの証明書 の有効期限が切れるころじゃないでしょうか。 再発行の際はコンフィグを書き換えるのもタルいですので、同じ名前で再発行しましょう。 なお、また1年で証明書の有効期限が切れるのがヤダという人は、openssl.cnfの68行目にある default_days = 365 # how long to certify for の数字(365)が、有効期間(日)になっていますので、ここを修正しましょう。 ただし、セキュリティ的には1年毎に再発行することをオススメします。
OpenVPNで複数のVPNを同時に接続する(2015/10/3追記)
なんだか5年前(ぇ)の知恵袋に「できません」的な嘘回答があったので、備忘録も兼ねてWindows7でTAPを使う場合のやり方を書いておきます。 ※やり方は他のWindowsでもほぼ同じはず。 ※TUN(L3)の場合、特に気にしなくても接続できるはず…はず… [1]TAPのインターフェース(TAP-Windows Adapter V9って奴)を追加 TAPを使う場合、OpenVPNはこのTAPのインターフェースをVPN1セッションにつき1つ消費します。 故に、複数接続したい場合は、「接続したい数=OSにインストールされたTAPインターフェース数」とならなければいけません。 ※ちなみに、どのVPNでどのTAPを使うという指定は無理っぽく、確立した順番だけみたいですね。未検証ですが。 以下の手順を、一通りOpenVPNのインストールが終わっている前提で進めてください。 (1)コントロールパネル、またはコンピュータのプロパティから、デバイスマネージャーを開きます。 (2)ネットワーク アダプターを展開します。 (3)デバイスマネージャーのメニューで、「操作(A)」→「レガシ ハードウェアの追加(L)」をクリックします。 (4)「次へ」をクリックします。 (5)「一覧から選択したハードウェアをインストールする(詳細)(M)」のラジオボタンをクリックし、「次へ」をクリックします。 (6)「共通ハードウェアの種類(H):」の中の「ネットワーク アダプター」をクリックして反転させ、「次へ」をクリックします。 (7)1〜2分ほど待つと(環境によってはもっと早いかも)機器の一覧が出てきますので、「製造元」欄の「TAP-Windows Provider V9」を クリックし、「ネットワーク アダプター」の「TAP-Windows Adapter V9」をクリックして、「次へ」をクリックします。 (8)「次へ」をクリックします。 (9)インストールが始まり、正常に完了すると「ハードウェア追加ウィザードの完了」が表示されるので、「完了」をクリックします。 (10)「ネットワーク アダプター」に新しく「TAP-Windows Adapter V9 #連番の数字」が追加されていることを確認します。 [2]OpenVPNのコンフィグを修正 コンフィグで「dev tap」とインターフェースを指定しているところを、各コンフィグごとに 「dev tap0」 「dev tap1」 という形で連番に変更します。 基本これで終わりなのですが、条件不明ながら環境によってはComponentId、MatchingDeviceIdがOpenVPNインストール時に セットアップされたTAPと変わってしまい、うまく動作しないことがあります。 その場合は以下の手順を追加します。 [3](必要時のみ)追加したTAPデバイスのComponentId、MatchingDeviceIdを変更 以下の手順はレジストリを弄りますので、不適切な操作をするとPCが動かなくなる場合があります。 当然ながら自己責任でどうぞ。 (1)デバイスマネージャーで元々あった(OpenVPNのインストーラが入れてくれた)TAPデバイスを右クリックします。 (2)「詳細」タブをクリックし、「プロパティ(P)」のプルダウンメニューから「ドライバー キー」を選択します。 (3)「値」に表示されている値をメモしておきます(右クリックでコンテキストメニューを出してコピーしても可。 (4)デバイスマネージャーで追加したTAPデバイスを右クリックします。 (5)「詳細」タブをクリックし、「プロパティ(P)」のプルダウンメニューから「ドライバー キー」を選択します。 (6)「値」に表示されている値をメモしておきます(右クリックでコンテキストメニューを出してコピーしても可。 (7)レジストリエディターを開き、以下のパスを開きます。 \HLEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\元々あったTAPのドライバー キー ※2016/4/11修正:ControlSet001の後にControlが抜けてましたorz (8)ComponentId、MatchingDeviceIdをみて、メモを取ります。 (9)レジストリエディターで、以下のパスを開きます。 \HLEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\新しく追加したTAPのドライバー キー ※2016/4/11修正:ControlSet001の後にControlが抜けてましたorz (10)たぶん、ComponentId、MatchingDeviceIdが(8)でメモを取った値と異なっているので、同じ値に修正します。 (11)PCを再起動します。 以上の手順で複数VPNが同時に接続できるはずです。

indexに戻る
2004/8/30