Ubuntu Server で OpenVPNサーバを構築する

はじめに

今回構築する OpenVPNサーバ は、以前に下記リンクの備忘録を書いているため、説明等の詳細は割愛させていただきます。
tryota.hatenablog.com

パッケージのインストール

# apt install openvpn easy-rsa

OpenVPN Server

サーバ証明書の発行

サーバ証明書を発行するのに必要なものは、以下になる。

  • 公開鍵ペア(public.key , private.key)
  • 証明書署名要求(certificate signing request)
  • DHパラメータ(pemファイル)

証明書発行用のディレクトリを作成する

ubuntu には、専用コマンド make-cadir があるので、これを使用してディレクトリを作成する。

# make-cadir /etc/openvpn/easy-rsa

カレントディレクトリを移動する

# cd /etc/openvpn/easy-rsa

作成したディレクトリの配下にファイルとディレクトリが作成されたことを確認する。

# ls
easyrsa  openssl-easyrsa.cnf  vars  x509-types

証明書作成用の環境変数を編集する

vars ファイルを編集する

# vim vars

varsファイルの以下の値を正しく編集する

set_var EASYRSA_REQ_COUNTRY     "JP"
set_var EASYRSA_REQ_PROVINCE    "Hyogo"
set_var EASYRSA_REQ_CITY        "Akashi"
set_var EASYRSA_REQ_ORG         "OpenVPNServer"
set_var EASYRSA_REQ_EMAIL       "me@example.net"
set_var EASYRSA_REQ_OU          "My Organizational Unit"

PKIを作成する

Public Key Infrastractur (公開鍵基盤)のフォルダを作成する。

# ./easyrsa init-pki

認証局を作成する

CA(Certificate Authority)の作成をする。

./easyrsa build-ca

パスフレーズとCommonNameを問われるので、それとなく適当に入力

Enter New CA Key Passphrase:test
Re-Enter New CA Key Passphrase:test

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:OpenvpnSV

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt

作成されたことを確認する。
pki フォルダ内に以下が作成されていればOK。

  • ca.crt
  • private/ca.key

サーバ秘密鍵と証明書署名要求を作成する

※「server」の部分は任意。秘密鍵と証明書署名要求ファイルの名前に使われる。

# ./easyrsa gen-req server

Enter PEM pass phrase:test
Verifying - Enter PEM pass phrase:test

Common Name (eg: your user, host, or server name) [server]:opoenvpnSV

Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/pki/private/server.key

作成されたことを確認する。
pki フォルダ内に以下が作成されていればOK。

  • reqs/server.req
  • private/server.key

サーバ証明書の作成

サーバ証明書に署名する際は、引数を先ほど作成した証明書署名要求「server.req」を指定する。(拡張子は不要)

# ./easyrsa sign-req server server

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:test

Certificate created at: /etc/openvpn/easy-rsa/pki/issued/server.crt

作成されたことを確認する。
pki フォルダ内に以下が作成されていればOK。

  • issued/server.crt

DHパラメータの生成

Diffie-Hellman 鍵交換は、暗号鍵を安全に転送するために使用される方法です。

# ./easyrsa gen-dh

作成されたことを確認する。
pki フォルダ内に以下が作成されていればOK。

  • dh.pem

TLS-Authキーの生成

openvpnでは、セキュリティを向上させるために TLS-Authキー(ta.key)を実装している。

# openvpn --genkey --secret ta.key

作成されたことを確認する。
easy-rsa フォルダ内に以下が作成されていればOK。

  • ta.key

OpenVPNサーバの構築に必要なファイルを移動する

必要なファイルは以下のものになる。

  • ca.crt
  • server.crt
  • server.key
  • dh2048.pem
  • ta.key

上記のファイルを「/etc/openvpn/server/」ディレクトリの配下にコピーする。

OpenVPNサーバの構成ファイルをコピーする

デフォルトのままだと、openvpnサーバの構成ファイルは「/etc/openvpn」フォルダには存在しないため、openvpnパッケージに付属している構成ファイルのテンプレートをコピーしてくる必要がある。

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
# cd /etc/openvpn/server
# gunzip server.conf.gz

OpenVPNサーバの構成ファイルを編集する

# vim server.conf

以下の行を編集・追記する
78 ca ca.crt
79 cert server.crt
80 key server.key
85 dh dh2048.pem
143 push "route 192.168.1.0 255.255.255.0" #追加
245 tls-auth ta.key 0

OpenVPN Client

クライアント秘密鍵と証明書署名要求を作成する

# cd /etc/openvpn/easy-rsa
# ./easyrsa gen-req client nopass

Common Name (eg: your user, host, or server name) [client_test]:test

Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/client_test.req
key: /etc/openvpn/easy-rsa/pki/private/client_test.key

作成されたことを確認する。
pki フォルダ内に以下が作成されていればOK。

  • reqs/client_test.req
  • private/client_test.key

クライアント証明書を作成する

クライアント証明書に署名する際は、引数を先ほど作成した証明書署名要求「client_test.req」を指定する。(拡張子は不要)

# ./easyrsa sign-req client client_test

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:test
Certificate created at: /etc/openvpn/easy-rsa/pki/issued/client_test.crt

作成されたことを確認する。
pki フォルダ内に以下が作成されていればOK。

  • issued/client_test.crt

OpenVPNクライアント用に必要なファイルを移動する

  • ca.crt
  • client_test.key
  • client_test.crt
  • ta.key

上記のファイルを「/etc/openvpn/client/」ディレクトリの配下にコピーする。
(ca.crt , ta.key はコピーしなくてもよい)
「/etc/openvpn/client/」ディレクトリが無ければ、作成する

OpenVPNクライアントの構成ファイルをコピーする

デフォルトのままだと、openvpnクライアントの構成ファイルは「/etc/openvpn」フォルダには存在しないため、openvpnパッケージに付属している構成ファイルのテンプレートをコピーしてくる必要がある。

# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/
# cd /etc/openvpn/client

OpenVPNクライアントの構成ファイルを編集する

# vim client.conf

以下の行を編集する
42 remote {openvpnサーバのホスト名(又はIPアドレス)} 1194
61 user nobody #[;]を外す
62 group nogroup #[;]を外す

認証局の証明書を追記
# ca.crt  コメントアウトする
<ca>
-----BEGIN CERTIFICATE-----
MII.....
......AD
-----END CERTIFICATE-----
</ca>
クライアント証明書を追記
# cert client.crt  コメントアウトする
<ca>
-----BEGIN CERTIFICATE-----
MII.....
......=F
-----END CERTIFICATE-----
</ca>
クライアント秘密鍵を追記
# key client.key  コメントアウトする
<key>
-----BEGIN PRIVATE KEY-----
MII.....
......YR
-----END PRIVATE KEY-----
</key>
TLS認証のクライアントとして認識させるための設定

以下を先ほどの下あたりに追記する

key-direction 1
tls-autキーを追記する
 # tls-auth ta.key 1  コメントアウトする
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
42....
......GT
-----END OpenVPN Static key V1-----
</tls-auth>

OpenVPNクライアントの構成ファイルの拡張子を変更する

# mv client.conf client.ovpn

OpenvpnサーバでIPフォワーディングの設定をする

# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
# sysctl -p

firewall の無効化

設定が面倒なので、[ufw.service]を無効化する

# systemctl stop ufw.service
# systemctl disable ufw.service

クライアント用のOpenVPN構成ファイルを移動する

先ほど作成した「/etc/openvpn/client/client.ovpn」ファイルをVPNクライアントとして使用したい端末に移動させる。
その際、クライアント側にOpenVPNが使用できるソフトウェアが必要になる。