酒飲んで、車いじって、トロンボーン吹いて、寝る。そんな生活に憬れる今日この頃。
日記の更新は気の向くまま、つれづれなるままに・・・

OpenVPNのインストール方法

OpenVPN 2.0 HOWTO 日本語訳は原文を丁寧に翻訳してあり非常に為になるのだが、余計な記述までそのまま翻訳してあるので、「とにかくインストールしてさっさと今すぐ使いたい」ってだけの人には冗長すぎてちょっと解りにくい。
私はここを参考にしてとりあえずインストールが完了できたのでよかったが、今後のことを考えると個人的にも忘れそうなので、OpenVPN 2.0 HOWTO 日本語訳を抜粋して必要最小限&初心者向けのセットアップ、つまり

  • サーバもクライアントもWindows
  • 会社などから繋ぐとか、とにかくつながればヨシ
  • ブリッジとかなんとかという本格的な設定は要らねぇ

っていう人向けのインストール方法を下記に記します。っていうか個人的な備忘録としてですけど。

OpenVPNのDownload

ここからDownloadするのが本当だが、Windows同士だからOpenVPN GUI for WindowsをDownloadする。本家のOpenVPNGUIによる設定アプリが入っているだけだから、両方とも中身はほぼ一緒なのだ。

OpenVPN fow Windowsのインストール

Downloadしたexeファイルを実行する。あれこれ聞かれるけど基本的にはすべてOKで進める。

・証明書と鍵を作る

OpenVPNを使うための一番最初の作業がコレ。ここが一番面倒だけど、この証明書と鍵を作らないと使えない。

1. 鍵作成の設定ファイルの作成

コマンドプロンプトを開いて、インストールしたディレクトリに移動する

cd C:\インストールしたディレクトリ\easy-rsa\
 一般的には
cd C:\Program Files\OpenVPN\easy-rsa\

その後、次のバッチファイルを実行する

init-config

すると設定ファイルが作成される(っていうかサンプルファイルをコピーするだけだけど)
次にvars.batファイルを変更する。メモ帳やエディタを使ってvar.batを開いて以下の箇所を変更する。適当でもいいと思うのだが、正しく変更したほうがいいような気がする

set KEY_COUNTRY=JP  日本なのでJPにしておく
set KEY_PROVINCE=Aichi  都道府県を入れておく
set KEY_CITY=Nagoya  市町村を入れておく
set KEY_ORG=Home  企業名とか。個人なら適当に
set KEY_EMAIL=foo@bar.com  メールアドレスを

空欄にしてはいけません

2. 認証局(CA)の証明書と鍵の作成

認証局(CA)の証明書と鍵を作成するために、次のコマンドを順に実行する。

vars
clean-all
build-ca

最後のbuild-caを実行すると次のようなメッセージがでてくるので必要に応じて入力する

C:\Program Files\OpenVPN\easy-rsa>build-ca
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.............++++++
..........................................++++++
writing new private key to 'keys\ca.key'
        • -
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank.
        • -
Country Name (2 letter code) [JP]:  Enterだけ押す State or Province Name (full name) [Aichi]:  Enterだけ押す Locality Name (eg, city) [Nagoya]:  Enterだけ押す Organization Name (eg, company) [home]:  Enterだけ押す Organizational Unit Name (eg, section) :  Enterだけ押す Common Name (eg, your name or your server's hostname) :omizu  通名を入れる(サーバホスト名とかシステム名とか適当に) Email Address [foo@bar.com]:  Enterだけ押す

大半は1.でvars.batに設定した値を用いるので、入力するのはCommon NameのところだけでOK

3. サーバの証明書と鍵の作成

サーバの証明書と鍵を作るために次のコマンドを実行する

build-key-server server

CA証明書&鍵を作ったときと同じメッセージ&質問がくるが、Common Nameは'server'にしておく

Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.............++++++
..........................................++++++
writing new private key to 'keys\ca.key'
        • -
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank.
        • -
Country Name (2 letter code) [JP]:  Enterだけ押す State or Province Name (full name) [Aichi]:  Enterだけ押す Locality Name (eg, city) [Nagoya]:  Enterだけ押す Organization Name (eg, company) [home]:  Enterだけ押す Organizational Unit Name (eg, section) :  Enterだけ押す Common Name (eg, your name or your server's hostname) :server  "server"と入力する Email Address [foo@bar.com]:  Enterだけ押す Please enter the following 'extra' attributes to be sent with your certificate request A challenge password :  Enterだけ押す An optional company name :  Enterだけ押す Using configuration from openssl.cnf Loading 'screen' into random state - done Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Aichi' localityName :PRINTABLE:'Nagoya' organizationName :PRINTABLE:'home' commonName :PRINTABLE:'server' emailAddress :IA5STRING:'foo@bar.com' Certificate is to be certified until Jan 31 02:41:12 2016 GMT (3650 days) Sign the certificate? [y/n]:y  yを入力 1 out of 1 certificate requests certified, commit? [y/n]y  yを入力 Write out database with 1 new entries Data Base Updated

最後の2つの質問は"y"でOK

4. クライアントの証明書と鍵の作成

クライアントの証明書と鍵を作るために次のコマンドを実行する。

build-key client1
build-key client2
build-key client3

この例では3台のクライアントで使用するために3度コマンドを実行して3つの証明書と鍵のペアを作ったわけだが、証明書・鍵は必要に応じて作成すればよい。複数の証明書と鍵のペアを作る際には

  • build-keyの後ろの名前はユニークな(重複しない)名前にする
  • 質問の時のCommon Nameのところは、上記の名前(build-keyの後ろの名前)と同じにする(重複しない)

ようにする

5. Diffie Hellmanパラメータの生成

OpenVPNサーバにはDiffie Hellmanパラメータというのを生成しなければならないらしい。ので、次のコマンドを実行する

build-dh

生成に少し時間がかかりますが、実行が終われば終了。


以上の証明書、鍵(CA、サーバ、クライアント)、DHパラメータは「¥インストールしたディレクトリ¥easy-rsa¥keys」のディレクトリに保存される。
サーバ、クライアントそれぞれに必要な証明書・鍵ファイルは以下のとおり。

  • サーバに必要なもの
    • ca.crt
    • ca.key
    • dh.pem
    • server.crt
    • server.key
  • クライアントに必要なもの
    • ca.crt
    • ca.key
    • client.crt
    • client.key

鍵ファイルは秘密にしないと不正にアクセスされるので、特にクライアントマシンへのコピーの際にはセキュリティに細心の注意を払って行ってください。

設定ファイルの編集

サーバ・クライアントの設定ファイルは「¥インストールしたディレクトリ¥sample-config」に設定ファイルのサンプル(server.ovpn、clilent.ovpn)があるので、これを「¥インストールしたディレクトリ¥config」にコピーして編集する。

1. サーバ設定ファイルの編集

最低限編集しなければならない項目は以下のとおり

・port 1194
  OpenVPNのリスニングポート。デフォルトでは1194だがProxyをとおす場合(後述)などでポートを変更する場合はここを変更する。ルータなどでポート制限をしている場合は、ルータ側でも同じポート番号を開ける設定をしておくこと
・proto udp
  使用するプロトコル。通常はudpでいいのだがProxyをとおす場合(後述)はここを"tcp"に変更しなければならない
・ca c:\\Program Files\\OpenVPN\\easy-rsa\\keys\\ca.crt
  CA証明書があるディレクトリ。ディレクトリの区切りは\\とする
・cert c:\\Program Files\\OpenVPN\\easy-rsa\\keys\\server.crt
  サーバ証明書があるディレクトリ。ディレクトリの区切りは\\とする
・key c:\\Program Files\\OpenVPN\\easy-rsa\\keys\\server.key
  サーバ鍵があるディレクトリ。ディレクトリの区切りは\\とする
・server 192.168.0.0 255.255.255.0
  サーバが構築する仮想ネットワークアドレス。サーバがインストールされたマシンは(上記の設定の場合)192.168.0.1とIPが割り当てられ、サーバ(が入っているマシン)との通信は192.168.0.1と行うことになる。クライアントには残りのIPアドレスが割り当てられる
2. クライアント設定ファイルの編集

作成したCA証明書&鍵(ca.crt、ca.key)とクライアント証明書&鍵(client.crt、client.key)のペアをクライアントマシンの適当なフォルダにコピーしておくこと。
client.ovpnの編集しなければならない項目は以下のとおり

・proto udp
  使用するプロトコル。サーバと同様通常はudpでいいのだがProxyをとおす場合(後述)はここを"tcp"に変更しなければならない
・remote hogehoge.com 1194
  接続するサーバのアドレスとポートを入力。ポートはサーバの設定ファイルに記述したのと合わせること
・http-proxy [proxy server] [proxy port #]
  Proxyを通す場合は、ここにProxyサーバとポートを記述する(詳細は後述)。Proxyを通さないなら、文頭に";"つけてコメントアウトにするか削除する
・ca c:\\保存先ディレクトリ\\ca.crt
  CA証明書があるディレクトリ。ディレクトリの区切りは\\とする
・cert c:\\保存先ディレクトリ\\server.crt
  サーバ証明書があるディレクトリ。ディレクトリの区切りは\\とする
・key c:\\保存先ディレクトリ\\server.key
  サーバ鍵があるディレクトリ。ディレクトリの区切りは\\とする

サーバの起動

サーバの起動には2通りあります
OpenVPN GUIから起動

  1. タスクと例にOpenVPN GUIのアイコンがあるので、右クリックメニュー→「Server」→「Connect」でサーバを起動する
  2. ログダイアログが開くので、一番最後の行に「Initialization Sequence Completed」と表示されたら見事起動が完了

エクスプローラから起動

  1. 「スタート」→「すべてのプログラム」→「OpenVPN」→「OpenVPN configuration file directory」とクリックして
  2. 設定ファイルのフォルダが開きますので、ここでserver.ovpnをダブルクリック

コマンドプロンプトが開いてログが表示されますので、一番最後の行に「Initialization Sequence Completed」と表示されたら見事起動が完了

クライアントの起動

クライアントの起動にもサーバと同様2通りあります
OpenVPN GUIから起動

  1. タスクと例にOpenVPN GUIのアイコンがあるので、右クリックして「Connect」をクリック
  2. ログダイアログが開くので、一番最後の行に「Initialization Sequence Completed」と表示されたら見事接続が完了

エクスプローラから起動

  1. 「スタート」→「すべてのプログラム」→「OpenVPN」→「OpenVPN configuration file directory」とクリックして
  2. 設定ファイルのフォルダが開きますので、ここでclient.ovpnをダブルクリック

コマンドプロンプトが開いてログが表示されますので、一番最後の行に「Initialization Sequence Completed」と表示されたら見事起動が完了

HTTP-Proxy経由の接続方法

OpenVPNはHTTP-Proxy経由の接続ができる。Proxy認証も

の3つができるので、ほとんどのHTTP-Proxyサーバが使えると思う。
方法は次のとおり

・サーバ、クライアントの設定ファイルの「proto udp」の項目を削除し「proto tcp」を追加する
・クライアントの設定ファイルにhttp-proxy項目を追加する
  http-proxy proxy.server.com 1080:認証が要らない場合
  http-proxy proxy.server.com 1080 stdin basic:HTTP-ProxyがBasic認証を要求する場合
  http-proxy proxy.server.com 1080 stdin ntlm:HTTP-ProxyがNTLM認証を要求する場合

ちなみにstdinのところを一行目でユーザ名,二行目でパスワードを書いたファイル名に変えると起動の度に入力する手間が省ける。

HTTP-Proxy経由の接続でのコツ(特にProxyサーバの監視が厳しい環境のとき)

デフォルトでは通信で使うポートが1194であるので、HTTP-Proxyへの要求としては

CONNECT hogehoge.com:1194 HTTP/1.0

というのが送信される。しかし1194というポート番号はOpenVPN用として登録されているので、このままではネットワーク管理者が「OpenVPNを使って外に出ている野郎がいる」とバレてしまう可能性が高い。
そこでネットワーク管理者を騙す方法として、通信ポートとして443(https)を用いる。
変更箇所は以下のとおり

server.ovpn
 proto udptcp
 port 1194443


client.ovpn
 proto udptcp
 remote hogehoge.com 1194443

そうするとHTTP-Proxyへは

CONNECT hogehoge.com:443 HTTP/1.0

という風に送信され、ネットワーク管理者もログを見ただけでは「httpsを使ったサイトでも見ているんだろうな」と目をそらすことができる。(もっともプロトコルレベルで監視されたら身もふたもないが・・・)。いずれにせよ会社内部から外部への長時間の接続は何をしたにせよ怪しまれるので、必要最小限の接続時間にとどめ使わないときはこまめに切断するのが一番よいと思う。ご自身の身のために・・・(笑