メインコンテンツへスキップ

OpenVPNサーバの構築

··2 分·
Todo Linux Openvpn
Makoto Morinaga
著者
Makoto Morinaga
技術メモ、コーディング、環境構築のための個人ノート。
目次

外出している際に、自宅内LANで提供しているサービスにアクセスしたくなる時がありますので、OpenVPNを使って自宅外のネットワークから自宅内LANへVPNを張って、セキュアな暗号化した通信を実現します。

なお、今回はArchLinuxにおけるOpenVPNの設定として、セキュリティ上の理由から認証局(CA)サーバとVPNサーバは分離して構築します。機器としては、以下の通りです。

  • CAサーバ:クライアントとVPNサーバの証明書へ署名を行う認証局サーバ
  • VPNサーバ:自宅外のネットワークに接続しているクライアントとVPNを張るサーバ
  • クライアント:自宅外のネットワークに接続しているクライアント端末(iPhoneやPC等)

CAサーバの構築
#

easy-rsaのインストール
#

CAサーバにて以下のコマンドでeasy-rsaをインストールします:

Terminal
# Arch Linux
sudo pacman -S easy-rsa

CAの初期化
#

CAサーバにて以下のコマンドでPKIを初期化し、CAを構築します。

Terminal
cd /etc/easy-rsa
# Arch Linux
sudo easyrsa init-pki
sudo easyrsa build-ca

上記の実行途中で、「Enter New CA Key Passphrase:」と表示されるので、CAのパスフレーズを任意に決めて、入力します。 Common Nameも聞かれるが、デフォルト値のままとします。

VPNサーバの構築
#

OpenVPNとeasy-rsaのインストール
#

VPNサーバにて以下のコマンドでOepnVPNとeasy-rsaをインストールします:

Terminal
# Arch Linux
sudo pacman -S openvpn easy-rsa

CA公開証明書のコピー
#

作成したCAサーバのCA公開鍵/etc/easy-rsa/pki/ca.crtをVPNサーバの/etc/openvpn/server/配下に保存します。保存時のca.crtのアクセス権はrootとします。

Terminal
# example
scp /etc/easy-rsa/pki/ca.crt vpn-server:/etc/openvpn/server/

サーバ証明書の作成
#

VPNサーバにて以下のコマンドでPKIを初期化し、サーバ証明書を作成します:

Terminal
cd /etc/easy-rsa
sudo easyrsa init-pki
sudo easyrsa gen-req server nopass
sudo cp /etc/easy-rsa/pki/private/server.key /etc/openvpn/server/

上記の実行途中にCommon Nameを聞かれますが、デフォルト値のままとします。 上記を実行すると、以下のファイルが作成されます。

  • /etc/easy-rsa/pki/reqs/server.req
  • /etc/easy-rsa/pki/private/server.key

Diffie-Hellman (DH) パラメータファイルの作成
#

VPNサーバにて以下のコマンドを実行して、DHパラメータファイルを作成します:

Terminal
sudo openssl dhparam -out /etc/openvpn/server/dh.pem 2048

Hash-based Message Authentication Code (HMAC) 鍵の作成
#

VPNサーバにて以下のコマンドを実行して、HMAC鍵を作成します。

Terminal
sudo openvpn --genkey --secret /etc/openvpn/server/ta.key

上記のコマンドで全てのSSL/TLSハンドシェイクパケットにHMAC署名が追加され、適切なHMAC署名が存在しないUDPパケットが拒否されるため、以下の攻撃を防ぎます。

  • ポートスキャン
  • OpenVPN の UDP ポートに対する DOS 攻撃
  • 未権限のマシンからの SSL/TLS ハンドシェイク
  • SSL/TLS 実装のバッファオーバーフロー脆弱性に対する攻撃

OpenVPNクライアントファイルの作成
#

Generating Client Certificates
#

クライアント用のOpenVPNクライアントファイルを作成します。easy-rsaがインストールされていれば作成できますので、今回はVPNサーバ上で作成します。

VPNサーバにて以下のコマンドを実行して、クライアント証明書を作成します:

Terminal
cd /etc/easy-rsa
sudo easyrsa gen-req client1 nopass

上記の実行途中にCommon Nameを聞かれるが、デフォルト値のままとする。 上記を実行すると、以下のファイルが作成される:

  • /etc/easy-rsa/pki/reqs/client1.req
  • /etc/easy-rsa/pki/private/client1.key

サーバ/クライアント証明書への署名
#

Terminal
scp /etc/easy-rsa/pki/reqs/{server,client1}.req ca-server:/tmp/

CAサーバでの署名
#

CAサーバにて以下のコマンドを実行し、証明書要求をインポートして署名します:

Terminal
cd /etc/easy-rsa
sudo easyrsa import-req /tmp/server.req server
sudo easyrsa import-req /tmp/client1.req client1
sudo easyrsa sign-req server server
sudo easyrsa sign-req client client1

上記の途中でCAのパスフレーズを聞かれるので、CAの構築で設定したパスフレーズを入力します。 上記を実行すると、以下のファイルが作成されます。

  • /etc/easy-rsa/pki/issued/server.crt
  • /etc/easy-rsa/pki/issued/client1.crt

VPNサーバとクライアントへのCA署名済証明書のコピー
#

Terminal
scp /etc/easy-rsa/pki/issued/server.crt vpn-server:/etc/openvpn/server/

OpenVPNの設定
#

サンプルファイルのコピー
#

VPNサーバにて以下のコマンドでOpenVPNのサンプルファイルをコピーします:

Terminal
sudo cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/

server.confの更新
#

上記でコピーしたserver.confを以下の通り設定します。

  • Certificate and key settings:

    /etc/openvpn/server/
    ca ca.crt
    cert server.crt
    key server.key
    dh dh.pem
  • HMAC key:

    /etc/openvpn/server/server.conf
    tls-auth ta.key 0
  • Running OpenVPN as a non-root user:

    /etc/openvpn/server/server.conf
    user nobody
    group nobody
  • Port and protocol:

    /etc/openvpn/server/server.conf
    port 1194
    proto udp
  • Subnet:

    /etc/openvpn/server/server.conf
    server 10.8.0.0 255.255.255.0
  • Encryption settings:

    /etc/openvpn/server/server.conf
    cipher AES-256-GCM
    auth SHA512
    tls-version-min 1.3
  • Compression:

    /etc/openvpn/server/server.conf
    compress lz4-v2a
    push "compress lz4-v2"
  • Routing all traffic through VPN:

    /etc/openvpn/server/server.conf
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 1.1.1.1"

VPNサーバ動作確認
#

VPNサーバにてrootアカウントで以下のコマンドを実行し、エラーが無いことを確認します。

Terminal
cd /etc/openvpn/server
openvpn /etc/openvpn/server/server.conf

以下のようなエラーが出た場合は、一度VPNサーバを再起動して、再度上記コマンドを実行します。

Terminal
Cannot open TUN/TAP dev /dev/net/tun: No such device

OpenVPNのサービス化
#

Terminal
sudo systemctl start [email protected]
sudo systemctl enable [email protected]

FWのアクセス許可
#

VPNサーバ上のiptablesでUDP1194番ポートへアクセスを許可します。 iptablesの具体的な設定方法は、iptablesの設定 の記事をご参照ください。

Terminal
iptables -A INPUT -p udp --dport 1194 -j ACCEPT

また、VPNサーバ上でアクセスを許可したいサービスがあれば、以下のように、10.8.0.0/24からの通信を許可します。

Terminal
iptables -A INPUT -p tcp -s 10.8.0.0/24 —dport 22 -j ACCEPT

さら、VPN経由でインターネットや他のサーバにアクセスする場合は、以下のように10.8.0.0/24からの通信を許可します。 ここでは、【インターフェース名】はens192とします。

Terminal
iptables -t nat -A POSTROUTING -o 【インターフェース名】 -s 10.8.0.0/24 -j MASQUERADE
iptables -I FORWARD -o 【インターフェース名】 -s 10.8.0.0/24 -j ACCEPT

クライアントプロファイルの作成
#

ovpngenのインストール
#

Terminal
# Arch Linux
yay -S ovpngen

yayを導入していない場合は、yayのインストール を参照して、インストールしてください。

クライアントプロファイルの作成
#

Ovpngenは5つの以下の引数を指定して、スクリプトを起動します。

  • OpenVPN サーバーのドメイン名 (またはIPアドレス)
  • CA 証明書のフルパス(ca.crt)
  • クライアント証明書のフルパス(client1.crt)
  • クライアント秘密鍵のフルパス(client.key)
  • サーバーTLS共有秘密鍵のフルパス(ta.key)

以下が例になります。以下のコマンドを実行すると、client.ovpnが作成されます。

Terminal
ovpngen vpn.example.com /etc/openvpn/server/ca.crt \
 /etc/easy-rsa/pki/issued/client1.crt \
 /etc/easy-rsa/pki/private/client1.key \
 /etc/openvpn/server/ta.key > client.ovpn

クライアントプロファイルの編集
#

作成されたclient.ovpnを以下のように編集して、cipherとauthの値をVPNサーバと合わせます:

client.ovpn
cipher AES-256-GCM
auth SHA512

クライアントからの接続
#

クライアントからの接続で作成したclient.opvnをクライアント(macやiPhone)に適宜コピーの上、VPN接続ソフトにインポートして、VPN接続を行います。

OS Software
macOS Tunnelblick
iOS OpenVPN Connect

関連記事

NginxによるWebサーバの構築
··1 分
Linux Nginx
SambaによるTime Machineバックアップ
··1 分
Linux Macos Time-Machine Samba
Borgによる差分バックアップシステムの構築
··2 分
Backup Linux Borg