Debian10でOpenVPNサーバーをセットアップする方法

提供:Dev Guides
移動先:案内検索

このチュートリアルの以前のバージョンは、 JustinEllingwoodによって作成されました。

序章

ホテルやコーヒーショップのWiFiなどの信頼できないネットワークに接続しているときに、スマートフォンやラップトップからインターネットに安全かつ確実にアクセスしたいですか? 仮想プライベートネットワーク(VPN)を使用すると、信頼できないネットワークをプライベートネットワーク上にいるかのようにプライベートかつ安全にトラバースできます。 トラフィックはVPNサーバーから出て、宛先への移動を続けます。

HTTPS接続と組み合わせると、この設定により、ワイヤレスログインとトランザクションを保護できます。 地理的な制限や検閲を回避し、場所と暗号化されていないHTTPトラフィックを信頼できないネットワークから保護することができます。

OpenVPN は、幅広い構成に対応するフル機能のオープンソースのSecure Socket Layer(SSL)VPNソリューションです。 このチュートリアルでは、Debian 10サーバー上にOpenVPNサーバーをセットアップし、Windows、macOS、iOS、Androidからのアクセスを構成します。 このチュートリアルでは、これらの各セットアップのインストールと構成の手順を可能な限り簡単にします。

注: DigitalOcean DropletにOpenVPNサーバーをセットアップする場合は、多くのホスティングプロバイダーと同様に、帯域幅の超過に対して課金されることに注意してください。 このため、サーバーが処理しているトラフィックの量に注意してください。

詳細については、このページを参照してください。


前提条件

このチュートリアルを完了するには、OpenVPNサービスをホストするためのDebian10サーバーにアクセスする必要があります。 このガイドを開始する前に、root以外のユーザーにsudo権限を設定する必要があります。 Debian 10初期サーバーセットアップガイドに従って、適切な権限を持つユーザーをセットアップできます。 リンクされたチュートリアルでは、ファイアウォールも設定されます。これは、このガイド全体で使用されていると想定されています。

さらに、認証局(CA)として機能する別のマシンが必要になります。 OpenVPNサーバーまたはローカルマシンをCAとして使用することは技術的には可能ですが、VPNがセキュリティの脆弱性にさらされる可能性があるため、これはお勧めしません。 公式のOpenVPNドキュメントに従って、証明書要求のインポートと署名専用のスタンドアロンマシンにCAを配置する必要があります。 このため、このガイドでは、CAがsudo特権と基本的なファイアウォールを持つ非rootユーザーを持つ別のDebian10サーバー上にあることを前提としています。

これらのサーバーの構成中にパスワード認証を無効にすると、このガイドの後半でサーバー間でファイルを転送するときに問題が発生する可能性があることに注意してください。 この問題を解決するには、各サーバーでパスワード認証を再度有効にすることができます。 または、サーバーごとにSSHキーペアを生成してから、OpenVPNサーバーの公開SSHキーをCAマシンのauthorized_keysファイルに追加することもできます。その逆も可能です。 これらのソリューションのいずれかを実行する方法については、 Debian10でSSHキーを設定する方法を参照してください。

これらの前提条件が整ったら、このチュートリアルのステップ1に進むことができます。

ステップ1—OpenVPNとEasyRSAのインストール

まず、 VPNサーバーのパッケージインデックスを更新し、OpenVPNをインストールします。 OpenVPNはDebianのデフォルトのリポジトリで利用できるので、インストールにaptを使用できます。

sudo apt update
sudo apt install openvpn

OpenVPNはTLS/SSLVPNです。 これは、サーバーとクライアント間のトラフィックを暗号化するために証明書を利用することを意味します。 信頼できる証明書を発行するには、独自の単純な認証局(CA)を設定します。 これを行うには、プロジェクトの公式GitHubリポジトリから、CA公開鍵インフラストラクチャ(PKI)の構築に使用するEasyRSAの最新バージョンをダウンロードします。

前提条件で述べたように、スタンドアロンサーバー上にCAを構築します。 このアプローチの理由は、攻撃者がサーバーに侵入できた場合、攻撃者がCA秘密鍵にアクセスし、それを使用して新しい証明書に署名し、VPNにアクセスできるようになるためです。 したがって、スタンドアロンマシンからCAを管理すると、許可されていないユーザーがVPNにアクセスするのを防ぐのに役立ちます。 また、さらなる予防策として、キーの署名に使用されていないときは、CAサーバをオフにしておくことをお勧めします。

CAおよびPKIインフラストラクチャの構築を開始するには、wgetを使用して、CAマシンとOpenVPNサーバーの両方のに最新バージョンのEasyRSAをダウンロードします。 最新バージョンを入手するには、公式のEasyRSA GitHubプロジェクトリリースページに移動し、.tgzで終わるファイルのダウンロードリンクをコピーして、次のコマンドに貼り付けます。

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz

次に、tarballを抽出します。

cd ~
tar xvf EasyRSA-unix-v3.0.6.tgz

これで、サーバーとCAマシンに必要なすべてのソフトウェアが正常にインストールされました。 EasyRSAが使用する変数の構成と、サーバーとクライアントがVPNにアクセスするために必要なキーと証明書を生成するCAディレクトリの設定に進みます。

ステップ2—EasyRSA変数の構成とCAの構築

EasyRSAには、CAのいくつかの変数を定義するために編集できる構成ファイルがインストールされています。

CAマシンで、EasyRSAディレクトリに移動します。

cd ~/EasyRSA-v3.0.6/

このディレクトリ内には、vars.exampleという名前のファイルがあります。 このファイルのコピーを作成し、ファイル拡張子なしでコピーにvarsという名前を付けます。

cp vars.example vars

お好みのテキストエディタを使用して、この新しいファイルを開きます。

nano vars

新しい証明書のフィールドのデフォルトを設定する設定を見つけます。 次のようになります。

〜/ EasyRSA-v3.0.6 / vars

. . .

#set_var EASYRSA_REQ_COUNTRY    "US"
#set_var EASYRSA_REQ_PROVINCE   "California"
#set_var EASYRSA_REQ_CITY       "San Francisco"
#set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL      "[email protected]"
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

. . .

これらの行のコメントを解除し、強調表示された値を好きなように更新しますが、空白のままにしないでください。

〜/ EasyRSA-v3.0.6 / vars

. . .

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "NewYork"
set_var EASYRSA_REQ_CITY       "New York City"
set_var EASYRSA_REQ_ORG        "DigitalOcean"
set_var EASYRSA_REQ_EMAIL      "[email protected]"
set_var EASYRSA_REQ_OU         "Community"

. . .

終了したら、ファイルを保存して閉じます。

EasyRSAディレクトリ内には、easyrsaというスクリプトがあり、CAの構築と管理に関連するさまざまなタスクを実行するために呼び出されます。 init-pkiオプションを指定してこのスクリプトを実行し、CAサーバーで公開鍵インフラストラクチャを開始します。

./easyrsa init-pki
Output. . .
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/sammy/EasyRSA-v3.0.6/pki

この後、build-caオプションを指定して、easyrsaスクリプトを再度呼び出します。 これにより、CAが構築され、SSL証明書のパブリック側とプライベート側を構成するca.crtca.keyの2つの重要なファイルが作成されます。

  • ca.crtは、CAの公開証明書ファイルであり、OpenVPNのコンテキストでは、サーバーとクライアントは、中間者攻撃を実行している人ではなく、同じ信頼のWebの一部であることを相互に通知するために使用します。 -中間者攻撃。 このため、サーバーとすべてのクライアントにはca.crtファイルのコピーが必要になります。
  • ca.keyは、CAマシンがサーバーとクライアントのキーと証明書に署名するために使用する秘密キーです。 攻撃者がCAにアクセスし、次にca.keyファイルにアクセスすると、攻撃者は証明書要求に署名してVPNにアクセスできるようになり、セキュリティが妨げられます。 これが、ca.keyファイルがCAマシン上にのみあるべきであり、理想的には、追加のセキュリティ対策として証明書要求に署名しない場合、CAマシンをオフラインに保つ必要がある理由です。

CAを操作するたびにパスワードの入力を求められたくない場合は、次のようにnopassオプションを指定してbuild-caコマンドを実行できます。

./easyrsa build-ca nopass

出力では、CAの一般名を確認するように求められます。

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

一般名は、認証局のコンテキストでこのマシンを参照するために使用される名前です。 CAの一般名には任意の文字列を入力できますが、簡単にするために、ENTERを押してデフォルト名を受け入れます。

これで、CAが配置され、証明書要求への署名を開始する準備が整いました。

ステップ3—サーバー証明書、キー、および暗号化ファイルを作成する

CAの準備ができたので、サーバーから秘密鍵と証明書の要求を生成し、その要求をCAに転送して署名し、必要な証明書を作成できます。 また、暗号化プロセス中に使用されるいくつかの追加ファイルを自由に作成できます。

OpenVPNサーバーのEasyRSAディレクトリに移動することから始めます。

cd EasyRSA-v3.0.6/

そこから、init-pkiオプションを指定してeasyrsaスクリプトを実行します。 このコマンドはすでにCAマシンで実行されていますが、サーバーとCAには別々のPKIディレクトリがあるため、ここで実行する必要があります。

./easyrsa init-pki

次に、easyrsaスクリプトを再度呼び出します。今回は、gen-reqオプションに続けて、マシンの一般名を指定します。 繰り返しになりますが、これは好きなものにすることができますが、説明的なものにすることが役立つ場合があります。 このチュートリアル全体を通して、OpenVPNサーバーの一般名は単に「サーバー」になります。 nopassオプションも必ず含めてください。 そうしないと、リクエストファイルがパスワードで保護され、後で権限の問題が発生する可能性があります。

:ここで「サーバー」以外の名前を選択した場合は、以下の手順の一部を調整する必要があります。 たとえば、生成されたファイルを/etc/openvpnディレクトリにコピーする場合は、正しい名前に置き換える必要があります。 また、後で/etc/openvpn/server.confファイルを変更して、正しい.crtおよび.keyファイルを指すようにする必要があります。


./easyrsa gen-req server nopass

これにより、サーバーの秘密鍵とserver.reqという証明書要求ファイルが作成されます。 サーバーキーを/etc/openvpn/ディレクトリにコピーします。

sudo cp ~/EasyRSA-v3.0.6/pki/private/server.key /etc/openvpn/

安全な方法(以下の例ではSCPなど)を使用して、server.reqファイルをCAマシンに転送します。

scp ~/EasyRSA-v3.0.6/pki/reqs/server.req sammy@your_CA_ip:/tmp

次に、 CAマシンで、EasyRSAディレクトリに移動します。

cd EasyRSA-v3.0.6/

easyrsaスクリプトを再度使用して、server.reqファイルをインポートし、共通名のファイルパスをたどります。

./easyrsa import-req /tmp/server.req server

次に、easyrsaスクリプトをsign-reqオプションで実行し、続いてリクエストタイプと共通名を実行して、リクエストに署名します。 リクエストタイプはclientまたはserverのいずれかであるため、OpenVPNサーバーの証明書リクエストには、必ずserverリクエストタイプを使用してください。

./easyrsa sign-req server server

出力では、リクエストが信頼できるソースからのものであることを確認するように求められます。 yesと入力し、ENTERを押して、これを確認します。

You 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 1080 days:

subject=
    commonName                = server


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

CAキーを暗号化した場合は、この時点でパスワードの入力を求められます。

次に、安全な方法を使用して、署名された証明書をVPNサーバーに転送します。

scp pki/issued/server.crt sammy@your_server_ip:/tmp

CAマシンからログアウトする前に、ca.crtファイルもサーバーに転送します。

scp pki/ca.crt sammy@your_server_ip:/tmp

次に、OpenVPNサーバーに再度ログインし、server.crtおよびca.crtファイルを/etc/openvpn/ディレクトリにコピーします。

sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/

次に、EasyRSAディレクトリに移動します。

cd EasyRSA-v3.0.6/

そこから、次のように入力して、鍵交換中に使用する強力なDiffie-Hellman鍵を作成します。

./easyrsa gen-dh

これが完了するまでに数分かかる場合があります。 完了したら、HMAC署名を生成して、サーバーのTLS整合性検証機能を強化します。

sudo openvpn --genkey --secret ta.key

コマンドが終了したら、2つの新しいファイルを/etc/openvpn/ディレクトリにコピーします。

sudo cp ~/EasyRSA-v3.0.6/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-v3.0.6/pki/dh.pem /etc/openvpn/

これで、サーバーに必要なすべての証明書とキーファイルが生成されました。 これで、クライアントマシンがOpenVPNサーバーにアクセスするために使用する対応する証明書とキーを作成する準備が整いました。

ステップ4—クライアント証明書とキーペアの生成

クライアントマシンで秘密鍵と証明書の要求を生成し、それをCAに送信して署名することもできますが、このガイドでは、サーバーで証明書の要求を生成するプロセスの概要を説明します。 これの利点は、必要なすべてのキーと証明書を含むクライアント構成ファイルを自動的に生成するスクリプトを作成できることです。 これにより、キー、証明書、および構成ファイルをクライアントに転送する必要がなくなり、VPNに参加するプロセスが合理化されます。

このガイドでは、単一のクライアントキーと証明書のペアを生成します。 複数のクライアントがある場合は、クライアントごとにこのプロセスを繰り返すことができます。 ただし、すべてのクライアントのスクリプトに一意の名前の値を渡す必要があることに注意してください。 このチュートリアル全体を通して、最初の証明書/キーのペアはclient1と呼ばれます。

クライアント証明書とキーファイルを保存するために、ホームディレクトリ内にディレクトリ構造を作成することから始めます。

mkdir -p ~/client-configs/keys

クライアントの証明書/キーのペアと構成ファイルをこのディレクトリに保存するため、セキュリティ対策として、今すぐアクセス許可をロックダウンする必要があります。

chmod -R 700 ~/client-configs

次に、EasyRSAディレクトリに戻り、[X53X]およびnopassオプションを使用して、クライアントの一般名とともにeasyrsaスクリプトを実行します。

cd ~/EasyRSA-v3.0.6/
./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_ip:/tmp

CAマシンにログインし、EasyRSAディレクトリに移動して、証明書要求をインポートします。

ssh sammy@your_CA_ip
cd EasyRSA-v3.0.6/
./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

SSHでOpenVPNサーバーに戻り、クライアント証明書を/client-configs/keys/ディレクトリにコピーします。

cp /tmp/client1.crt ~/client-configs/keys/

次に、ca.crtファイルとta.keyファイルも/client-configs/keys/ディレクトリにコピーします。

sudo cp ~/EasyRSA-v3.0.6/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

これで、サーバーとクライアントの証明書とキーがすべて生成され、サーバーの適切なディレクトリに保存されます。 これらのファイルで実行する必要のあるアクションはまだいくつかありますが、それらは後のステップで実行されます。 今のところ、サーバーでのOpenVPNの構成に進むことができます。

ステップ5—OpenVPNサービスの設定

クライアントとサーバーの両方の証明書とキーが生成されたので、これらの資格情報を使用するようにOpenVPNサービスの構成を開始できます。

サンプルのOpenVPN構成ファイルを構成ディレクトリにコピーすることから始め、セットアップの基礎として使用するためにそれを抽出します。

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

好みのテキストエディタでサーバー構成ファイルを開きます。

sudo nano /etc/openvpn/server.conf

tls-authディレクティブを探して、HMACセクションを見つけます。 この行はすでにコメントが外されているはずですが、そうでない場合は、「;」を削除してコメントを外してください。

/etc/openvpn/server.conf

tls-auth ta.key 0 # This file is secret

次に、コメントアウトされたcipher行を探して、暗号化暗号に関するセクションを見つけます。 AES-256-CBC暗号は、優れたレベルの暗号化を提供し、十分にサポートされています。 繰り返しになりますが、この行はすでにコメント解除されているはずですが、コメント化されていない場合は、その前にある「;」を削除してください。

/etc/openvpn/server.conf

cipher AES-256-CBC

この下に、authディレクティブを追加して、HMACメッセージダイジェストアルゴリズムを選択します。 このためには、SHA256が適切な選択です。

/etc/openvpn/server.conf

auth SHA256

次に、Diffie-Hellmanパラメーターを定義するdhディレクティブを含む行を見つけます。 EasyRSAに最近加えられたいくつかの変更により、Diffie-Hellmanキーのファイル名は、サンプルサーバー構成ファイルにリストされているものと異なる場合があります。 必要に応じて、2048を削除して、ここにリストされているファイル名を変更し、前の手順で生成したキーと一致するようにします。

/etc/openvpn/server.conf

dh dh.pem

最後に、usergroupの設定を見つけ、それぞれの先頭にある「; 」を削除して、これらの行のコメントを解除します。

/etc/openvpn/server.conf

user nobody
group nogroup

OpenVPNが機能するためには、これまでにサンプルserver.confファイルに加えた変更が必要です。 以下に概説する変更はオプションですが、多くの一般的なユースケースでも必要です。

(オプション)DNSの変更をプッシュして、VPNを介してすべてのトラフィックをリダイレクトします

上記の設定により、2台のマシン間にVPN接続が作成されますが、接続でトンネルを使用するように強制されることはありません。 VPNを使用してすべてのトラフィックをルーティングする場合は、DNS設定をクライアントコンピューターにプッシュすることをお勧めします。

server.confファイルには、この機能を有効にするために変更する必要のあるディレクティブがいくつかあります。 redirect-gatewayセクションを見つけ、redirect-gateway行の先頭からセミコロン「;」を削除してコメントを解除します。

/etc/openvpn/server.conf

push "redirect-gateway def1 bypass-dhcp"

このすぐ下に、dhcp-optionセクションがあります。 繰り返しますが、両方の行の前から「; 」を削除して、コメントを解除します。

/etc/openvpn/server.conf

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

これは、クライアントがDNS設定を再構成して、VPNトンネルをデフォルトゲートウェイとして使用するのに役立ちます。

(オプション)ポートとプロトコルを調整します

デフォルトでは、OpenVPNサーバーはポート1194とUDPプロトコルを使用してクライアント接続を受け入れます。 クライアントが存在する可能性のあるネットワーク環境が制限されているために別のポートを使用する必要がある場合は、portオプションを変更できます。 OpenVPNサーバーでWebコンテンツをホストしていない場合は、ポート443が一般的な選択肢です。これは、通常、ファイアウォールルールで許可されているためです。

/etc/openvpn/server.conf

# Optional!
port 443

多くの場合、プロトコルはそのポートにも制限されています。 その場合は、protoをUDPからTCPに変更します。

/etc/openvpn/server.conf

# Optional!
proto tcp

プロトコルをTCPにdo切り替える場合、このディレクティブは1から0にのみ使用されるため、explicit-exit-notifyディレクティブの値を変更する必要があります。 UDPによる。 TCPの使用中にこれを行わないと、OpenVPNサービスの開始時にエラーが発生します。

/etc/openvpn/server.conf

# Optional!
explicit-exit-notify 0

別のポートとプロトコルを使用する必要がない場合は、これら2つの設定をデフォルトのままにしておくことをお勧めします。

(オプション)デフォルト以外の資格情報を指す

手順3の./easyrsa gen-reqコマンドで別の名前を選択した場合は、表示されるcertおよびkeyの行を変更して、適切な.crtおよび.keyファイル。 デフォルト名の「server」を使用した場合、これはすでに正しく設定されています。

/etc/openvpn/server.conf

cert server.crt
key server.key

終了したら、ファイルを保存して閉じます。

特定のユースケースでサーバーのOpenVPN構成に必要な変更を加えた後、サーバーのネットワークにいくつかの変更を加えることができます。

ステップ6—サーバーネットワーク構成の調整

OpenVPNがVPNを介してトラフィックを正しくルーティングできるように、サーバーのネットワーク構成のいくつかの側面を微調整する必要があります。 これらの最初のものは、 IP転送です。これは、IPトラフィックをルーティングする場所を決定するための方法です。 これは、サーバーが提供するVPN機能に不可欠です。

/etc/sysctl.confファイルを変更して、サーバーのデフォルトのIP転送設定を調整します。

sudo nano /etc/sysctl.conf

内部で、net.ipv4.ip_forwardを設定するコメント行を探します。 行の先頭から「」文字を削除して、この設定のコメントを解除します。

/etc/sysctl.conf

net.ipv4.ip_forward=1

終了したら、ファイルを保存して閉じます。

ファイルを読み取り、現在のセッションの値を調整するには、次のように入力します。

sudo sysctl -p
Outputnet.ipv4.ip_forward = 1

前提条件に記載されているDebian10初期サーバーセットアップガイドに従っている場合は、UFWファイアウォールを設置する必要があります。 ファイアウォールを使用して不要なトラフィックをブロックするかどうかに関係なく(ほとんどの場合、これを実行する必要があります)、このガイドでは、サーバーに着信するトラフィックの一部を操作するためのファイアウォールが必要です。 一部のファイアウォールルールは、マスカレードを有効にするように変更する必要があります。これは、クライアント接続を正しくルーティングするためのオンザフライの動的ネットワークアドレス変換(NAT)を提供するiptablesの概念です。

ファイアウォール構成ファイルを開いてマスカレードルールを追加する前に、まずマシンのパブリックネットワークインターフェイスを見つける必要があります。 これを行うには、次のように入力します。

ip route | grep default

パブリックインターフェイスは、このコマンドの出力内にある「dev」という単語に続く文字列です。 たとえば、この結果はeth0という名前のインターフェイスを示しており、以下で強調表示されています。

Outputdefault via 203.0.113.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を、上記のコマンドで見つけたインターフェースに置き換えることを忘れないでください。

/etc/ufw/before.rules

#
# 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に変更します。

/ etc / default / ufw

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トラフィックを正しく処理するようにサーバーが構成されました。

ステップ7—OpenVPNサービスの開始と有効化

これで、サーバーでOpenVPNサービスを開始する準備が整いました。 これは、systemdユーティリティsystemctlを使用して行われます。

systemdユニットのファイル名の後にインスタンス変数として設定ファイル名を指定して、OpenVPNサーバーを起動します。 サーバーの構成ファイルは/etc/openvpn/server.confと呼ばれるため、呼び出すときにユニットファイルの最後に@serverを追加します。

sudo systemctl start openvpn@server

次のように入力して、サービスが正常に開始されたことを再確認します。

sudo systemctl status openvpn@server

すべてがうまくいった場合、出力は次のようになります。

Output● [email protected] - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/[email protected]; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-07-17 03:39:24 UTC; 29s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
 Main PID: 3371 (openvpn)
   Status: "Initialization Sequence Completed"
    Tasks: 1 (limit: 3587)
   Memory: 1.2M
   CGroup: /system.slice/system-openvpn.slice/[email protected]
           └─3371 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config /etc/openvpn/server.conf --writepid /run/openvpn/

次のように入力して、OpenVPNtun0インターフェイスが使用可能であることを確認することもできます。

ip addr show tun0

これにより、構成済みのインターフェースが出力されます。

Output3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::dd60:3a78:b0ca:1659/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

サービスを開始した後、起動時に自動的に開始するようにサービスを有効にします。

sudo systemctl enable openvpn@server

これでOpenVPNサービスが稼働しています。 ただし、使用を開始する前に、まずクライアントマシンの構成ファイルを作成する必要があります。 このチュートリアルでは、クライアントの証明書とキーのペアを作成する方法についてはすでに説明しました。次のステップでは、クライアント構成ファイルを簡単に生成するインフラストラクチャを作成する方法を示します。

ステップ8—クライアント構成インフラストラクチャを作成する

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 ~/client-configs/base.conf

内部で、remoteディレクティブを見つけます。 これにより、クライアントはOpenVPNサーバーアドレス(OpenVPNサーバーのパブリックIPアドレス)を指し示します。 OpenVPNサーバーがリッスンしているポートを変更する場合は、1194も選択したポートに変更する必要があります。

〜/ client-configs / base.conf

. . .
# 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
. . .

プロトコルがサーバー構成で使用している値と一致していることを確認してください。

〜/ client-configs / base.conf

proto udp

次に、各行の先頭にある「; 」を削除して、userおよびgroupディレクティブのコメントを解除します。

〜/ client-configs / base.conf

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

cacert、およびkeyを設定するディレクティブを見つけます。 ファイル自体に証明書とキーをまもなく追加するため、これらのディレクティブをコメントアウトします。

〜/ client-configs / base.conf

# 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-authディレクティブをコメントアウトします。

〜/ client-configs / base.conf

# 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.confファイルで設定したcipherおよびauth設定をミラーリングします。

〜/ client-configs / base.conf

cipher AES-256-CBC
auth SHA256

次に、ファイルのどこかにkey-directionディレクティブを追加します。 VPNをクライアントマシンで正しく機能させるには、これを「1」に設定する必要があります。

〜/ client-configs / base.conf

key-direction 1

最後に、コメントアウト行をいくつか追加します。 これらのディレクティブはすべてのクライアント構成ファイルに含めることができますが、/etc/openvpn/update-resolv-confファイルとともに出荷されるLinuxクライアントに対してのみ有効にする必要があります。 このスクリプトは、resolvconfユーティリティを使用して、LinuxクライアントのDNS情報を更新します。

〜/ client-configs / base.conf

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

クライアントがLinuxを実行していて、/etc/openvpn/update-resolv-confファイルがある場合は、生成後にクライアントの構成ファイルからこれらの行のコメントを解除します。

終了したら、ファイルを保存して閉じます。

次に、関連する証明書、キー、および暗号化ファイルを使用して基本構成をコンパイルする簡単なスクリプトを作成し、生成された構成を~/client-configs/filesディレクトリに配置します。 ~/client-configsディレクトリ内にmake_config.shという名前の新しいファイルを開きます。

nano ~/client-configs/make_config.sh

内部に次のコンテンツを追加し、sammyをサーバーのroot以外のユーザーアカウントのコンテンツに変更してください。

〜/ client-configs / make_config.sh

#!/bin/bash

# First argument: Client identifier

KEY_DIR=/home/sammy/client-configs/keys
OUTPUT_DIR=/home/sammy/client-configs/files
BASE_CONFIG=/home/sammy/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-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

終了したら、ファイルを保存して閉じます。

次に進む前に、次のように入力して、このファイルを実行可能としてマークしてください。

chmod 700 ~/client-configs/make_config.sh

このスクリプトは、作成したbase.confファイルのコピーを作成し、クライアント用に作成したすべての証明書とキーファイルを収集し、それらの内容を抽出して、基本構成ファイルのコピーに追加し、エクスポートします。このすべてのコンテンツを新しいクライアント構成ファイルに入れます。 つまり、クライアントの構成、証明書、およびキーファイルを個別に管理する必要はなく、必要なすべての情報が1か所に保存されます。 これの利点は、将来クライアントを追加する必要がある場合に、このスクリプトを実行するだけで構成ファイルをすばやく作成し、すべての重要な情報が単一のアクセスしやすい場所に確実に保存されることです。

新しいクライアントを追加するときはいつでも、このスクリプトを実行してその構成ファイルを生成する前に、そのクライアントの新しいキーと証明書を生成する必要があることに注意してください。 次のステップで、このスクリプトを使用して練習します。

ステップ9—クライアント構成の生成

ガイドに従って、ステップ4でそれぞれclient1.crtおよびclient1.keyという名前のクライアント証明書とキーを作成しました。 ~/client-configsディレクトリに移動し、前の手順の最後に作成したスクリプトを実行することで、これらの資格情報の構成ファイルを生成できます。

cd ~/client-configs
sudo ./make_config.sh client1

これにより、~/client-configs/filesディレクトリにclient1.ovpnという名前のファイルが作成されます。

ls ~/client-configs/files
Outputclient1.ovpn

このファイルを、クライアントとして使用する予定のデバイスに転送する必要があります。 たとえば、これはローカルコンピュータまたはモバイルデバイスである可能性があります。

この転送を実行するために使用される正確なアプリケーションは、デバイスのオペレーティングシステムと個人の好みによって異なりますが、信頼できる安全な方法は、バックエンドでSFTP(SSHファイル転送プロトコル)またはSCP(セキュアコピー)を使用することです。 これにより、暗号化された接続を介してクライアントのVPN認証ファイルが転送されます。

これは、ローカルコンピューター(macOSまたはLinux)から実行できるclient1.ovpnの例を使用したSFTPコマンドの例です。 .ovpnファイルをホームディレクトリに配置します。

sftp sammy@your_server_ip:client-configs/files/client1.ovpn ~/

サーバーからローカルコンピューターにファイルを安全に転送するためのいくつかのツールとチュートリアルを次に示します。

ステップ10—クライアント構成のインストール

このセクションでは、Windows、macOS、Linux、iOS、およびAndroidにクライアントVPNプロファイルをインストールする方法について説明します。 これらのクライアント命令はいずれも相互に依存していないため、デバイスに該当する方にスキップしてください。

OpenVPN接続は、.ovpnファイルと呼んだものと同じ名前になります。 このチュートリアルに関して、これは、接続の名前がclient1.ovpnであり、生成した最初のクライアントファイルと一致していることを意味します。

ウィンドウズ

インストール

OpenVPNのダウンロードページからWindows用のOpenVPNクライアントアプリケーションをダウンロードします。 ご使用のバージョンのWindowsに適切なインストーラーバージョンを選択してください。

注:OpenVPNをインストールするには管理者権限が必要です。


OpenVPNをインストールした後、.ovpnファイルを次の場所にコピーします。

C:\Program Files\OpenVPN\config

OpenVPNを起動すると、プロファイルが自動的に表示され、利用できるようになります。

管理者アカウントであっても、OpenVPNを使用するたびに管理者として実行する必要があります。 VPNを使用するたびに右クリックして管理者として実行を選択せずにこれを行うには、管理者アカウントからこれを事前設定する必要があります。 これは、標準ユーザーがOpenVPNを使用するために管理者のパスワードを入力する必要があることも意味します。 一方、標準ユーザーは、クライアント上のOpenVPNアプリケーションに管理者権限がない限り、サーバーに適切に接続できないため、昇格された権限が必要です。

OpenVPNアプリケーションを常に管理者として実行するように設定するには、そのショートカットアイコンを右クリックして、プロパティに移動します。 互換性タブの下部にあるボタンをクリックして、すべてのユーザーの設定を変更します。 新しいウィンドウで、このプログラムを管理者として実行するをチェックします。

接続する

OpenVPN GUIを起動するたびに、Windowsはプログラムがコンピューターに変更を加えることを許可するかどうかを尋ねます。 はいをクリックします。 OpenVPNクライアントアプリケーションを起動すると、アプレットはシステムトレイに配置されるだけなので、必要に応じてVPNを接続および切断できます。 実際にはVPN接続を確立しません。

OpenVPNが開始されたら、システムトレイアプレットに移動し、OpenVPNアプレットアイコンを右クリックして接続を開始します。 これにより、コンテキストメニューが開きます。 メニューの上部にあるclient1client1.ovpnプロファイル)を選択し、Connectを選択します。

接続が確立されている間はステータスウィンドウが開き、ログ出力が表示されます。クライアントが接続されるとメッセージが表示されます。

同じ方法でVPNから切断します。システムトレイアプレットに移動し、OpenVPNアプレットアイコンを右クリックして、クライアントプロファイルを選択し、切断をクリックします。

マックOS

インストール

Tunnelblick は、macOS用の無料のオープンソースOpenVPNクライアントです。 最新のディスクイメージは、TunnelblickDownloadsページからダウンロードできます。 ダウンロードした.dmgファイルをダブルクリックし、プロンプトに従ってインストールします。

インストールプロセスの終わりに向かって、Tunnelblickは構成ファイルがあるかどうかを尋ねます。 回答構成ファイルがあり、Tunnelblickを終了させます。 Finderウィンドウを開き、client1.ovpnをダブルクリックします。 Tunnelblickはクライアントプロファイルをインストールします。 管理者権限が必要です。

接続する

アプリケーションフォルダのTunnelblickアイコンをダブルクリックして、Tunnelblickを起動します。 Tunnelblickが起動すると、画面右上のメニューバーに接続を制御するためのTunnelblickアイコンが表示されます。 アイコンをクリックし、 Connect client1 メニュー項目をクリックして、VPN接続を開始します。

Linux

インストール

Linuxを使用している場合は、ディストリビューションに応じてさまざまなツールを使用できます。 デスクトップ環境またはウィンドウマネージャーには、接続ユーティリティも含まれている場合があります。

ただし、最も一般的な接続方法は、OpenVPNソフトウェアを使用することです。

Debianでは、次のように入力することで、サーバーにインストールしたのと同じようにインストールできます。

sudo apt update
sudo apt install openvpn

CentOSでは、EPELリポジトリを有効にしてから、次のように入力してインストールできます。

sudo yum install epel-release
sudo yum install openvpn

構成

ディストリビューションに/etc/openvpn/update-resolv-confスクリプトが含まれているかどうかを確認してください。

ls /etc/openvpn
Outputupdate-resolv-conf

次に、転送したOpenVPNクライアント構成ファイルを編集します。

nano client1.ovpn

update-resolv-confファイルが見つかった場合は、DNS設定を調整するために追加した3行のコメントを解除します。

client1.ovpn

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

CentOSを使用している場合は、groupディレクティブをnogroupからnobodyに変更して、ディストリビューションの使用可能なグループに一致させます。

client1.ovpn

group nobody

ファイルを保存して閉じます。

これで、openvpnコマンドをクライアント構成ファイルにポイントするだけで、VPNに接続できます。

sudo openvpn --config client1.ovpn

これにより、VPNに接続されます。

iOS

インストール

iTunes App Storeから、公式iOSOpenVPNクライアントアプリケーションであるOpenVPNConnectを検索してインストールします。 iOSクライアント構成をデバイスに転送するには、デバイスをコンピューターに直接接続します。

iTunesで転送を完了するプロセスの概要をここに示します。 コンピュータでiTunesを開き、 iPhone > appsをクリックします。 ファイル共有セクションまで下にスクロールして、OpenVPNアプリをクリックします。 右側の空白のウィンドウOpenVPNDocuments は、ファイルを共有するためのものです。 .ovpnファイルをOpenVPNドキュメントウィンドウにドラッグします。

次に、iPhoneでOpenVPNアプリを起動します。 新しいプロファイルをインポートする準備ができたという通知が届きます。 緑色のプラス記号をタップしてインポートします。

接続する

これで、OpenVPNを新しいプロファイルで使用する準備が整いました。 ConnectボタンをOnの位置にスライドさせて接続を開始します。 同じボタンをオフにスライドさせて切断します。

注:設定の下のVPNスイッチを使用してVPNに接続することはできません。 試してみると、OpenVPNアプリを使用してのみ接続するように通知が届きます。


アンドロイド

インストール

GooglePlayストアを開きます。 公式のAndroidOpenVPNクライアントアプリケーションであるAndroidOpenVPNConnectを検索してインストールします。

.ovpnプロファイルを転送するには、AndroidデバイスをUSBでコンピューターに接続し、ファイルをコピーします。 または、SDカードリーダーをお持ちの場合は、デバイスのSDカードを取り外し、プロファイルをコピーしてから、カードをAndroidデバイスに挿入し直すことができます。

OpenVPNアプリを起動し、メニューをタップしてプロファイルをインポートします。

次に、保存したプロファイルの場所に移動し(スクリーンショットでは、/sdcard/Download/を使用)、ファイルを選択します。 アプリは、プロファイルがインポートされたことを記録します。

接続する

接続するには、接続ボタンをタップするだけです。 OpenVPNアプリケーションを信頼するかどうかを尋ねられます。 OKを選択して接続を開始します。 VPNから切断するには、OpenVPNアプリに戻り、切断を選択します。

ステップ11— VPN接続のテスト(オプション)

注: VPN接続をテストするこの方法は、手順5ですべてのトラフィックをVPN経由でルーティングすることを選択した場合にのみ機能します。


すべてがインストールされたら、簡単なチェックですべてが正しく機能していることを確認します。 VPN接続を有効にせずに、ブラウザを開いてDNSLeakTestに移動します。

このサイトは、インターネットサービスプロバイダーによって割り当てられたIPアドレスを、世界中に表示されたとおりに返します。 同じWebサイトでDNS設定を確認するには、拡張テストをクリックすると、使用しているDNSサーバーが表示されます。

次に、OpenVPNクライアントをDropletのVPNに接続し、ブラウザーを更新します。 これで、完全に異なるIPアドレス(VPNサーバーのIPアドレス)が表示されるはずです。これが、世界に表示される方法です。 繰り返しになりますが、DNSLeakTestの Extended Test は、DNS設定をチェックし、VPNによってプッシュされたDNSリゾルバーを使用していることを確認します。

ステップ12—クライアント証明書を取り消す

場合によっては、OpenVPNサーバーへのそれ以上のアクセスを防ぐために、クライアント証明書を取り消す必要があります。

これを行うには、CAマシンのEasyRSAディレクトリに移動します。

cd EasyRSA-v3.0.6/

次に、revokeオプションを指定してeasyrsaスクリプトを実行し、その後に取り消したいクライアント名を続けます。

./easyrsa revoke client2

これにより、yesと入力して、失効を確認するように求められます。

OutputPlease confirm you wish to revoke the certificate with the following subject:

subject=
    commonName                = client2


Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes

アクションを確認した後、CAはクライアントの証明書を完全に取り消します。 ただし、現在、OpenVPNサーバーには、クライアントの証明書が取り消されているかどうかを確認する方法がなく、クライアントは引き続きVPNにアクセスできます。 これを修正するには、CAマシンに証明書失効リスト(CRL)を作成します。

./easyrsa gen-crl

これにより、crl.pemというファイルが生成されます。 このファイルをOpenVPNサーバーに安全に転送します。

scp ~/EasyRSA-v3.0.6/pki/crl.pem sammy@your_server_ip:/tmp

OpenVPNサーバーで、このファイルを/etc/openvpn/ディレクトリにコピーします。

sudo cp /tmp/crl.pem /etc/openvpn

次に、OpenVPNサーバー構成ファイルを開きます。

sudo nano /etc/openvpn/server.conf

ファイルの下部にcrl-verifyオプションを追加します。これにより、接続が試行されるたびに作成した証明書失効リストを確認するようにOpenVPNサーバーに指示されます。

/etc/openvpn/server.conf

crl-verify crl.pem

ファイルを保存して閉じます。

最後に、OpenVPNを再起動して、証明書の失効を実装します。

sudo systemctl restart openvpn@server

クライアントは、古いクレデンシャルを使用してサーバーに正常に接続できなくなります。

追加のクライアントを取り消すには、次のプロセスに従います。

  1. ./easyrsa revoke client_nameコマンドで証明書を取り消します
  2. 新しいCRLを生成する
  3. 新しいcrl.pemファイルをOpenVPNサーバーに転送し、それを/etc/openvpnディレクトリにコピーして、古いリストを上書きします。
  4. OpenVPNサービスを再起動します。

このプロセスを使用して、サーバーに対して以前に発行した証明書を取り消すことができます。

結論

これで、インターネットを安全に移動して、身元、場所、トラフィックをスヌーパーや検閲者から保護できます。

より多くのクライアントを構成するには、追加のデバイスごとに手順4および9-11に従うだけです。 クライアントへのアクセスを取り消すには、手順12に従ってください。