OpenVPNでVPN回線を作る方法をまとめます。分かりにくいものが多いのでなるべくわかりやすく説明します。
openvpn,openssl,tun/tapインターフェースなどはインストールされているものとします。インストール方法は各自調べてください。下記例はさくらVPN, debian2.6.26-2-686/OpenVPN 2.1_rc11での例です。
1 OpenVPN設定の概念
OpenVPNの概念はサーバ、各クライアントそれぞれにsslの証明書が必要になります。クライアントの証明書に対して1回線が付与されるという仕組みと考えると分かりやすいです。下記例は1サーバに対して3つのクライアントを設けるという構成です。
[ ] 内は接続に必要になるファイルです。
Server ← ssl 証明書 server [ ca.crt, server.crt, server.key, dh1024.pem ] client1 ← ssl 証明書 client1 [ ca.crt, client1.crt, client1.key ] client2 ← ssl 証明書 client2 [ ca.crt, client2.crt, client2.key ] client3 ← ssl 証明書 client3 [ ca.crt, client3.crt, client3.key ]
まとめると必要ファイルは
ca.crt, server.crt, server.key, dh1024.pem,
clientN.crt, clientN.key (この2ファイルはクライアントの分だけ必要)
サーバ、全クライアントにca.crtが必要になります。
2 必要ファイル生成
/usr/share/doc/openvpn/examples/easy-rsa/2.0を利用して
必要ファイルを生成します。ファイル作成の流れは
1 varsの編集 2 varsを読み込ませる 3 clear-allで初期化 4 build-dhでdh1024.pem生成 5 build-caでca作成 6 build-key-server serverでサーバ用のファイル作成 7 built-key clientNでクライアント用のファイル作成
まず、sslの設定情報などが記入されているvarsファイルを編集します
$su #cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 #vim vars
編集箇所は最下部の
export KEY_COUNTRY="JP" export KEY_PROVINCE="Tokyo" export KEY_CITY="Ootaku" export KEY_ORG="mygroup" export KEY_EMAIL="yourname@yourdomain.domain"
編集後に
$su #cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 # source ./vars # ./clean-all # ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time .....+.............................+...............++*++*++*
続いて
# ./build-ca Generating a 1024 bit RSA private key ...............................................................++++++ ...++++++ writing new private key to '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]:JP State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Ootaku]: Organization Name (eg, company) [mygroup]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [mygroup CA]: Email Address [yourname@yourdomain.domain]:
エンターだけで通ると思います。
# ./build-key-server server Generating a 1024 bit RSA private key .........................................++++++ .......................................++++++ writing new private key to 'server.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]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Ootaku]: Organization Name (eg, company) [mygroup]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [server]: Email Address [yourname@yourdomain.domain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Ootaku' organizationName :PRINTABLE:'mygroup' commonName :PRINTABLE:'server' emailAddress :IA5STRING:'yourname@yourdomain.domain' Certificate is to be certified until Sep 20 15:57:11 2020 GMT (3650 days)
この2箇所だけyを入力してください。
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
ユーザ用の証明書を作成します。client2と言うのは個別名です。好きな名前で大丈夫です。このユーザ一人ひとりに対してIPアドレスが発行されるようになり、証明書一つに対して一つのVPNコネクションのみとなります。同じ証明書を使って2台同時に接続しようとすると片方の回線が切断されます。
# ./build-key client1 Generating a 1024 bit RSA private key ..........++++++ .....................++++++ writing new private key to 'client1.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]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Ootaku]: Organization Name (eg, company) [mygroup]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [client1]: Email Address [yourname@yourdomain.domain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Ootaku' organizationName :PRINTABLE:'mygroup' commonName :PRINTABLE:'client1' emailAddress :IA5STRING:'yourname@yourdomain.domain' Certificate is to be certified until Sep 20 15:59:15 2020 GMT (3650 days)
ここも同様に2箇所だけyを入力してください。
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
#ls /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys
必要以上のものもあるとは思いますが必要ファイルすべてが揃っていると思います。
ca.crt, server.crt, server.key, dh1024.pem, client1.crt, client1.key
3 OpenVPNサーバの設定
VPN回線のネットワークはCクラス 192.168.100.0/24 ネットワークを利用します。
サーバに
ca.crt, server.crt, server.key, dh1024.pem
をコピー、またはアップロードします。場所は
/etc/openvpn/keys
にアップロードすると好ましいです。
サーバの設定ファイルに書き足します。
#vim /etc/openvpn/server.conf
ここでは設定ファイル(server.conf)はなるべく最小構成で書いておきます。
excerpt: /etc/openvpn/server.conf
dev tun proto tcp-server server 192.168.100.0 255.255.255.0 client-to-client client-config-dir /etc/openvpn/ccd status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log keepalive 10 120 ifconfig-pool-persist /etc/openvpn/ipp.txt ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key dh /etc/openvpn/keys/dh1024.pem
サーバを起動します。
/etc/init.d/openvpn start
4 OpenVPNクライアントの設定
クライアントに
ca.crt, client1.crt, client1.key
の3ファイルをコピーします。(ca.crtはサーバと同一です)
/etc/openvpn/keys
にアップロードすると好ましいです。
クライアントの設定を記述します。
#vim /etc/openvpn/client.conf /etc/openvpn/client.conf remote サーバーのホスト名/IPアドレス proto tcp dev tun client persist-key persist-tun ca /opt/local/openvpn/keys/ca.crt cert /opt/local/openvpn/keys/client1.crt key /opt/local/openvpn/keys/client1.key
クライアントを起動します。
/etc/init.d/openvpn start
pingがサーバに通るかテストしてみます。
#ping 192.168.100.1 PING 192.168.100.1 (192.168.20.1) 56(84) bytes of data. 64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.054 ms 64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.046 ms 64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=0.063 ms
無事pingが通ればVPN回線が開通です。
同じように証明書を変えてclient2, clent3を足していけば複数回線を引くことができます。
Mac GUI クライアントtunnelblick
MacOSクライアントはtunnelblickを使います。
これ以外にもいろいろな方法ありますが。
http://code.google.com/p/tunnelblick/
tunnelblickでは設定ファイルを2つ以上設けると複数回線を簡単に引くことができます。
Windows GUI クライアント OpenVPN GUI
windowsでもGUIを使ってOpenVPN回線を利用できます。
http://openvpn.se/
を参照してください。
MacのTunnelblickのtblkファイルに関して
新しいtunnelblickではtblkというファイル(実際はフォルダ)を使って設定を管理します。tblkはフォルダに
・xxxx.conf (設定ファイル) ・ca.crt ・client.crt (個別の証明書) ・client1.key
4つのファイルをフォルダにまとめ、拡張子をtblkにします。設定ファイルの証明書のパスは省いて入力します。要は証明書のファイル名だけでOKです。
remote サーバーのホスト名/IPアドレス proto tcp dev tun client persist-key persist-tun ca ca.crt cert client1.crt key client1.key
という感じです。
設定ファイルのテクニック
OpenVPNサーバ上の /etc/openvpn/ccd
の中にクライアントの証明書と同じ名前のファイルを作成し
/etc/openvpn/ccd/client1 ifconfig-push 192.168.100.29 192.168.100.30
などとするとclient1に対して特定のIPを割り振ることができます。ccdファイルのフォーマットは ifconfig-push 192.168.100.29(IPアドレス) 192.168.100.30(ゲートウェイ)として設定します。この2つのIPの組み合わせがopenVPNではすでに定められています。
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18] [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38] [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58] [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78] [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98] [101,102] [105,106] [109,110] [113,114] [117,118] [121,122] [125,126] [129,130] [133,134] [137,138] [141,142] [145,146] [149,150] [153,154] [157,158] [161,162] [165,166] [169,170] [173,174] [177,178] [181,182] [185,186] [189,190] [193,194] [197,198] [201,202] [205,206] [209,210] [213,214] [217,218] [221,222] [225,226] [229,230] [233,234] [237,238] [241,242] [245,246] [249,250] [253,254]
のパターンでccdファイルを記入します。
例) ifconfig-push 192.168.100.1 192.168.100.2 ifconfig-push 192.168.100.129 192.168.100.130 ifconfig-push 192.168.100.237 192.168.100.238
今後の運用のために
今後の運用のためにVPNサーバでkeysのディレクトリを/etc/openvpn/keysなどに保存しておきましょう。こうしておくことで後々にkeyを増やさないといけないときに役立ちます。
# mkdir /etc/openvpn/keys # cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/* /etc/openvpn/keys
運用後にopenvpnのキーを増やす方法
今後の運用のためにでコピーしたkeysディレクトリの内容を一度元に戻します。その後、build-keyを実行します。
# cp -r /etc/openvpn/keys /usr/share/doc/openvpn/examples/easy-rsa/2.0 # cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 # ./build-key newkeyname
keyが出来上がればあとは上記の手順(必要ファイル生成)から再度繰り返せばよいだけになります。
参考
http://www.openvpn.net/index.php/open-source/documentation/howto.html