openVPNが急につながらなくなった話。
自宅外から自宅内のサーバにアクセスする際の手段としてsshとvpnがあるが、最近はvpnで自宅ネットワークに入ることがおおい。というのも自宅にあるサーバで構築されたシステムの開発をする際、同じネットワーク内にいたほうがいろいろと作業がしやすいためである。
vpnサーバの構築にはopenVPNを使っているが、そんなopenVPNが今朝からつながらなくなった。
/etc/var/openvpn.logを見てみると以下のエラーが。
Tue Sep 27 15:36:24 2022 130.xx.xxx.xxx:61548 VERIFY ERROR: depth=0, error=CRL has expired: CN=hogehoge.
error=CRL has expiredとのこと。
実はこれでつながらなくなるのが3回目である。まあ、証明書の有効期限が切れたということなので、証明書を再発行することになる。 その手順を改めてまとめる。
そもそもどうやってopenVPNサーバを立てるか
このサイトを参考にVPNサーバを構築する。 一応、流れを説明する。
必要なソフトのインストール
- OpenVPNのインストール
sudo apt install openvpn
- Easy RSAのダウンロード
git clone https://github.com/OpenVPN/easy-rsa.git
認証鍵の生成
- Easy RSAディレクトリへ移動
cd ./easy-rsa/easyrsa3
- 初期設定
./easyrsa init-pki
以下のように表示されればOK
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: path/to/easy-rsa/easyrsa3/pki
- CA証明書の生成
./easyrsa build-ca
パスフレーズを聞かれるので、パスフレーズを入力。再入力を要求されるので入力する。
sudo cp pki/ca.crt /etc/openvpn
で生成された鍵を/etc/openvpnにコピー。
- サーバ証明書の生成
./easyrsa build-server-full server nopass
パスフレーズは3で入力したものと同じものを入力。 生成された鍵を/etc/openvpnにコピー
$ sudo cp pki/issued/server.crt /etc/openvpn
$ sudo cp pki/private/server.key /etc/openvpn
- DH鍵の生成
$ ./easyrsa gen-dh
生成された鍵をコピー
$ sudo cp pki/dh.pem /etc/openvpn
- クライアント証明書の生成
$ ./easyrsa gen-crl
パスフレーズを聞かれたら、CA証明書のパスフレーズを入力。 生成された鍵をまたコピー
$ sudo cp pki/crl.pem /etc/openvpn
$ sudo chmod o+r /etc/openvpn/crl.pem
OpenVPNサーバの設定
/etc/openvpn/にserver.confというファイルを作成する。以下の設定を入力する。
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
crl-verify crl.pem
ifconfig-pool-persist ipp.txt
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3
クライアントの設定方法
クライアントで使う鍵を生成する必要があります。サーバ側で生成します。何故か?ca.crtをもと鍵を生成するからですね。新たに生成しないといけないのは2つだけです。しかもeasyrsaを使えばかんたんにできます。
cd easy-rsa/easyrsa3
./easyrsa build-client-full username
このコマンド一発で
username.crt
username.key
の2つが生成されます。これとca.crtをクライアント側に移すわけですね。 ubuntuでvpnを使うのはかんたん。 このサイト をもとにやれば一発。
エラーの解決方法
error=CRL has expired、つまりクライアント証明書の有効期限がきれたということ。 上記のOpenVPN設定の過程のクライアント証明書の発行
./easyrsa gen-crl
をして
$ sudo cp pki/crl.pem /etc/openvpn
$ sudo chmod o+r /etc/openvpn/crl.pem
をすれば大丈夫そう。
./easyrsa gen-crl
をしたら、パスフレーズを聞かれたので入力ししたら、
Using SSL: openssl OpenSSL 1.1.1n 15 Mar 2022
Using configuration from /home/pi/easy-rsa/easyrsa3/pki/easy-rsa-3807.qIKY9G/tmp.6cBzGu
Enter pass phrase for /home/pi/easy-rsa/easyrsa3/pki/private/ca.key:
An updated CRL has been created.
CRL file: /home/pi/easy-rsa/easyrsa3/pki/crl.pem
が出てきた。ので、コピーして、ファイルの権限を更新したら、問題なくつながるようになった。
ちなみに、クライアント証明書の有効期限はデフォルトでは180日だが、EasyRSA3の設定ファイルを変更することで任意の有効期限にすることができる。
easyrsa3/vars.example
に、使用する証明書の有効期限を入力する欄があるので、そこを変更する。 以下のコマンドを使うことで証明書の有効期限を確認することも可能である。
openssl crl -in /etc/openvpn/crl.pem -text
出力結果はこんな感じ。
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = hoge
Last Update: Sep 27 08:31:20 2022 GMT
Next Update: Mar 26 08:31:20 2023 GMT
今後やりたいこと。
vpnクライアントからvpnサーバネットワーク内のノードにアクセスすることはできるんですよ。つまりクラインアントから接続を開始することはできる。しかし、逆はできない。俺がやりたいのは、サーバが存在しているノードからクライアントに接続すること。これができると完全に同じネットワーク内にいることになる。セキュリティー的に難しいのかな?