OpenVPN 設定メモ
2003/10/30 作成
前提
- OpenVPN をインストールする.
FreeBSD なら ports/security/openvpn にある.
- OpenVPN は通常 udp 通信が基本(TCP over TCP などの問題を避けるため)だが,
1.5から TCP サポートが試験的に
入っているので TCP で壁越えを目指す場合などは 1.5系以降が必要.
- 認証は pre-shared key と TLS が使える.pre-shared の方が手軽だが,
今回はとりあえず TLS を使ってみることにする.
TLS 関連
TLS 認証では,証明書を普通は外部 CA(PKIなど?)を使って発行する.
が,とりあえず "TLS でやりとりしたい" だけなので
ここでは自分で認証局(CA)になって鍵・証明書を発行して管理する.
要するに OpenVPN HOWTO
の"Build RSA Certificates and Keys"に書いてある通りにまねる.
OpenSSL の設定
/etc/ssl(for FreeBSD) の openssl.cnf をいじる.
TLS/SSL 関連を知らないと "どうでもよい" とは言っても
各種設定項目がなにを意味してなにを書いて良いのか,
が良く分からない(というか,私自身が良く分からなかった)ので
その辺りを簡単に説明する.
OpenSSL で登場する証明書などの概念は
こちらで
日本語で詳しく解説されているので参照のこと.
certificate/private_key が認証局の証明書/秘密鍵(後で作成).
デフォルトでは両者とも .pem な名前だが,apache 方面の命名ルールでは
それぞれ .crt/.key にするようなのでそれを真似ておくのが吉か.
serial のファイルを作る.
# echo 01 > /etc/ssl/${dir}/serial
database のファイルもつくっておく
# touch /etc/ssl/${dir}/index.txt
default_days も 1年の有効期限は今回の目的には中途半端なので
10年くらい(3650)にしておく.
default_bits は鍵長.1024 でもいけなくはないが,2048bit を
使ってみたりしても良い.(その分重くなる)
以下,証明書を作るときに問い合わせが来るものである.
各々 _default の項目がデフォルト値となるので openssl.cnf に
書いておくと良いものもある.
countryName 国名(JP)
stateOrProvinceName 都市名(Tokyo など?)
commonName(CN) 名前(重要)
認証局鍵生成時は認証局の名前になり,
各証明書生成時には証明書の名前
OpenSSL による証明書の生成
- まず,認証局の公開鍵ペアを生成.これを使用して実際に各ホストで使用する
公開鍵ペアに署名をするのでこれの管理はとても重要.
なお,コマンドは以下の通り(openvpn HOWTO より;
openssl の apps/CA.sh にも同様の記述あり)
まず my-ca.crt(自己署名型証明書) と my-ca.key(秘密鍵) を作成する.
(openssl/apps/CA.sh -newca 相当)
# openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650
my-ca.key は chmod 600 しておいたほうが良さそうですね.
これらを openssl.cnf の certificate/private_key で示されている
path に置いておく.
なお,-nodes を省略すると ssh でもお馴染の pass phrase を設定できる.
- 次に key(秘密鍵)とcsr(証明書署名要求ファイル)の作成を行う.
(openssl/apps/CA.sh -newcert 相当)
# openssl req -nodes -new -keyout host.key -out host.csr
こちらも -nodes なしで pass phrase が設定できるが,
こちらは pass phrase をつけてしまうと openvpn 起動時に
pass phrase を入力しなければならなくなるので省略する/しないは
良く考える必要がある.
- csr に CA の署名(上記の my-ca.{key,crt})をつける.
# openssl ca -out host.crt -in host.csr
これで local CA による署名が行われ,署名の履歴も index.txt などに
書かれる.
これで host.{crt,key} が用意できました(csr はもう不要).
openvpn で使うにはもう一組(remote.{crt,key})を用意する.
- 証明書ではないが,TLS のサーバー側では Diffie-Hellman パラメータを
事前に計算しておく必要がある(処理がすげー重いので).
# openssl dhparam -out dh2048.pem 2048
(この計算に Opteron 240 で 20分以上かかったりします)
OpenVPN の設定
- CA の証明書(my-ca.crt)
- TLS-server の鍵/証明書(t-server.{crt,key})
- TLS-client の鍵/証明書(t-client.{crt,key})
とする.
なお,openvpn の udp モード(標準)では openvpn にとっての
server/client は特にない.TLS に関して server/client が
あるのみである.
tls-server 側の設定ファイル:
cd /usr/local/etc/openvpn/t-client # 鍵などのファイルの置き場
writepid /var/run/openvpn/t-client.pid
### ↑複数セッションある場合にはディレクトリを掘る方が管理が楽だと思う...
tls-server
dev tun0 # 注1
#port udp # vtun-1.5 系では udp/tcp-server/tcp-client が設定可能
ifconfig 192.168.222.1 192.168.222.2 # 他空間で使用していないアドレス
local ss.ss.ss.ss # TLS-server の IP address
remote xx.xx.xx.xx # TLS-client の IP address 注2
port 5000
dh dh2048.pem # 前節にて生成した DH parameter
ca my-ca.crt # TLS-client の鍵に署名した CA の証明書
cert t-server.crt # TLS-server の証明書
key t-server.key # TLS-server の秘密鍵
#up ./up-script # route add などをしたい場合はここで.
ping 60
ping-restart 600
#reneg-sec 3600
#cipher AES-128-CBC
user openvpn # openvpn user/group を設定
group openvpn
persist-key
persist-tun
#persist-local-ip
#persist-remote-ip
verb 1 # 注3
tls-client 側の設定ファイル
cd /usr/local/etc/openvpn/t-client
writepid /var/run/openvpn/t-client.pid
tls-client
dev tun1
local xx.xx.xx.xx # TLS-client の IP address 注2
remote ss.ss.ss.ss # TLS-server の IP address
port 5002
ifconfig 192.168.222.2 192.168.222.1 # 他空間で使用していないアドレス
#up ./up-script
ca my-ca.crt # TLS-server の鍵に署名した CA の証明書
cert t-client.crt # TLS-client の証明書
key t-client.key # TLS-client の秘密鍵
ping 60
ping-restart 600
#reneg-sec 3600
#cipher AES-128-CBC
user openvpn
group openvpn
persist-key
persist-tun
#persist-local-ip
#persist-remote-ip
verb 1
これで以下のコマンドで openvpn を起動.
t-server# openvpn --config /usr/local/etc/openvpn/t-client/openvpn.conf --daemon
t-client# openvpn --config /usr/local/etc/openvpn/t-server/openvpn.conf --daemon
ifconfig -u で tun デバイスが生きていること,ping で相手を叩けることを
確認できれば設定完了.
注1
tun0 でなく tun でも良い(番号省略)が IPFW で tun device 毎の
アクセス制御をしたい可能性があるのでここでは陽に指定する.
注2
server のみ固定アドレスで,という場合には remote 省略の上
float オプションを設定する.その場合は port 指定も lport のみ指定.
注3
--daemon モードで syslog に吐かれると /var/log/messages が
非常に荒れるので /etc/syslog.conf にて !openvpn な
セクションを用意して,なおかつ newsyslog.conf でぐるぐるするように
するのがお勧めです.
参考リンク
内容がおかしかったりしたらツッコミ歓迎です.
川口 銀河
(ginga-www@ginganet.org)