はじめに
自宅でLinuxサーバ(?)として使用していた小型PC(AOpen MP67-D、以下単に「小型PC」と書きます。)をIntel NUC(NUC7i5BNH、以下単に「NUC」と書きます↓)
と交換するべく、仕事や買い物の合間を縫ってデータ等の移行作業が大好評進行中(2018年5月現在)です。
そこで、データ移行のついでにクラウドサーバと自宅のNUCの間のVPNをOpenVPNを使って接続することとしました。
この記事ではOpenVPNの設定やインストールの方法について書いていきます。
クラウドサーバ側でのOpenVPNのインストール
OpenVPNは以下のコマンドをroot権限で実行するとインストールできます。
easy-rsa-3.0.5のダウンロード
GitHubからeasy-rsa-3.0.5のパッケージをZIPファイルとしてダウンロードします。ZIPファイルをダウンロードしたら、それをクラウドサーバ上の適当なディレクトリの下に展開します。すると、easy-rsa-3.0.5という名前のディレクトリが作られて、その下に以下のファイルやディレクトリが展開されます。
認証局、証明書及び秘密鍵並びにその他もろもろの作成
以下の作業では認証局を作成後、証明書等を前項のリストのうちのeasyrsa3ディレクトリの下で作成していきます。
認証局の初期化
以下のコマンドを実行し、認証局を初期化します。
このコマンドを実行すると、easyrsaと同じディレクトリにpkiディレクトリが作成されます。
認証局の作成
スポンサーリンク
以下のコマンドを実行し、認証局を作成します。Common Nameはデフォルト値としました。
証明書失効リスト(CRL)の作成
以下のコマンドを実行し、証明書失効リスト(CRL)を作成します。
なお、/var/log/openvpn.logに
というような感じのログ(CRLの有効期限が切れたことを知らせるエラー)が表示された場合も、上記のコマンドを実行し、生成されたcrl.pemを/etc/openvpn/serverの下にコピーすると良いようです。
DHパラメータの生成
以下のコマンドを実行し、DH(Diffie-Hellman)パラメータを生成します。パラメータの生成には時間がかかりますので、ひたすら待ちます。
サーバ用秘密鍵及び証明書の作成
以下のコマンドを実行し、サーバ用秘密鍵及び証明書を作成します。第2引数にはファイル名を指定します。また、接続開始時のパスフレーズを不要としたい場合には”nopass”を引数として追加します。
[panda@pandanote.info easyrsa3]$ ./easyrsa build-server-full pandanote.info nopass Generating a 2048 bit RSA private key ..............+++ ................................+++ writing new private key to '/home/panda/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/pandanote.info.key.qqs3TxRYZA' ----- Using configuration from ./openssl-easyrsa.cnf Enter pass phrase for /home/panda/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/ca.key: Can't open /home/panda/openvpn/easy-rsa-3.0.5/easyrsa3/pki/index.txt.attr for reading, No such file or directory 140257658697472:error:02001002:system library:fopen:No such file or directory:crypto/bio/bss_file.c:74:fopen('/home/panda/openvpn/easy-rsa-3.0.5/easyrsa3/pki/index.txt.attr','r') 140257658697472:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:81: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'pandanote.info' Certificate is to be certified until May 13 14:00:07 2028 GMT (3650 days) Write out database with 1 new entries Data Base Updated
クライアント用秘密鍵及び証明書の作成
以下のコマンドを実行し、クライアント用秘密鍵及び証明書を作成します。第2引数にはクライアント名を指定します。
クライアント名はちょっと手を抜いています。(´・ω・`)
また、接続開始時のパスフレーズを不要としたい場合には”nopass”を第3引数として追加します。
上記のコマンドを実行すると、以下のファイルが作成されます。<第2引数で指定した文字列>を変更した場合にはクライアント用の設定ファイルの変更が必要です。
- 秘密鍵(pki/privateの下に作成されます。): <第2引数で指定した文字列>.key
- 証明書(pki/issuedの下に作成されます。): <第2引数で指定した文字列>.crt
OpenVPNサーバとしてのセットアップ
認証局、証明書及び秘密鍵並びにその他もろもろが作成できたら、クラウドサーバをOpenVPNにサーバとしてセットアップします。
サービス名の選択
クラウドサーバがOpenVPNサーバになりますので、そのための設定を行います。なお、Fedora 26 ServerではOpenVPNに対応したサービス名が以下の3個あります。
- openvpn-client
- openvpn-server
- openvpn
/lib/systemdの下に上記のサービス名にそれぞれ対応する起動及び終了用のスクリプトがありますので、それらのファイルの内容を確認しておきます。その上でどのサービスを使用するかを決めます。クラウドサーバ側ではopenvpn-serverをサービスとして使用することとしました。
TLS認証鍵の作成
以下のコマンドを実行し、TLS認証鍵を作成します。作成したTLS認証鍵は /etc/openvpn/serverディレクトリの下に直接置いてしまいます。
設定用のファイルのコピー
root権限で以下のコマンドを実行し、「認証局、証明書及び秘密鍵並びにその他もろもろの作成」の項で作成したファイルを起動及び終了用のスクリプトで指定されているディレクトリの下にコピーします。SELinuxを”enforcing”に設定している場合にはchconコマンドも実行します。
server.confの設定
/usr/share/doc/openvpn/sample/sample-config-filesの下に設定ファイルのサンプル(server.conf)がありますので、これを/etc/openvpn/serverの下にコピーしてから、以下のように修正または追加します(コメント行が多いので、修正した部分と追加した部分のみを示します)。なお、ファイルパスは絶対パスまたは作業ディレクトリからの相対パスを指定します。また、ユーザID及びグループ名はnobodyではなく、openvpnを指定しています(こうしないと、client-config-dirの下のファイルが読めませんでした)。
[2022/04/12 補足] VORACLE攻撃を防ぐため、comp-lzoの設定は削除(上記の設定例ではコメントアウト)しました(VORACLE攻撃の詳細については[2]参照)。
SELinuxの設定の変更
OpenVPNの管理インタフェースを追加しているので、以下のコマンドを実行し、追加の際に指定したポート番号をOpenVPNが(SELinuxが有効になっている場合でも)管理インタフェースとして使用できるようにします。
firewallの設定の変更
OpenVPNサーバはデフォルトの設定ではUDPの1194番ポートを使用しますので、OpenVPNサーバの起動の前にroot権限で以下のコマンドを実行し、使用可能な状態にしておきます。
ルータの設定
ルータの設定でUDPの1194番ポートを通過させるように設定します。具体的な設定の方法についてはルータごとに異なりますので、本記事では省略します。
OpenVPNサーバの起動
root権限で以下のコマンドを実行し、NUCのブート時にOpenVPNが自動的に起動するように設定しておきます。なお、第2引数のアットマークの後ろの文字列は、作業用ディレクトリ(/etc/openvpn/server)の下に置いた設定ファイルのファイル名のうち拡張子を除いたものを指定します。
次にroot権限で以下のコマンドを実行し、OpenVPNを起動します。
この時点ではまだクライアントの設定を行っていませんが、以下のコマンドを実行し、tunインターフェースが存在することを確認します。
まだ接続ができていませんが、tunインターフェースが追加されているようです。
これで、OpenVPNクライアントからの接続を受け付けるための準備が整いました。
OpenVPNクライアント側でのOpenVPNのインストール
OpenVPNサーバの設定が完了したら、OpenVPNクライアント側になるNUC側のインストール及び設定を行います。
OpenVPNは以下のコマンドをroot権限で実行するとインストールできます。
クライアント証明書及び秘密鍵並びにその他もろもろの設定
サービス名の選択
NUCがOpenVPNクライアントになりますので、そのための設定を行います。なお、Fedora 27 ServerではOpenVPNに対応したサービス名が以下の2個あります。
- openvpn-client
- openvpn-server
サーバ側と同様に/lib/systemdの下に上記のサービス名にそれぞれ対応する起動及び終了用のスクリプトがありますので、それらのファイルの内容を確認しておきます。その上でどのサービスを使用するかを決めます。NUC側ではopenvpn-clientをサービスとして使用することとしました。
サーバからのファイルのコピー
サーバから以下のファイルをNUCの/etc/openvpn/clientにコピーします。
- easy-rsaで作成したCAの証明書(ca.crt)、クライアントの証明書(client.crt)及び秘密鍵(client.key)
- /etc/openvpn/serverに作成したTLS認証鍵(ta.key)
client.confの設定
/usr/share/doc/openvpn/sample/sample-config-filesの下に設定ファイルのサンプル(client.conf)がありますので、これを/etc/openvpn/clientの下にコピーしてから、以下のように修正または追加します(コメント行が多いので、修正した部分と追加した部分のみを示します)。なお、ファイルパスは絶対パスまたは作業ディレクトリからの相対パスを指定します。
[2022/04/12 補足] VORACLE攻撃を防ぐため、comp-lzoの設定は削除(上記の設定例ではコメントアウト)しました(VORACLE攻撃の詳細については[2]参照)。
また、クライアントの証明書のファイル名がclient.crtでない場合、または秘密鍵のファイル名がclient.keyでない場合には上記の設定に加えて以下の設定が必要です。
SELinux用のコンテキストの変更
SELinuxを有効(enforcing)に設定している場合には以下のコマンドを実行し、設定ファイルなどののコンテキストを変更しておきます。
OpenVPNの起動
root権限で以下のコマンドを実行し、NUCのブート時にOpenVPNが自動的に起動するように設定しておきます。なお、第2引数のアットマークの後ろの文字列は、作業用ディレクトリ(/etc/openvpn/client)の下に置いた設定ファイルのファイル名のうち拡張子を除いたものを指定します。
次にroot権限で以下のコマンドを実行し、OpenVPNを起動します。
最後に以下のコマンドを実行し、クライアント側でもインターフェースが作成されていることと、pingが通ることを確認します。
これで、ひとまず設定は完了です。
お疲れさまでした!!
まとめ
NUCへの移行の前まではPPTPを使ってVPNを構成してクラウドサーバと自宅のLinuxサーバ(?)の間を接続していましたが、移行作業を行っていた時点(2018年5月時点)ではPPTPを使い続けるのはあまりお勧めされなくなってきていましたので、OpenVPNへの移行もついでにすませてしまうこととした次第です。
セキュリティ関連のソフトウェアは設定項目が大量にあるものが多いですが、OpenVPNはそれに通信の確認作業もあるので、正直きついですね…
何とかしてください… (´・ω・`)
実は疎通確認の作業でかなりハマったので、次の記事でそれについて書きます。
この記事は以上です。