OpenVPN 設定メモ

2003/10/30 作成

前提

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 による証明書の生成

  1. まず,認証局の公開鍵ペアを生成.これを使用して実際に各ホストで使用する 公開鍵ペアに署名をするのでこれの管理はとても重要. なお,コマンドは以下の通り(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 を設定できる.
    
  2. 次に 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 を入力しなければならなくなるので省略する/しないは 良く考える必要がある.
  3. 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})を用意する.
  4. 証明書ではないが,TLS のサーバー側では Diffie-Hellman パラメータを 事前に計算しておく必要がある(処理がすげー重いので).
    	# openssl dhparam -out dh2048.pem 2048
    
    (この計算に Opteron 240 で 20分以上かかったりします)

OpenVPN の設定

とする. なお,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)