OpenVPN設定外伝: 設定でハマったところn選

By | 2018年5月21日 , Last update: 2022年8月7日

はじめに

前の記事OpenVPNの設定手順について書きました。

ただ、それは平坦な道のりではなかったので、この記事でハマったところをいくつか書いていきます。後半の方の節は前の記事では触れていなかったことが急に登場しますが、細かいことは気にしないでお読みいただけると幸いです。🙇‍♂️

スポンサーリンク

ハマったところその1: そもそも、クライアントの鍵ペアのつもりが誤ってサーバの鍵ペアを作ってしまった。

クライアント側のOpenVPNの設定を終えて、root権限で接続のテストのつもりで以下のコマンドを実行してみると…

# systemctl start openvpn-client@client

 
クライアント側の/var/log/messagesに以下のメッセージが…

May 18 07:11:59 nuc openvpn[1438]: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
May 18 07:11:59 nuc openvpn[1438]: TLS Error: TLS handshake failed
May 18 07:11:59 nuc openvpn[1438]: SIGUSR1[soft,tls-error] received, process restarting
May 18 07:11:59 nuc openvpn[1438]: Restart pause, 5 second(s)
May 18 07:12:04 nuc openvpn[1438]: TCP/UDP: Preserving recently used remote address: [AF_INET6]sss:ppp:mmm:qqq::1:1194
May 18 07:12:04 nuc openvpn[1438]: Socket Buffers: R=[212992->212992] S=[212992->212992]
May 18 07:12:04 nuc openvpn[1438]: UDP link local: (not bound)
May 18 07:12:04 nuc openvpn[1438]: UDP link remote: [AF_INET6]sss:ppp:mmm:qqq::1:1194

 

TLSのハンドシェイクに失敗しているために、接続に失敗しているようです。(´・ω・`)

そこで、サーバ側のログファイル(/var/log/openvpn.log)を確認してみます。すると…

xxx.yyy.zzz.ttt:53329 VERIFY ERROR: depth=0, error=unsupported certificate purpose: CN=client

 

というログを発見しました。証明書が正しくないみたいです…

こういうときはGoogle先生に聞いた方が原因がわかることの方が多い(当サイト比)ので、聞いてみたところ、「それは鍵ペアが間違ってね?」というような記事しか見当たらなかったので、改めて前の記事の書きかけをよ~く確認してみたところ、「クライアント用秘密鍵及び証明書の作成」の項で

[panda@pandanote.info easyrsa3]$ ./easyrsa build-client-full client nopass

 
と書くべきところ、

[panda@pandanote.info easyrsa3]$ ./easyrsa build-server-full client nopass

 
と書いて、そのまま実行してました。

どうも、サーバの鍵ペアを作っていたようです… (´・ω・`)


スポンサーリンク

ここ、試験には出ませんが、よく間違えます。

あわてると良くないですね…

そこで、クライアントの秘密鍵及び証明書を作って、問題を解決します。

ということで、以下の手順で誤って作成してしまった(本来は)サーバ用の秘密鍵及び証明書並びに関連するファイル群を消去して、クライアントの秘密鍵及び証明書を作成し、問題を解決します。

  1. OpenVPNサーバ側で誤って作成してしまった(本来は)サーバ用の秘密鍵及び証明書並びに関連するファイル群を消去またはファイルの中身を空にします。
    [panda@pandanote.info easyrsa3]\$ cp /dev/null pki/index.txt
    [panda@pandanote.info easyrsa3]\$ rm ./pki/private/client.key
    [panda@pandanote.info easyrsa3]$ rm ./pki/reqs/client.req

     

  2. OpenVPNサーバ側の作業用のディレクトリで以下のコマンドを実行し、クライアントの秘密鍵及び証明書を作成します。
    [panda@pandanote.info easyrsa3]$ sh ./easyrsa build-client-full client nopass
    Generating a 2048 bit RSA private key
    …………………………………………………..+++
    …………………..+++
    writing new private key to ‘/home/panda/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/client.key.5hnIpxYUJs’
    —–
    Using configuration from ./openssl-easyrsa.cnf
    Enter pass phrase for /home/panda/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/ca.key:
    Check that the request matches the signature
    Signature ok
    The Subject’s Distinguished Name is as follows
    commonName :ASN.1 12:’client’
    Certificate is to be certified until May 15 11:02:46 2028 GMT (3650 days)

    Write out database with 1 new entries
    Data Base Updated

     

  3. 上記の手順で作成した秘密鍵及び証明書をOpenVPNクライアントの/etc/openvpn/clientの下にコピーします。
  4. OpenVPNクライアントでroot権限で以下のコマンドを実行します。
    [root@nuc panda]# systemctl start openvpn-client@client

     


スポンサーリンク

ここで、OpenVPNサーバ側のログファイル(/var/log/openvpn.log)を確認してみると…

xxx.yyy.zzz.ttt:40899 VERIFY OK: depth=1, CN=Easy-RSA CA
sss.ppp.qqq.rrr:40899 VERIFY OK: depth=0, CN=client

 
うまくいったようです。

pingコマンドも通ります。(`・ω・´)

ハマったところその2: ルーティングの設定でハマる。

前項で書いた問題が解決すると、OpenVPNサーバとOpenVPNクライアントの間は下図(オレンジ色の矢印を除く。)のように接続されることになります。なお、OpenVPNに関連しない機器及び接続等の情報については図から(かなり大幅に)省略しています。


オレンジ色の矢印部分はOpenVPNクライアント側で(自宅用)DNSサーバやWebサーバを動かしているので追加の設定が必要なところになります。これは、(自宅用)DNSサーバやWebサーバのIPアドレスとしてLANのインタフェース(wlp58s0)に割り当てているものを使用しているので、tunによるトンネルから出たところで、再度LANのインタフェースへアクセスをさせる必要があることによるものです。

ところが、この設定ができずに(本来必要ないはずの)ipコマンドを使っていろいろと設定をしてみて、思い通りの動きにならないことを確認する作業を1日半くらい繰り返すことになってしまいました。

その途中で何となく「irouteっていう見慣れない設定項目があるなぁ。」とは思っていたんですけどね… (´・ω・`)


スポンサーリンク

それで、最終的にはここを見直して(というよりはGoogle先生にお伺いした結果たどり着いたんですが…)、以下の手順で設定及び再起動を行うことで、上図のオレンジ色の矢印の部分の設定を行うことができました。

  1. OpenVPNサーバ側の設定ファイル(/etc/openvpn/server/server.conf)に以下の設定を追加します(または、コメントになっている設定をアンコメントして編集します。)。なお、
    2行目のrouteの192.168.xyz.0の部分にはアクセスしたいIPアドレスが属するサブネットを指定します。

    client-config-dir /etc/openvpn/server/ccd
    route 192.168.xyz.0 255.255.255.0

     

  2. 手順1のclient-config-dirで指定したディレクトリの下にあるクライアント用の設定ファイル(クライアント名と同一のファイル名になっています。)を以下のように変更します。なお、
    このファイルでも、2行目のirouteの192.168.xyz.0の部分にはアクセスしたいIPアドレスが属するサブネットを指定します。

    ifconfig-push 192.168.aaa.bbb 192.168.aaa.ccc
    iroute 192.168.xyz.0 255.255.255.0

     

  3. OpenVPNクライアント側で以下のコマンドを実行し、openvpnを再起動します。

    [root@nuc panda]# systemctl start openvpn-client@client

     

  4. クライアント及びサーバの双方からpingコマンドを実行し、レスポンスが返ってくることを確認します。

結局のところ、irouteの設定を指定していなかったのが原因だったようです…

ハマったところその3: 証明書失効リスト(CRL)の期限切れでハマる。[2018/11/15,2020/06/23追記]

そんなこんなで、OpenVPNを使い始めて早くも半年が経過しました。

OpenVPNで半年運用とくれば、ピンとこない方以外はピンとくると思いますが、デフォルトの設定のままで作成した証明書失効リスト(CRL)が期限切れを迎えるわけです。

単純にCRLを作り直しても良いのですが、そうすると半年後にまた同じ作業を行う必要がありますので、有効期限も長くしたいところです。

そこで、以下の手順でCRLを再作成し、サーバに再作成した旨を反映させました。

  1. easyrsaシェルスクリプトがあるディレクトリに設定ファイル(vars)があるので、設定ファイルを適当なエディタで開き、
    #set_var EASYRSA_CRL_DAYS 180

     
    となっている部分を、以下のように変更して保存します。安定のおよそ10年保証です。(`・ω・´)

    set_var EASYRSA_CRL_DAYS 3650

     

  2. easyrsaが実行可能なユーザ権限で、以下のコマンドを実行します。
    $ ./easyrsa gen-crl

     

  3. root権限で以下のコマンドを実行し、手順1で作成したcrl.pemを/etc/openvpn/serverの下にコピーします。
    # cp pki/crl.pem /etc/openvpn/server/

     

  4. root権限で以下のコマンドを実行し、crl.pemの変更を反映させます。
    # systemctl restart openvpn-server@server

     

ハマったところその4: OpenVPNのためのSELinuxポリシーを変更する際にポリシー名を”openvpn”にしたためにハマる。[2020/06/23追記]

こちら(panda大学習帳外伝)に書きましたので、御用とお急ぎでない方はご覧いただけると幸いです。

まとめ

ここまでの設定で、OpenVPNによるVPNがようやく使えるレベルに達しました。これで、PPTPによるVPNはもう使わなくてもよくなりそうです。また、CRLの有効期限に悩まされることも当面の間なさそうです。

毎度「$n$選」といいながら$n=3$であることが多いんですけど、この記事は最初は$n=2$で始まって順調に増加し、$n=4$となりました。

Google先生に聞いてみた感じではLinuxがOpenVPNクライアントになる例があまり多くなかったですが、鍵の生成のところがクリアできてしまえば、クライアント固有でかつ必須の設定項目は多くはないと思います。

ご参考にしていただけると幸いです。

この記事は以上です。