DD-WRT化したルーター(WZR-HP-G300NH)とDocomoのiPhone5sでOpenVPNを利用したVPN通信を設定したのでその記録。
これまでAUのiPhoneを使っていて何気なく設定していたPPTPによるVPNがDocomoにかえた途端に使えなくなってしまったのが事の発端だ。
AUのiPhoneをiTunesでバックアップし、それをDocomoのiPhoneに復元したのが原因でLTEが繋がらないなどの通信系に障害が出ていたのでそのせいかと思っていたら、どうものSPモードではPPTPでのVPN接続ができない仕様になっているらしくそれが原因だった。
そこで、仕方なくOpenVPNでVPN環境を構築することにした。
VPNサーバーとなるルーターはWZR-HP-G300NHをDD-WRT化したもの。
ファームはDD-WRT v24-sp2 (05/27/13) std - build 21676
VPNクライアントはiPhone5s
やりたいことを図にすると以下のようなイメージになる。
特に変わった点もない。いたって普通の環境だ。
早速設定をしようと、いろんな解説サイトを見てOpenVPNを勉強したが証明書やら認証鍵やら小難しい事ばかり書いてあって正直チンプンカンプン。
俺みたいな初心者には正直敷居が高く感じられる。そんなこと言っててもどうしてもVPN環境が必要なので解説サイトを見ながらやってみたらなんとか理解できたので俺なりに解説してみようと思う。
まずは認証局(CA)の設置・・・なんて言われても意味プ!!だったので、最初に何があればVPN接続できるようになるのかから説明しようと思う。
■VPNサーバー(DD-WRT)に必要なもの
ca.crt 認証局(CA)の証明書 (VPNクライアントと共通)
ta.key(任意) tls-auth鍵(VPNクライアントと共通) セキュリティの強化
dh2048.pem(もしくはdh1024.pem) Diffie Hellmanパラメータ
server.crt VPNサーバーの証明書
server.key VPNサーバーの鍵
■VPNクライアント(iPhone5s)に必要なもの
ca.crt 認証局(CA)の証明書 (VPNサーバーと共通)
ta.key(任意) tls-auth鍵(VPNサーバーと共通) セキュリティの強化
client1.crt VPNクライアントの証明書
client1.key VPNクライアントの鍵
以上のファイルが必要になる。
このファイルを作成・管理するのが認証局(CA)の役目・・・なのかな?たぶん。
っとそんな小難しことは考えずに単に証明書や鍵を生成するパソコンのことを認証局(CA)と思っておけばいい。
ってことで早速準備から
--------------------------------
準備編
--------------------------------
Windows環境の人はOpenVPNをインストールする必要がある。
こいつをインストールして証明書やら鍵やらを作成する。
OpenVPNのダウンロードはここから
OpenVPN日本語情報サイト
ここから「windowsインストーラ版」をダウンロードすればいい。
ちなみに俺がインストールしたのは
openvpn-install-2.3.2-I003-x86_64.exe っていう64bitOS用のやつ。
インストール時に 「Select components to install:」 というところでコンポーネントを選択するところが出てくるからこのときにすべての項目にチェックを入れてインストール。
どうせ証明書作成したらアンインストールするのであんまり気にしない。
次にTerapadなどの文字コードや改行コードが指定できるテキストエディタが必要なのでどっかからダウンロードしてくる。
最後にデスクトップなどの自分が分かりやすい場所に
サーバー用フォルダ(VPNサーバー(DD-WRT)用に必要なファイルを入れるフォルダ)
クライアント用フォルダ(VPNクライアント(iPhone5s)用に必要なファイルを入れるフォルダ)
の2つを作成しておく。以上で準備完了!
--------------------------------
証明書と鍵の生成編
--------------------------------
ここからは、ほとんどコマンドプロンプトで操作でしていくので少しややこしいかもしれない。
また、ここからの作業は
%ProgramFiles%\OpenVPN\easy-rsa
というフォルダ内での作業になる。
ここにあるバッチファイルを実行したり、ファイルを編集したりして証明書や鍵を作成していくが、ご存じのとおり管理者権限がないとこのフォルダにあるファイルは編集することができないので必要に応じでデスクトップなどにコピーして作業するといい。
□コマンドプロンプトでの作業
コマンドプロンプトを管理者権限で実行し、以下のコマンドを実行していく
cd /d %ProgramFiles%\OpenVPN\easy-rsa ← Enter!
カレントディレクトリをOpenVPNがインストールされたフォルダに移動
init-config ← Enter!
vars.batが初期化または新規作成される
コマンドプロンプトは開いたままにして次はメモ帳での作業。
□メモ帳で作業
※Terapadじゃなくて普通のメモ帳で良い
さきほどのコマンド作業でできたvars.batを編集する
このvars.batは環境変数を設定するためのファイルらしい
vars.batをメモ帳で開いて以下の内容を編集する
set KEY_SIZE=1024
↓ 以下の値に変更(任意)
set KEY_SIZE=2048
(任意なので変更しなくてもよい)
set KEY_COUNTRY=JP
set KEY_PROVINCE=都道府県
set KEY_CITY=市町村
set KEY_ORG=所属
set KEY_EMAIL=メール
set KEY_NAME=名前
青色の日本語の文字のところを自分の環境に合わせてに編集する。
※半角英字で入力。本当の住所とか入れずに適当な内容で良い
そして上書き保存する。
□コマンドプロンプトで作業
お次はまたコマンドプロンプトでの作業。
以下のコマンドを順番に実行していく
vars ← Enter!
証明書/鍵作成用環境変数設定ファイル内容をシステムに反映
clean-all ← Enter!
証明書/鍵作成先ディレクトリ初期化
※指定されたファイルが見つかりませんは無視。
mkdir c:\etc\ssl ← Enter!
Cドライブ直下にフォルダの作成
copy openssl-1.0.0.cnf c:\etc\ssl\openssl.cnf ← Enter!
openssl-1.0.0.confファイルをコピーしてリネームする
これをやっておかないと次のステップでエラーが表示される
ここまでが証明書・鍵作成前の準備といったところ
■認証局(CA)の証明書・鍵の作成
コマンドプロンプトでの作業
build-ca ← Enter!
認証局(CA)用の証明書・鍵の作成開始
Country Name(2 letter code)[JP]= ← Enter!
空白のままで良い。
JPってところには準備段階でメモ帳で入力したものが表示されているはず。
このカッコ内がデフォルト値で何も入力しないとこのデフォルト値に設定されるみたい。
それ以降も空白でEnter!でいいけど次の項目だけは入力する
Common Name(eg, your name or your server's hostname)[changeme ]=
ここには認証局(CA)の名前を設定すんのか?
ようわからんが、適当に
hoge-ca
と入力してEnter!
それ以降は空白でEnter!
C:\Program Files\OpenVPN\easy-rsa>
って表示されたらとりあえず認証局(CA)用の証明書と鍵の作成は終了。
%ProgramFiles%\OpenVPN\easy-rsa\keyの中に
ca.crt (サーバー、クライアントで使用する)
というファイルが作成されていればOK。(他にも数個のファイルができるけど使わないので無視)
このファイルを準備段階で作成したサーバー用フォルダとクライアント用フォルダの両方にコピーしておく。
■サーバー用の証明書と鍵の生成
さきほどの認証局用とほとんど同じ手順になる。
最後に追加でちょこちょこある位。
コマンドプロンプトでの作業
build-key-server server ← Enter!
VPNサーバー用の証明書・鍵の作成開始
Country Name(2 letter code)[JP]= ← Enter!
空白のままで良い。
それ以外も全く一緒。
Common Name(eg, your name or your server's hostname)[changeme]=
ここだけサーバーの名前を設定すんのか?
ようわからんが、適当に
hoge-sv
と入力してEnter!
以降は空白Enter!
最後に少しだけ認証局(CA)の時と違うことが表示される
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 何もいれずにEnter!
An optional company name []: ← 何もいれずにEnter!
Sign the certificate? [y/n]: ← y を入力してEnter!
1 out of 1 certificate requests certified, commit? [y/n]: ← y を入力してEnter!
C:\Program Files\OpenVPN\easy-rsa>
って表示されたらとりあえずVPNサーバー用の証明書と鍵の作成は終了。
%ProgramFiles%\OpenVPN\easy-rsa\keyの中に新たに
server.crt (サーバー用の証明書)
server.key (サーバー用の鍵)
というファイルが作成されていればOK。
(他にも新たに数個のファイルができているけど使わないので割愛)
この2つをサーバー用フォルダにコピーしておく。
■クライアント用の証明書と鍵の生成
クライアント用もほとんど一緒。
コマンドプロンプトでの作業
build-key client1
と入力して例のごとくCommonNameだけclient1などと入れておけば残りはサーバー用と全く同じ手順になる。
しかし、今回は接続時にパスワードを要求するように設定したいので上のコマンドを実行する前に少しだけ手を加える。
□メモ帳で作業
※Terapadじゃなくて普通のメモ帳で良い
build-key.batをメモ帳で編集する。
openssl req -days 3650 -nodes -new -keyout %KEY_DIR%\%1.key -out %KEY_DIR%\%1.csr -config %KEY_CONFIG%
上の 「 -nodes」 を削除する
以下のようになればOK
openssl req -days 3650 -new -keyout %KEY_DIR%\%1.key -out %KEY_DIR%\%1.csr -config %KEY_CONFIG%
そして同フォルダに build-key-pass.bat という名前をつけて保存する
□コマンドプロンプトで作業
build-key-pass client1 ← Enter!
末尾の client1 は任意の名前をつける
複数のVPNクライアントを作る場合には client2、client3などとそのクラアントごとにユニークな名前をつけて実行する
VPNクライアント用の証明書・鍵の作成開始
Enter PEM pass phrase: ← 接続時に必要なパスワードを設定する
※何も表示されないがそのまま確実に入力する
Verifying - Enter PEM pass phrase: ← パスワードを再入力
※何も表示されないがそのまま確実に入力する
これ以降はサーバー用と同じくCommonNameだけにユニークな値を設定すればそれ以外は何も入力せずにEnter!
今回は client1 と入力してEnter!
あとはサーバーの時と同じく
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 何もいれずにEnter!
An optional company name []: ← 何もいれずにEnter!
Sign the certificate? [y/n]: ← y を入力してEnter!
1 out of 1 certificate requests certified, commit? [y/n]: ← y を入力してEnter!
C:\Program Files\OpenVPN\easy-rsa>
って表示されたらとりあえずVPNクライアント用の証明書と鍵の作成は終了。
%ProgramFiles%\OpenVPN\easy-rsa\keyの中に新たに
client1.crt (クライアント用の証明書)
client1.key (クライアント用の鍵)
というファイルが作成されていればOK。
(他にも新たに数個のファイルができているけど使わないので割愛)
この2つをクライアント用フォルダーにコピーしておく。
■セキュリティの強化?
最後にDiffie Hellmanパラメータとtls-auth鍵を作成する
これが実際にどんな役目をするのかはよくわからないけど、とにかくセキュリティの強化になるようなのでやっておく。
□コマンドプロンプトで作業
build-dh ← Enter!
これで%ProgramFiles%\OpenVPN\easy-rsa\keyの中に
dh2048.pem (サーバー用)もしくはdh1024.pem
というファイルができていればOK
これをサーバー用フォルダにコピーしておく。
次は任意でtls-auth鍵を作成する
cd %ProgramFiles%\OpenVPN\bin ← Enter!
カレントディレクトリを移動
openvpn --genkey --secret ta.key ← Enter!
%ProgramFiles%\OpenVPN\binの中に
ta.key (サーバー、クラアント共通)
ができていればOK
これをサーバー用フォルダ、クラアント用フォルダの両方にコピーしておく。
これでとりあえず証明書と鍵の作成は完了!
■作成したファイルの確認
サーバー用、クライアント用のフォルダの中は以下の内容になっているか確認しておく。
サーバー用フォルダの中身
ca.crt
ta.key
dh2048.pem(もしくはdh1024.pem)
server.crt
server.key
クライアント用フォルダの中身
ca.crt
ta.key
client1.crt
client1.key
問題なければ次のステップに進む。
※コマンドプロンプトはもう使わないので閉じてよい。
--------------------------------
設定ファイルの作成
--------------------------------
お次は設定ファイルの作成。
VPNサーバー、VPNクライアントそれぞれに通信方法などの設定内容を記載したファイルを作成しなくてはいけない。
が、DD-WRTはウェブ設定画面から直接設定できるのでクライアント用の設定ファイルだけを作成する。
ここではメモ帳ではなくTerapadなどのテキストエディタで作業する。
理由はWindowsの標準形式で保存された設定ファイルは文字コードや改行コードがiPhoneとは違い正常に認識できないから。
早速、Terapadを開いて新規テキストを作成する(文字コードはUTF-8、改行コードはLFを指定すること)
本当はサンプルファイルがあるんだけれど、どうせ全部上書きしちゃうので新規テキストで問題ない。
そして以下の内容をコピペする
↓↓↓↓↓↓この下から↓↓↓↓↓↓
remote VPNサーバーのドメイン 1194
client
remote-cert-tls server
dev tun0
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
float
cipher AES-256-CBC
comp-lzo
tls-client
key-direction 1
↑↑↑↑↑↑この上まで↑↑↑↑↑↑
これがOpenVPNの設定を記載したもの。
基本的にこの内容とサーバー側の設定内容を一致させないといけない。
それぞれの意味は以下に記載するけど・・・間違ってたらゴメン!指摘して下さい
remote VPNサーバーのドメイン 1194
vpnサーバーの場所とポート番号を指定する(俺はDDNSを設定していたのでそのドメイン名を記述した)
client
クライアントであることを示す
remote-cert-tls server
Man-in-the-Middle攻撃対策らしい。サーバー証明書を強制的に検証させる
dev tun0
tunインターフェイスのユニット番号を指定する
proto tcp
使用するプロトコルをTCPに指定する UDPだと失敗したのでTCPを指定※サーバーと合わせること
resolv-retry infinite
サーバホスト名の名前解決を永遠に試みる
nobind
特定なローカルポート番号をバインドしない。よーわからん。
persist-key
起動時にだけ鍵ファイルを読む込む
persist-tun
起動時にだけtunデバイスをオープンにする
float
VPNのアドレスをサーバーに決定させる
cipher AES-256-CBC
暗号化強度の設定※サーバーと合わせること
comp-lzo
VPNリンクに対する圧縮を有効にする※サーバーと合わせること
tls-client
TLSクライアントであることを示すのかな?よーわからん。
key-direction 1
よーわからんが、これ入れないとtls関係のエラーが表示されるので
次に証明書や鍵のファイルをこの設定の中で指定する必要がある。
指定する方法は2つあって、
1つはファイル名とファイルパスを記述する方法。
ca ここにca.crtのファイル名(必要な場合はファイルパスも)を記載
cert ここにclient1.crtのファイル名(必要な場合はファイルパスも)を記載
key ここにclient1.keyのファイル名(必要な場合はファイルパスも)を記載
tls-auth ここにta.keyのファイル名(必要な場合はファイルパスも)を記載
みたいな感じ。
もう1つは設定ファイル内に埋め込んでしまう方法
<ca>ここにca.crtの中身を記載</ca>
<cert>ここにclient1.crtの中身を記載</cert>
<key>ここにclient1.keyの中身を記載</key>
<tls-auth>ここにta.keyの中身を記載</tls-auth>
今回は後者の埋め込む形で設定してみたのでこの方法で説明する。
<ca></ca>のタグの間に何をどう埋め込むのかというと
ca.crtをメモ帳などのテキストエディタで開いて以下のような文字列をそのままコピペするだけ
↓↓↓↓↓↓この下から↓↓↓↓↓↓
-----BEGIN CERTIFICATE-----
暗合がズラ~
-----END CERTIFICATE-----
↑↑↑↑↑↑この上まで↑↑↑↑↑↑
<ca>
-----BEGIN CERTIFICATE-----
暗合がズラ~
-----END CERTIFICATE-----
</ca>
のようになればOK。
<cert></cert>にはclient1.crtの中身を
<key></key>にはclient1.keyの中身を
<tls-auth></tls-auth>にはta.keyの中身を
それぞれ貼りつけるだけでいい。
これらのファイルの中には
-----BEGIN ~ 暗合がズラ~ -----END ~
以外にたくさんの文字列が記載されてるファイルがあるけど
その時も必要なのは
-----BEGIN ~ 暗合がズラ~ -----END ~
だけ。
それ以外は無視していい。
ここまで完成したら文字コードはUTF-8(BOM付)、改行コードはLFを指定して保存する。
client.ovpn というファイル名で保存する。
※拡張子はtxtじゃなくてovpn。
--------------------------------
VPNサーバー側の設定(DD-WRT)
--------------------------------
VPNサーバーの設定はDD-WRTのウェブ管理画面から行う。
ネットワーク → PPTPサーバー/クライアント とたどってOpenVPN Server/Deamonを設定していく
OpenVPN → 有効
Start Type → WAN Up
Config as → Server
Server mode → Router(TUN)
Network → 例:10.8.0.0
Netmask → 例:255.255.255.0
NetworkとNetmaskはiPhoneとDD-WRTのルーター間で使用されるネットワークアドレスなので適当に
本設定はデフォルト値
ポート → 1194※VPNクライアントと合わせること
Tunnel Protocol → TCP※VPNクライアントと合わせること
UDPだとiPhoneとのVPN接続に失敗した。
Encryption Cipher → AES-256 CBC※VPNクライアントと合わせること
Hash Algorithm → SHA1
Advanced Options → 有効
TLS Cipher → None
LZO Compression → Yes
Redirect default Gateway → 無効
Allow Client to Client → 無効
Allow duplicate cn → 無効
Tunnel MTU Setting → 1500
Tunnel UDP Fragment → 空
Tunnel UDP MSS-Fix → 無効
CCD-Dir DEFAULT file → 空
Client connect script → 空
Static Key → 空
PKCS12key → 空
Public Server Cert → server.crtの中身をコピペ
CA Cert → ca.crtの中身をコピペ
Private Server key → server.keyの中身をコピペ
DH PEM → dh2048(もしくは1024)の中身をコピペ
Additional Config → 以下の記述をコピペ
↓↓↓↓↓↓この下から↓↓↓↓↓↓
push "route 192.168.10.0 255.255.255.0"
push "dhcp-option DNS 10.8.0.1"
#server 10.8.0.1 255.255.255.0
dev tun0
keepalive 10 120
↑↑↑↑↑↑この上まで↑↑↑↑↑↑
TLS Auth key → ta.keyの中身をコピペ
以上。中身をコピペはクライアントの時と同じく暗合部分のみでいい。
あとは設定ボタンを押して保存。
一応画像を貼っとく。
お次は 管理 → コマンド実行 とたどって以下の内容をFirewallスクリプトとして保存する
↓↓↓↓↓↓この下から↓↓↓↓↓↓
ipdables -I INPUT 1 -p tcp -dport 1194 -j ACCEPT
iptables -I FORWARD 1 -source 10.8.0.0/24 -j ACCEPT
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
↑↑↑↑↑↑この上まで↑↑↑↑↑↑
ここまで設定すればとりえずVPN接続はできるようになると思う。
iPhoneでの設定方法はAppStoreからOpenVPNをインストールしておいてVPNクライアント用の設定ファイルをiPhoneにメールで送るだけでいい。
メールの添付ファイルを開けば自動でOpenVPNに設定内容が反映される。
俺はこれでVPN接続は完了して目的のネットワーク内にアクセスできるようになった!
しか~し!!
そのネットワーク内にアクセスできたのはいいけど、iPhoneに割り当てられているipアドレス(10.8.0.x)が目的のネットワーク内のアドレス(192.168.10.x)と違うため個々のパソコンFireWallに引っかかってリモートデスクトップなどができないという問題が発生・・・
FireWallの許可設定をすればいいだけなんだけどなんかスッキリしない。
iPhoneに割り当てられるipアドレスを目的のネットワーク内のアドレスと同じにするためにはVPNのモードをBridge(TAP)モードにすればいいんだけど、残念ながらiPhoneは対応していないらしい。
そこでいろいろ調べた結果ipマスカレードを使用することにした。これは通常はローカルからグローバルにアクセスするときに使用されるものなんだけど、それをこんな使い方していいのか・・・よくわからないけどとにかくこれで解決できたので良しとしよう!
ってことで設定してみる。
管理 → コマンド実行 とたどって以下の内容を起動時スクリプトとして保存する
↓↓↓↓↓↓この下から↓↓↓↓↓↓
iptables -t nat -A POSTROUTING -o br0 -s 10.8.0.0/255.255.255.0 -j MASQUERADE
↑↑↑↑↑↑この上まで↑↑↑↑↑↑
設定したらルーターを再起動。
これで無事iPhoneにも目的のネットワークアドレス(DD-WRTのipアドレス)が割り当てられるようになった。
以上。備忘も兼ねて書いてみたけど、この設定は最低限自分の目標が達成できればそれでいいような内容になっているのでセキュリティを含めた問題点があるかもしれないことを断っておく。
詳しい人いたら問題点やいらない設定など教えてもらえると助かるかな(‐^▽^‐)