仮想プライベートネットワーク(VPN)を使用すると、プライベートネットワークにいるかのように、安全でないネットワークを通過できます。ホテルやカフェのWiFiなどで、安全でないネットワークに接続した際、スマートフォンやノートからインターネットに確実かつ安全にアクセスできます。
HTTPS接続と組み合わせると、このセットアップによりワイヤレスログインとトランザクションを保護できます。地理的な制限と検閲を回避し、あなたのいる場所と暗号化されていないHTTPトラフィックを安全でないネットワークから保護できます。
OpenVPNは、は、幅広い設定に対応するフル機能のオープンソースのトランスポート層セキュリティ(Transport Layer Security: TLS)VPNソリューションです。 このチュートリアルでは、Ubuntu 20.04サーバーでOpenVPNをセットアップし、クライアントマシンからアクセスできるように設定します。
注: DigitalOcean DropletにOpenVPNサーバーをセットアップする場合は、多くのホストプロバイダー同様、帯域超過分が請求されることにご注意ください。 こうした理由から、サーバーが処理するトラフィックの量にご注意ください。
詳しくは、このページをご覧ください。
このチュートリアルを実行するには、次が必要です。
注: OpenVPNサーバーやローカルマシンをCAとして使用することは技術的に可能ですが、VPNをいくつかのセキュリティの脆弱性にさらすため、これは推奨されません。 OpenVPNの公式ドキュメントに従って、証明書要求のインポートと署名専用のスタンドアロンマシンにCAを配置する必要があります。このため、このガイドでは、CAが、sudo権限を持つroot以外のユーザーと基本的なファイアウォールが有効な別個のUbuntu 20.04サーバーにあると想定します。
OpenVPNサーバーへの接続に使用するクライアントマシン。このガイドでは、OpenVPNクライアントと呼びます。このチュートリアルの目的上、ローカルマシンをOpenVPNクライアントとして使用することをお勧めします。
これらの前提条件が整ったところで、Ubuntu 20.04でOpenVPNサーバーのセットアップと設定を開始します。
注: これらのサーバーの設定中にパスワード認証を無効にすると、このガイドの後半、サーバー間でファイル転送するときに問題が発生する可能性があることに注意してください。この問題を解決するには、各サーバーでパスワード認証を有効に戻します。代わりに、各サーバーのSSHの鍵ペアを生成し、OpenVPNサーバーの公開SSH鍵をCAマシンのauthorized_keys
に追加し、またその逆も行う、という方法もあります。 これらのソリューションの実施方法については、Ubuntu 20.04でSSHの鍵を設定する方法をご覧ください。
最初にOpenVPNとEasy-RSAをにインストールします。Easy-RSAは公開鍵基盤(Pubulic Key Infrastructure: PKI)管理ツールです。これを使用して、OpenVPNサーバーで認証要求を生成し、その認証要求をCAサーバーで検証・署名します。
まず、OpenVPNサーバーのパッケージインデックスを更新し、OpenVPNとEasy-RSAをインストールします。どちらのパッケージもUbuntuのデフォルトリポジトリにあるので、apt
を使用してインストールします。
- sudo apt update
- sudo apt install openvpn easy-rsa
次に、root以外のユーザーとしてOpenVPNサーバーに新しいディレクトリ ~/easy-rsa
を作成します。
- mkdir ~/easy-rsa
作成したばかりの ~/easy-rsa
ディレクトリにインストールされたeasyrsa
スクリプトからシンボリック・リンクを作成します。
- ln -s /usr/share/easy-rsa/* ~/easy-rsa/
注: 他のガイドでは、easyrsa
パッケージファイルをPKIディレクトリにコピーするよう指示しているものもありますが、このチュートリアルでは、シンボリック・リンクを採用します。その結果、easy-rsa
パッケージの更新は、自動的にPKIのスクリプトに反映されます。
最後に、ディレクトリの所有者はsudok権限を持つroot以外のユーザーであることを確認し、chmod
を使用してこのユーザーへのアクセスを制限します。
- sudo chown sammy ~/easy-rsa
- chmod 700 ~/easy-rsa
これらのプログラムがインストールされ、システムの正しい場所に移動したら、次のステップは、OpenVPNサーバーにPublic Key Infrastructure (PKI)を作成し、VPNに接続するクライアントやその他のサーバーのTLS証明書を要求・管理することです。
OpenVPNサーバーの秘密の鍵と証明書を作成する前に、OpenVPNサーバーのローカルにPKIディレクトリを作成します。 このディレクトリを使用して、CAサーバーで直接証明書を作成する代わりに、サーバーとクライアントの証明書要求を管理します。
OpenVPNサーバーにPKIディレクトリを作成するには、vars
というファイルにデフォルト値をいくつか入力します。まず、cd
でeasy-rsa
ディレクトリに移動し、nanoか好みのテキストエディターを使用してvars
ファイルを作成・編集します。
- cd ~/easy-rsa
- nano vars
ファイルを開いたら、次の2行を貼り付けします。
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
vars
ファイルを認証局として使用しないため、OpenVPNサーバーにあるこのvarファイルに必要なのはこの2行だけです。これにより、秘密の鍵と証明書要求が、今日の楕円曲線暗号(Elliptic Curve Cryptography: ECC)を使用するように設定され、ECCはクライアントとOpenVPNサーバーの鍵と安全な署名を生成します。
OpenVPNとCAサーバーを ECCを使用するように設定すると、クライアントとサーバーが共有対称の鍵の確立を試みる際に、楕円曲線アルゴリズムを使用してやり取りできるようになります。 ECCは、古典的なRSAアルゴリズムのプレーンなDiffie-Hellmanよりも数字がはるかに小さく、計算が早くできるため、ECCを使用すれば鍵の交換時間がかなり短縮できます。
背景: クライアントがOpenVPNに接続するときは、非対称暗号化方式(または公開鍵/秘密の鍵)により、TLSハンドシェイクを行います。ただし、暗号化されたVPNトラフィックを送信する際、サーバーとクライアントは、共有鍵暗号化方式として知られる対称暗号化方式を使用します。
対称暗号化方式は非対称暗号化方式に比べて演算のオーバーヘッドがはるかに小さく、使用する数字も小さいため、今日のCPUは命令を統合して最適な対称暗号化演算を実施します。OpenVPNサーバーとクライアントは、非対称暗号化から対称暗号化への切り替えを行う際、Ellipic Curve Diffie-Hellman (ECDH) アルゴリズムを使用して、共有秘密の鍵に可能な限り速やかに同意します。
vars
ファイルへの入力が終わったら、PKIディレクトリの作成に進みます。それにはinit-pki
オプションを指定して、easyrsa
スクリプト実行します。すでに前提条件の中で、CAサーバーでこのコマンドを実行していますが、OpenVPNサーバーとCAサーバーには個別のPKIディレクトリがあるため、ここで実行する必要があります。
- ./easyrsa init-pki
OpenVPNサーバーに認証局を作成する必要はありません。CAサーバーが担うのは、証明書の検証と署名だけです。 VPNサーバーのPKIは、証明書要求と公開証明書を保管する、便利な場所としてのみ使用されます。
OpenVPNサーバーでPKIを初期化した後、次のステップに進み、OpenVPNサーバーの証明書要求と秘密の鍵を生成します。
OpenVPNサーバーに前提条件がすべてインストールされているので、次のステップでは、OpenVPNサーバーに秘密の鍵と証明書署名要求(Certificate Signing Request: CSR)を生成します。その後、署名要求をCAに転送して、必要な証明書を作成します。署名証明書が登録されると、OpenVPNサーバーに返送して、インストールして使えるようにします。
起動するには、root以外のユーザーとしてOpenVPNサーバーの~/easyrsa
ディレクトリに移動します。
- cd ~/easy-rsa
次に、gen-req
オプションとマシンのコモンネーム(Common Name: CN)を指定してeasyrsa
を呼び出します。 CNはどんな名前でも構いませんが、説明的なものがよいでしょう。 このチュートリアルでは、OpenVPNサーバーのCNをserver
とします。nopass
オプションも加えましょう。これをしておかないと、要求ファイルがパスワード保護され、今後権限の問題につながる可能性があります。
**注:**CNをserver
以外にした場合、以下の指示を多少調整する必要があります。たとえば、生成ファイルを/etc/openvpn
ディレクトリにコピーする際、正しい名前に読み換える必要があります。また、/etc/openvpn/server.conf
ファイルが正確に.crt
ファイル、.key
ファイルをポイントするように後で修正する必要があります。
- ./easyrsa gen-req server nopass
OutputCommon Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /home/sammy/easy-rsa/pki/reqs/server.req
key: /home/sammy/easy-rsa/pki/private/server.key
これにより、サーバーの秘密の鍵と、server.req
という証明書要求ファイルが作成されます。サーバー鍵を/etc/openvpn/server
ディレクトリにコピーします。
- sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/
これらのステップを完了して、OpenVPNサーバーの秘密の鍵が作成されました。また、OpenVPNサーバーのCSRも生成されました。これで、CAにCSRへの署名を要求する準備が整いました。このチュートリアルの次のセクションでは、CAサーバーの秘密の鍵でCSRに署名する方法を学びます。
前のステップでは、OpenVPNサーバーの証明書署名要求(CSR)と秘密の鍵を作成しました。次に、CAサーバーはserver
証明書を把握し、それを認証する必要があります。 CAが証明書を認証してOpenVPNサーバーに戻せば、CAを信頼するクライアントもOpenVPNサーバーを信頼できるようになります。
OpenVPNサーバーで、root以外のユーザーとして、SCPなどの転送方式でserver.req
証明書要求をCAサーバーにコピーします。CAサーバーはそれを署名に使用します。
- scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp
前提条件 Ubuntu 20.04に認証局(CA)をセットアップして設定する方法チュートリアルに従った場合、次のステップで、CA管理用に作成したroot以外のユーザーとしてCAサーバーにログインします。 PKを作成した~/easy-rsa
ディレクトリにcd
で移動し、easyrsa
スクリプトを使用して証明書要求をインポートします。
- cd ~/easy-rsa
- ./easyrsa import-req /tmp/server.req server
Output. . .
The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.
次に、easyrsa
スクリプトを sign-req
オプションを指定して実行し、要求に署名し、続けて要求タイプとコモンネームを入力します。要求タイプは、client
かserver
かのどちらかです。OpenVPNサーバーの証明書要求を使用しているので、server
要求タイプは必ず入力してください。
- ./easyrsa sign-req server server
出力では、要求が信頼できるソースから来たものかどうか確認を求められます。yes
と入力後、ENTER
キーを押して確認します。
OutputYou are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 3650 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt
CA秘密の鍵を暗号化すると、この時点でパスワードを求められます。
これらの手順が完了し、CAサーバーの秘密の鍵を使用して、OpenVPNサーバーの証明書要求に署名しました。結果として生じるserver.crt
ファイルには、OpenVPNサーバーの公開暗号化鍵と、CAサーバーからの署名が含まれます。 署名の意図は、CAサーバーを信頼するすべての人に、OpenVPNサーバーも信頼して接続できると伝えることです。
証明書の設定を完了するには、CAサーバーから<g id=“1” ctype=“x-CODE” equiv-text=“">server.crt</g>ファイルと<g id="2" ctype="x-CODE" equiv-text="
”>ca.crt</g>ファイルを、OpenVPNサーバー にコピーします。 ````
- scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
- scp pki/ca.crt sammy@your_vpn_server_ip:/tmp
OpenVPNサーバーに戻ったので、/tmp
から/etc/openvpn/server
にファイルをコピーします。
- sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
これでOpenVPNサーバーは、接続を受け入れる準備がほぼできました。次のステップでは、サーバーのセキュリティを強化するために、追加の手順をいくつか行います。
セキュリティレイヤーを強化するため、サーバーと全クライアントがOpenVPNのtls-crypt
ディレクティブで使用する、共有する秘密の鍵を追加します。このオプションを使用すると、サーバーとクライアント間が接続を確立する際に使用されるTLS証明書を難読化できます。また、OpenVPNサーバーはこれを使用して受信パケットを手早くチェックします。パケットが事前共有鍵を使用して署名されていればサーバーはこれを処理し、署名されていなければサーバーは信頼されていないソースからのパケットであると理解し、復号の手間をかけずに破棄できます。
このオプションはOpenVPNサーバーが、サーバーリソースと連携しながら、認証されていないトラフィック、ポートスキャン、DOS攻撃に対応できるようにします。また、OpenVPNネットワークトラフィックの識別が難しくなります。
tls-crypt
事前共有鍵を生成するには、OpenVPNサーバーの~/easy-rsa
ディレクトリで次を実行します。
- cd ~/easy-rsa
- openvpn --genkey --secret ta.key
ta.key
というファイルが生成されます。このファイルを/etc/openvpn/server/
ディレクトリにコピーします。
- sudo cp ta.key /etc/openvpn/server
OpenVPNサーバーにこれらのファイルを配置し、VPN接続に使用するユーザーのクライアント証明書と鍵ファイルを作成する準備が整いました。
クライアントマシンで秘密の鍵と証明書要求を生成し、それをCAに送信して署名させることもできますが、このガイドでは、OpenVPNサーバーで証明書要求を生成するプロセスの概要を説明します。この利点は、必要なすべての鍵と証明書を含むクライアント設定ファイルを自動的に生成するスクリプトが作成できることです。これにより、鍵、証明書、および設定ファイルをクライアントに転送する必要がなくなり、VPNへの参加プロセスが合理化されます。
このガイドでは、単一のクライアント鍵と証明書のペアを生成します。 クライアントが複数ある場合、クライアントごとにこのプロセスを繰り返すことができます。ただし、クライアントごとに一意の名前の値をスクリプトに渡す必要があることに注意してください。このチュートリアルでは、最初の証明書/鍵ペアをclient1
と呼びます。
まず、ホームディレクトリ内にディレクトリ構造を作成して、クライアント証明書と鍵ファイルを保存します。
- mkdir -p ~/client-configs/keys
クライアントの証明書/鍵ペアと設定ファイルをこのディレクトリに保存するので、セキュリティ対策としてその権限をすぐにロックダウンする必要があります。
- chmod -R 700 ~/client-configs
次に、EasyRSAディレクトリに戻り、 クライアントのコモンネームとともに、gen-req
とnopass
オプションを指定してeasyrsa
スクリプトを実行します。
- cd ~/easy-rsa
- ./easyrsa gen-req client1 nopass
ENTER
キーを押して、コモンネームを確認します。それから、client1.key
ファイルを先ほど作成した ~/client-configs/keys/
ディレクトリにコピーします。
- cp pki/private/client1.key ~/client-configs/keys/
次に、安全な方法を使用して、client1.req
ファイルをCAマシンに転送します。
- scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp
CAサーバーにログインします。EasyRSAディレクトリに移動して、証明書要求をインポートします。
- cd ~/easy-rsa
- ./easyrsa import-req /tmp/client1.req client1
次に、前のステップでサーバーに対して行ったように要求に署名します。ただし、今回は、必ずリクエストタイプをclient
に指定してください。
- ./easyrsa sign-req client client1
プロンプトで、yes
と入力して、証明書要求に署名する意図があり、信頼できるソースからのものであることを確認します。
OutputType the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
ここでも、CA鍵を暗号化した場合、パスワードの入力を求められます。
これにより、client1.crt
という名前のクライアント証明書ファイルが作成されます。このファイルをサーバーに転送して戻します。
- scp pki/issued/client1.crt sammy@your_server_ip:/tmp
OpenVPNサーバーに戻り、クライアント証明書を ~/client-configs/keys/
ディレクトリにコピーします。
- cp /tmp/client1.crt ~/client-configs/keys/
次に、ca.crt
とta.key
ファイルを ~/client-configs/keys/
ディレクトリにもコピーし、sudoユーザーに適切な権限を設定します。
- cp ~/easy-rsa/ta.key ~/client-configs/keys/
- sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
- sudo chown sammy.sammy ~/client-configs/keys/*
これにより、サーバーとクライアントの証明書と鍵がすべて生成され、OpenVPNサーバー上の適切なディレクトリに保存されます。これらのファイルを使用して実行する必要のあるアクションがまだいくつかありますが、それらについては後のステップで説明します。今は、OpenVPNの設定に進みます。
OpenVPNには、広く使用されている他の多くのオープンソースツールと同様に、利用可能な設定オプションが多数あります。このセクションでは、このソフトウェアのドキュメントに含まれるサンプル設定ファイルの一つに基づいて、基本的なOpenVPNサーバー設定のセットアップ方法について説明します。
最初に、独自の設定ファイルの開始点としてサンプルのserver.conf
ファイルをコピーします。
- sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
- sudo gunzip /etc/openvpn/server/server.conf.gz
お好みのテキストエディタで編集する新しいファイルを開きます。この例ではnanoを使用します。
- sudo nano /etc/openvpn/server/server.conf
このファイルの数行を変更します。まず、tls-auth
ディレクティブを検索して、設定のHMAC
セクションを見つけます。この行は、コメントを解除します。行頭に;
を付けてコメントアウトします。その下に新しい行を追加し、その行にはtls-crypt ta.key
のみ入力します。
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key
次に、cipher
行を検索し、暗号に関係のセクションを見つけます。デフォルト値はAES-256-CBC
に設定されていますが、AES-256-GCM
暗号の方が暗号強度・性能に優れ、最新のOpenVPNクライアントで十分にサポートされています。 行頭に;
を追記してこのデフォルト値の行をコメントアウトします。その下に1行追加し、最新の値AES-256-GCM
を入力します。
;cipher AES-256-CBC
cipher AES-256-GCM
この下に、auth
ディレクティブを追加して、HMACメッセージダイジェストアルゴリズムを選択します。このため、SHA256
は、よい選択です。
auth SHA256
次に、Diffie-Hellmanパラメーターを定義するdh
ディレクティブを含む行を見つけます。すべての証明書をEllipic Curve Cryptographyに設定したので、Diffie-Hellmanのシードファイルは不要です。dh dh2048.pem
やdh dh.pem
のような見た目の既存の行をコメントアウトします。Diffie-Hellman鍵のファイル名は、サンプルのサーバー設定ファイルの一覧表示と異なる場合があります。その下にdh none
の行を追加します。
;dh dh2048.pem
dh none
次に、OpenVPNが起動したら権限なしで稼働させるため、ユーザーnobody、グループnogroupとして稼働するように指示します。これを有効にするには、user nobody
行とgroup nogroup
行それぞれの行頭にある;
を削除してコメントを解除します。
user nobody
group nogroup
上記の設定により、2台のマシン間にVPN接続が作成されますが、トンネルを使用する接続は強制されません。VPNを使用してすべてのトラフィックをルーティングする場合は、追加設定をクライアントコンピューターにプッシュします。
まず、push "redirect-gateway def1 bypass-dhcp"
を含む行を検索し、コメントを解除します。これにより、クライアントにOpenVPNサーバーを介してトラフィックをリダイレクトするよう指示します。この機能を有効にすると、SSHのような他のネットワークサービスとの接続に問題が生じる可能性があることに注意してください。
push "redirect-gateway def1 bypass-dhcp"
すぐ下の行に、dhcp-option
セクションがあります。ここでも、2行とも行頭の;
を削除してコメントを解除します。
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
これらの行は、クライアントに、一覧表のIPアドレスで無料のOpenDNSリゾルバを使用するように指示するものです。他のDNSリゾルバがよければ、ハイライトされたIPの部分を置き換えます。
これにより、クライアントはDNS設定を再設定し、VPNトンネルをデフォルトのゲートウェイとして使用します。
デフォルトでは、OpenVPNサーバーはポート1194
とUDPプロトコルを使用してクライアント接続を受け入れます。制限されたネットワーク環境にいるかもしれないクライアントのために別のポートを使用する必要がある場合、port
オプションを変更できます。OpenVPNサーバーでWebコンテンツをホストしていない場合は、 ファイアウォールで通常許可されているポート443
が一般的な選択肢です。
OpenVPNがポート443でlistenするように変更するには、server.conf
ファイルを開き、次のような行を検索します。
port 1194
ファイルを編集してポートを443にします。
# Optional!
port 443
多くの場合、プロトコルもそのポートに限定されています。その場合、port
行の下のproto
行を検索し、プロトコルをUDP
からTCP
に変更します。
# Optional!
proto tcp
プロトコルをTCPに切り替えた場合、このディレクティブはUDPのみで使用されるため、explicit-exit-notify
ディレクティブの値を1
から0
に変更する必要があります。これを行わずにTCPを使用すると、OpenVPNサービスを開始するときにエラーが発生します。
ファイルの最後のexplicit-exit-notify
行を検索し、値を0
に変更します。
# Optional!
explicit-exit-notify 0
別のポートとプロトコルを使用する必要がない場合は、これら2つの設定をデフォルトのままにしておくことをお勧めします。
先ほど./easyrsa gen-req server
コマンドで別の名前を選択した場合は、server.conf
設定ファイルのcert
とkey
行を変更して、適切な.crt
ファイルと.key
ファイルをポイントするようにします。デフォルト名server
を使用した場合、資格情報はすでに正しく設定されています。
cert server.crt
key server.key
完了したら、ファイルを保存して閉じます。
これで、OpenVPNの一般的な設定を完了しました。次のステップでは、サーバーのネットワークオプションをカスタマイズします。
サーバーのネットワーク設定を部分的に調整して、OpenVPNがトラフィックをVPN経由で正しくルーティングできるようにする必要があります。その一つ目であるIP転送は、IPトラフィックの経路を決定する方法です。これは、サーバーが提供するVPN機能に必要不可欠です。
OpenVPNサーバーのデフォルトIP転送設定を調整するには、nano
または好みのエディタを使用して/etc/sysctl.conf
ファイルを開きます。
- sudo nano /etc/sysctl.conf
次に、ファイルの最下行に次の行を追加します。
net.ipv4.ip_forward = 1
完了したら、ファイルを保存して閉じます。
ファイルを読み取り、現在のセッションの新しい値を読み込むには、次のように入力します。
- sudo sysctl -p
Outputnet.ipv4.ip_forward = 1
OpenVPNサーバーは、あるイーサネットデバイスから別のデバイスへ、受信したトラフィックを転送できるようになりました。この設定により、サーバーは、仮想VPNインタフェースで接続するクライアントから他の物理的イーサネットデバイスへトラフィックを向かわせることができるようになります。この設定により、すべてのWebトラフィックはクライアントからサーバーのIPアドレスを介してルーティングされ、クライアントのパブリックIPアドレスが効果的に隠されます。
次のステップでは、ファイアウォールールをいくつか設定して、OpenVPNサーバーへ/からトラフィックが適切に流れるようにします。
これまでのところ、OpenVPNをサーバーにインストールし、設定し、クライアントがVPNにアクセスするために必要な鍵と証明書を生成しました。ただし、OpenVPNには、クライアントから受信するWebトラフィックの送り先についての指示が与えられていません。いくつかのファイアウォールルールとルーティング設定を確立することにより、サーバーがクライアントトラフィックをどのように処理するかを規定できます。
このチュートリアルの冒頭の前提条件に従ったなら、すでにufw
がインストールされ、サーバーで実行されていることでしょう。ファイアウォールを介してOpenVPNを許可するには、マスカレードを有効にする必要があります。マスカレードはクライアント接続を正しくルーティングするための動的NAT(network address translation)をオンザフライで提供する、iptables の概念です。
ファイアウォール設定ファイルを開いてマスカレードルールを追加する前に、マシンのパブリックネットワークインターフェースを見つける必要があります。 これを行うには、次を入力します。
- ip route list default
パブリックインターフェイスは、このコマンドの出力で表示される、「dev」という単語に続く文字列です。たとえば、この結果は、以下で強調表示されているeth0
というインターフェースを示します。
Outputdefault via 159.65.160.1 dev eth0 proto static
デフォルトルートに関連付けられたインターフェースがある場合、/etc/ufw/before.rules
ファイルを開いて関連する設定を追加します。
- sudo nano /etc/ufw/before.rules
UFWルールは、通常、ufw
コマンドを使用して追加されます。ただし、before.rules
ファイルに記載されているルールは、現行のUFWルールがロードされる前に読み込まれ、配置されます。ファイルの上部に向かって、強調表示された行を下に追加します。 これにより、nat
テーブル内のPOSTROUTING
チェーンのデフォルトポリシーが設定され、VPNからのトラフィックがマスカレードされます。下の -A POSTROUTING
行の eth0
を、上記のコマンドで確認したインターフェースと置換してください。
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
# Don't delete these required lines, otherwise there will be errors
*filter
. . .
完了したら、ファイルを保存して閉じます。
デフォルトで転送パケットも許可するようにUFWに指示する必要があります。これを実行するには、/etc/default/ufw
ファイルを開きます。
- sudo nano /etc/default/ufw
ファイル内で、DEFAULT_FORWARD_POLICY
ディレクティブを検索して、値をDROP
からACCEPT
に変更します。
DEFAULT_FORWARD_POLICY="ACCEPT"
完了したら、ファイルを保存して閉じます。
次に、ファイアウォール自体を設定して、OpenVPNへのトラフィックを許可します。/etc/openvpn/server.conf
ファイルで、ポートとプロトコルを変更しなかった場合、ポート1194
へのUDPトラフィックを開く必要があります。ポートやプロトコルを変更した場合は、ここで選択した値に置き換えてください。
前提条件のチュートリアルに従って追加するのを忘れた場合に備えて、SSHポートも追加します。
- sudo ufw allow 1194/udp
- sudo ufw allow OpenSSH
これらのルールを追加した後、UFWを無効化・再有効化して再起動し、変更したすべてのファイルから変更を読み込みます。
- sudo ufw disable
- sudo ufw enable
サーバーは、OpenVPNトラフィックを正しく処理するように設定されました。ファイアウォールルールが整い、サーバーでOpenVPNサービスを開始できるようになりました。
OpenVPNはsystemd
サービスとして起動するので、systemctl
を使用して管理できます。 サーバー稼働中はいつでもVPNに接続できるように、サーバー起動時にOpenVPNも起動するように設定します。これを行うには、OpenVPNサーバーをsystemctl
に追加して有効にします。
- sudo systemctl -f enable openvpn-server@server.service
次に、OpenVPNサービスを開始します。
- sudo systemctl start openvpn-server@server.service
次のコマンドを使用して、OpenVPNサービスがアクティブであることを再確認してください。出力に active(running)
が表示されます。
- sudo systemctl status openvpn-server@server.service
Output● openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-29 15:39:59 UTC; 6s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 16872 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1137)
Memory: 1.0M
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─16872 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --c>
. . .
. . .
Apr 29 15:39:59 ubuntu-20 openvpn[16872]: Initialization Sequence Completed
これで、OpenVPNのサーバー側の設定が完了しました。次に、クライアントマシンを設定し、OpenVPNサーバーに接続します。
OpenVPNクライアント用の設定ファイルの作成は、すべてのクライアントが独自の設定を持たなければならず、それぞれがサーバーの設定ファイルで概説されている設定と整合する必要があるため、やや複雑になります。このステップでは、1つのクライアントでのみ使用できる単一の設定ファイルを作成するのではなく、設定ファイルをその場で生成するために使用できるクライアント設定基盤を構築するプロセスの概要を説明します。最初に「ベース」設定ファイルを作成してから、必要に応じて一意のクライアント設定ファイル、証明書、および鍵を生成できるスクリプトを作成します。
先に作成した client-configs
ディレクトリ内にクライアント設定ファイルを保存する新しいディレクトリを作成することから始めます。
- mkdir -p ~/client-configs/files
次に、サンプルのクライアント設定ファイルを client-configs
ディレクトリにコピーして、基本設定として使用します。
- cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
nano
または好みのテキストエディタでこの新しいファイルを開きます。
- nano ~/client-configs/base.conf
内部で、remote
ディレクティブを検索します。これにより、クライアントはOpenVPNサーバーアドレス(OpenVPNサーバーのパブリックIPアドレス)をポイントします。OpenVPNサーバーがlistenしているポートを変更することにした場合は、選択したポートに1194
も変更する必要があります。
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .
プロトコルがサーバー設定で使用している値と一致していることを確認してください。
proto udp
次に、各行の先頭にある;
を削除して、 user
およびgroup
ディレクティブのコメントを解除します。
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
ca
、cert
、key
を設定したディレクティブを検索します。ファイル自体に証明書と鍵をすぐに追加するので、これらのディレクティブをコメントアウトします。
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key
同様に、 ta.key
をクライアント設定ファイルに直接追加する(そしてサーバーはtls-crypt
を使用するように設定してある)ため、tls-auth
ディレクティブをコメントアウトします。
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1
/etc/openvpn/server/server.conf
ファイルで設定した cipher
およびauth
設定をミラーリングします。
cipher AES-256-GCM
auth SHA256
次に、ファイルのどこかにkey-direction
を追加します。 クライアントマシンでVPNが正しく機能するように、必ずこれを「1」に設定してください。
key-direction 1
最後に、LinuxベースのVPNクライアントがDNS解決に使用するさまざまなメソッドを処理するように、数行をコメントアウトします。 さらに、類似しながら別個の2行をコメントアウトします。 1つめは、DNSの管理にsystemd-resolved
を使用しないクライアント向けの行です。これらのクライアントは、resolvconf
ユーティリティを参照してLinuxクライアントのDNS情報を更新ます。
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
ここでsystemd-resolved
を使用してDNS解決をするクライアントについてもう一行追加します。
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .
完了したら、ファイルを保存して閉じます。
後ほど、このチュートリアルのステップ13 - クライアント設定のインストールで、LinuxクライアントでのDNS解決方法とコメント解除するセクションを決定する方法を学びます。
次に、関連する証明書、鍵、暗号化ファイルを使用して基本設定をコンパイルし、生成された設定を~/client-configs/files
ディレクトリに配置するスクリプトを作成します。~/client-configs
ディレクトリ内でmake_config.sh
という新しいファイルを開きます。
- nano ~/client-configs/make_config.sh
内部に、次のコンテンツを追加します。
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn
完了したら、ファイルを保存して閉じます。
次に進む前に、次のように入力して、このファイルのパーミッションを実行可能にします。
- chmod 700 ~/client-configs/make_config.sh
このスクリプトは、作成したbase.conf
ファイルのコピーを作成し、クライアント用に作成したすべての証明書と鍵ファイルを収集し、それらの内容を抽出し、それらを基本設定ファイルのコピーに追加し、このすべてのコンテンツを新しいクライアント設定ファイルにエクスポートします。つまり、クライアントの設定、証明書、および鍵ファイルを個別に管理する必要はなく、必要な情報はすべて1か所に保存されます。この利点は、将来クライアントを追加する必要がある場合、このスクリプトを実行するだけで設定ファイルをすばやく作成し、すべての重要な情報がアクセスしやすい単一の場所に保存されるようにできることです。
新しいクライアントを追加するときはいつでも、このスクリプトを実行してその設定ファイルを生成する前に、新しいクライアント用の新しい鍵と証明書を生成する必要があることに注意してください。次のステップで、このスクリプトを使用した練習を行います。
ガイドに従って進めた場合、ステップ6で、client1.crt
という名前のクライアント証明書とclient1.key
という名前の鍵を作成しました。~/client-configs
ディレクトリに移動して、前のステップの最後に作成したスクリプトを実行すると、これらの資格情報の設定ファイルを生成できます。
- cd ~/client-configs
- ./make_config.sh client1
これにより、~/client-configs/files
ディレクトリにclient1.ovpn
という名前のファイルが作成されます。
- ls ~/client-configs/files
Outputclient1.ovpn
このファイルをクライアントとして使用する予定のデバイスに転送する必要があります。それはローカルコンピューターかモバイルデバイスかもしれません。
この転送に使用される正確なアプリケーションケーションは、デバイスのオペレーティングシステムと個人の好みによって異なりますが、信頼できる安全な方法は、バックエンドでSFTP(SSHファイル転送プロトコル)またはSCP(セキュアコピー)を使用することです。これにより、クライアントのVPN認証ファイルが暗号化された接続を介して転送されます。
ローカルコンピュータ(macOSまたはLinux)から実行できる SFTPコマンドの例を次に示します。これにより、前のステップで作成したclient1.ovpn
ファイルがホームディレクトリにコピーされます。
- sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/
サーバーからローカルコンピュータにファイルを安全に転送するためのツールとチュートリアルをいくつか次に示します。
このセクションでは、Windows、macOS、Linux、iOS、およびAndroidにクライアントVPNプロファイルをインストールする方法について説明します。各説明はどれも互いに依存性がないため、お使いのデバイスに該当するものに直接お進みください。
OpenVPN接続名は、.ovpn
ファイルと同名になります。 このチュートリアルでは、接続名 client1.ovpn
は、最初に生成したクライアントファイル名と一致します。
インストール
OpenVPNのダウンロードページからOpenVPNクライアントアプリケーションをダウンロードします。Windowsのバージョンに適したインストーラーバージョンを選択します。
注:OpenVPNをインストールするには管理者権限が必要です。
OpenVPNのインストール後、.ovpn
ファイルを次の場所にコピーします。
C:\Program Files\OpenVPN\config
OpenVPNを起動すると、プロファイルを自動的に探し出し、使用可能になります。
管理アカウントであっても、使用するたびにOpenVPNを管理者として実行する必要があります。VPNを使用するたびに右クリックしてRun as administratorを選択することなくこれを行うには、管理者権限のアカウントからこれを事前設定する必要があります。同時に、標準ユーザーはOpenVPNを使用するために管理者のパスワードを入力する必要があります。一方、標準ユーザーは、クライアントのOpenVPNアプリケーションケーションに管理者権限がない限り、サーバーに適切に接続できないため、昇格した権限が必要です。
OpenVPNアプリケーションを常に管理者として実行するように設定するには、ショートカットアイコンを右クリックして、Properties に進みます。Compatibilityタブの下部にあるChange settings for all usersボタンをクリックします。新しいウィンドウで、Run this program as an administratorをオンにします。
接続
OpenVPN GUIを起動するたびに、Windowsはプログラムがコンピューターに変更を加えることを許可するかどうかを尋ねます。Yesをクリックします。OpenVPNクライアントアプリケーションケーションを起動すると、アプレットがシステムトレイに配置されるだけなので、必要に応じてVPNを接続および切断できます。実際にはVPN接続を確立しません。
OpenVPNが起動したら、システムトレイアプレットに移動し、OpenVPNアプレットアイコンを右クリックして接続を開始します。これにより、コンテキストメニューが開きます。メニューの上部にあるclient1(client1.ovpn
プロファイル)を選択し、Connectを選択します。
接続が確立されている間、ステータスウィンドウにログ出力が表示され、クライアントが接続されるとメッセージが表示されます。
同じ方法でVPNから切断します。システムトレイアプレットに移動し、OpenVPNアプレットアイコンを右クリックして、クライアントプロファイルを選択し、Disconnectをクリックします。
インストール
Tunnelblickは、macOS用の無料のオープンソースOpenVPNクライアントです。Tunnelblick Downloadsページから最新のディスクイメージをダウンロードできます。ダウンロードした.dmg
ファイルをダブルクリックし、プロンプトに従ってインストールします。
インストールプロセスの終盤に近付くと、Tunnelblickは、設定ファイルがあるかどうかを尋ねます。I have configuration filesと答え、Tunnelblickを終了させます。Finderウィンドウを開き、client1.ovpn
をダブルクリックします。Tunnelblickはクライアントプロファイルをインストールします。管理者権限が必要です。
接続
Applications フォルダのTunnelblickアイコンをダブルクリックして、Tunnelblickを起動します。Tunnelblickが起動すると、画面右上のメニューバーにTunnelblickアイコンが表示されます。アイコンをクリックしてから、 Connect client1メニュー項目をクリックして、VPN接続を開始します。
インストール
Linuxを使用している場合、ディストリビューションに応じて使用できるさまざまなツールがあります。デスクトップ環境またはウィンドウマネージャーが、接続ユーティリティも備えている可能性があります。
OpenVPNソフトウェアを使用するのが、最も一般的な接続方法です。
UbuntuまたはDebianでは、次のように入力して、サーバーにインストールしたのと同じようにインストールできます。
- sudo apt update
- sudo apt install openvpn
CentOSでは、EPELリポジトリを有効にしてから、次のように入力してインストールできます。
- sudo dnf install epel-release
- sudo dnf install openvpn
systemd-resolved
を使用したクライアントの設定まず/etc/resolv.conf
ファイルをチェックして、DNS解決を処理するのにsystemd-resolved
が使用されているかどうかを判断します。
- cat /etc/resolv.conf
Output# This file is managed by man:systemd-resolved(8). Do not edit.
. . .
nameserver 127.0.0.53
options edns0
systemd-resolved
を使用したDNS解決が設定されている場合、nameserver
オプションの後のIPアドレスは127.0.0.53
になります。systemd-resolved
がファイルを管理する方法を説明する出力のようなファイルにもコメントが含まれています。IPアドレスが127.0.0.53
ではない場合、systemd-resolved
を使用していない可能性が高いため、update-resolv-conf
スクリプトのあるLinuxクライアントを設定する次のセクションに進みます。
これらのクライアントをサポートするために、まずopenvpn-systemd-resolved
パッケージをインストールします。このパッケージはsystemd-resolved
がDNS解決にVPNサーバーを使用するように強制するスクリプトです。
- sudo apt install openvpn-systemd-resolved
パッケージをインストールしたら、クライアントがこれを使用して、すべてのDNSクエリがVPNインターフェースを介して送信されるように設定します。クライアントのVPNファイルを開きます。
- nano client1.ovpn
先に追加した次の行のコメントを解除します。
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .
update-resolv-conf
を使用したクライアントの設定DNSの管理にsystemd-resolved
が使用されていない場合、ディストリビューションに/etc/openvpn/update-resolv-conf
スクリプトがあるかどうかを確認します。
- ls /etc/openvpn
Outputupdate-resolv-conf
クライアントにupdate-resolv-conf
ファイルがある場合は、先に転送したOpenVPNクライアント設定ファイルを編集します。
- nano client1.ovpn
追加した3行のコメントを解除してDNS設定を調整します。
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
CentOSを使用している場合、ディストリビューションの利用可能なグループに一致するように、group
ディレクティブをnogroup
からnobody
に変更します。
group nobody
ファイルを保存して閉じます。
接続
これで、openvpn
コマンドをクライアント設定ファイルにポイントするだけで、VPNに接続できます。
- sudo openvpn --config client1.ovpn
これでVPNに接続します。
**注:**クライアントがsystemd-resolved
を使用してDNSを管理している場合、次のようにsystemd-resolve --status
コマンドを実行して、設定が正しく適用されていることを確認してください。
- systemd-resolve --status tun0
次のような出力が表示されます。
OutputLink 22 (tun0)
. . .
DNS Servers: 208.67.222.222
208.67.220.220
DNS Domain: ~.
OpenVPNサーバーで設定したDNSサーバーのIPアドレスが、出力にあるDNSドメインの~.
設定を伴って表示されれば、クライアントはVPNサーバーのDNSリゾルバを使用するように正しく設定されています。また、DNS leak test.comのようなサイトを使用して、DNSクエリがVPNを介して送信されていることが確認できます。
インストール
iTunes App Storeから、OpenVPN Connect(公式iOS OpenVPNクライアントアプリケーション)を検索してインストールします。iOSクライアント設定をデバイスに転送するには、デバイスをコンピュータに直接接続します。
iTunesで転送を完了するプロセスの概要をここに示します。コンピューターでiTunesを開き、iPhone > appsをクリックします。File Sharingセクションまで下にスクロールして、OpenVPNアプリケーションをクリックします。 右側の空のウィンドウ OpenVPN Documents は、ファイル共有に使用します。.ovpn
ファイルをOpenVPNドキュメントウィンドウにドラッグします。
iPhoneでOpenVPNアプリケーションを起動します。新しいプロファイルをインポートする準備ができたという通知を受け取ります。緑色のプラス記号をタップしてインポートします。
接続
これで、OpenVPNを新しいプロファイルで使用する準備ができました。Connect ボタンを Onの位置にスライドして、接続を開始します。同じボタンをOffにスライドして切断します。
注:VPNスイッチはSettingsで設定中、VPN接続に使用できません。接続を試みると、OpenVPNアプリケーションを使用して接続するよう通知を受け取ります。
インストール
Google Playストアを開きます。公式のAndroid OpenVPNクライアントアプリケーションであるAndroid OpenVPN Connectを検索してインストールします。
AndroidデバイスをUSBでコンピュータに接続し、ファイルをコピーすることで、.ovpn
プロファイルを転送できます。または、SDカードリーダーをお持ちの場合は、デバイスのSDカードを取り外してプロファイルをコピーし、Androidデバイスにカードを挿入し直すことができます。
OpenVPNアプリケーションを起動し、FILE
メニューをタップしてプロファイルをインポートします。
次に、保存されたプロファイルの場所(スクリーンショットは/storage/emulated/0/openvpn
を使用)に移動し、.ovpn
ファイルを選択します。IMPORT
ボタンをタップして、このプロファイルのインポートを終了します。
接続プロファイルを追加したら、次のような画面が表示されます。
接続するには、使用するプロファイルに近いトグルボタンをタップします。OpenVPNサーバーを通じてルーティングされている接続とトラフィックのステータスをリアルタイム表示します。
切断するには、左上部のトグルボタンをもう一度タップします。VPNから切断するかどうか確認を求められます。
<$>[note]**注:**ステップ7でOpenVPNファイルのserver.conf
を編集した際、すべてのトラフィックがVPN経由でルーティングされるように選択した場合のみ、このVPN接続テスト方式は有効です。
すべてのインストールが完了したら、簡単なチェックですべてが正常に機能していることを確認します。VPN接続を有効化せずに、ブラウザーを開いてDNSLeakTestにアクセスします。
このサイトは、インターネットサービスプロバイダーによって割り当てられたIPアドレスと、世界中に表示されるIPアドレスを返します。同じWebサイトからDNS設定を確認するには、Extended Testをクリックすると、使用しているDNSサーバーがわかります。
次に、OpenVPNクライアントをDropletのVPNに接続し、ブラウザーを更新します。完全に異なるIPアドレス(VPNサーバーのIPアドレス)が表示され、このように表示されます。繰り返しますが、DNSLeakTestのExtended Test は、DNS設定をチェックして、VPNがプッシュしたDNSリゾルバを使用していることを確認します。
OpenVPNサーバーへのさらなるアクセスを防ぐために、クライアント証明書を失効させることが必要になる場合があります。
これを行うには、前提条件チュートリアルUbuntu 20.04への認証局のセットアップと設定方法の_証明書の取り消し_セクション内の例を参照してください。
これらの指示に従いクライアント証明書を取り消したら、生成したcrl.pem
ファイルをOpenVPNサーバーの/etc/openvpn/server
ディレクトリにコピーします。
- sudo cp /tmp/crl.pem /etc/openvpn/server/
次に、OpenVPNサーバー設定ファイルを開きます。
- sudo nano /etc/openvpn/server/server.conf
ファイルの下部に、 crl-verify
オプションを追加します。これは、接続が試行されるたびに作成した証明書失効リストをチェックするようOpenVPNサーバーに指示します。
crl-verify crl.pem
ファイルを保存して閉じます。
最後に、OpenVPNを再起動して証明書失効を実装します。
- sudo systemctl restart openvpn-server@server.service
クライアントは、古い資格情報を使用してサーバーに正常に接続できなくなりました。
クライアントをさらに取り消す手順は、次の通りです。
./easyrsa revoke client_name
コマンドで証明書を取り消します。crl.pem
ファイルをOpenVPNサーバーに転送し、それを /etc/openvpn/server/
ディレクトリにコピーして、古いリストを上書きします。このプロセスを使用して、サーバーに対して以前に発行した証明書を取り消すことができます。
これで完全に稼働する仮想プライベートネットワークがOpenVPNサーバーで作動するようになりました。悪意ある者によるアクティビティの追跡を心配することなく、Webを閲覧したり、コンテンツをダウンロードしたりできます。
OpenVPNインストールをさらにカスタマイズするには、VPNに自動的に接続するようにクライアントを設定したり、クライアント固有のルールとアクセスポリシーを設定するなど、実行できる手順がいくつかあります。その他のOpenVPNのカスタマイズについては、OpenVPNの公式ドキュメントを参照してください。
クライアントをさらに設定するには、追加するデバイスごとにステップ6と11〜13を参照してください。クライアントのアクセス権を取り消すには、ステップ15を参照してください。
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.