はじめに
信頼できないネットワーク(ホテルやカフェのWiFiなど)に接続する際、スマートフォンやノートパソコンから安全にインターネットにアクセスしたいと思いませんか?幸いなことに、その願いを叶える方法があります。信頼できないネットワークであっても、プライベートネットワークにいるかのように安全に接続することができます。それには、仮想プライベートネットワーク(VPN).
VPNとは何ですか?
VPNはVirtual Private Network(仮想プライベートネットワーク)の略です。信頼できるサーバーへの安全なトンネルを開く機能を提供します。すべてのリクエストはこのサーバーを経由して送受信されます。そのメリットは、ホテルの無料WiFiなどの公共ネットワークを使用する際に、アクセスや取引の安全性を確保できる点にあります。
VPNを経由することで、すべてのデータが暗号化され、サーバーを介して処理されます。サードパーティのルーターなど、途中に存在するデバイスがトラフィックを意図しない宛先にリダイレクトすることはできません。また、接続が正常に確立されると、ユーザーはサーバーのネットワークの一部になります。通常はサーバーのローカルネットワーク内からしかアクセスできない他のサーバー、コンピューター、またはプリンターなどのデバイスにも、VPNトンネルを通じてアクセスできるようになります。ただし、すべてのデータを暗号化トンネル経由で送信する必要はないため、リクエストの定義された一部のみをVPNトンネル経由で送信するようにVPNクライアントを設定することも可能です。残りのトラフィックは、インターネット経由で通常通り処理されます。
このチュートリアルでは、Ubuntu 18.04上でOpenVPNサーバーをセットアップする手順を説明します。
要件
このチュートリアルを完了するには、次のサービスをホストするためのUbuntu 18.04サーバーへのアクセス権が必要です:OpenVPN。このガイドを開始する前に、sudo権限を持つ非rootユーザーを設定する必要もあります。サーバーのインストールは、当社のUbuntuサーバーのセットアップに関するチュートリアルに従うことで簡単に行えます。.
さらに、認証局(CA)として機能する別のコンピューターが必要になります。技術的には、OpenVPNサーバーまたはローカルコンピューターを認証局として使用できます。しかし、これはVPNをセキュリティの脆弱性にさらすことになるため、お勧めしません。OpenVPNの公式ドキュメントによると、証明書要求のインポートと署名専用の別のコンピューターに認証局を配置する必要があります。そのため、ここでは認証局が、sudo権限を持つ非rootユーザーと基本的なファイアウォールを備えた別のUbuntu 18.04サーバー上にあると想定します。このガイド全体を通して、各インストールのすべてのインストールおよび設定手順は可能な限りシンプルに説明します。また、当社のDockerでOpenVPNサーバーをセットアップする方法に関するチュートリアルもご覧いただけます。.
ステップ1 – OpenVPNとEasyRSAのインストール
まず、VPNサーバーのパッケージインデックスを更新し、OpenVPNをインストールします。OpenVPNはデフォルトのUbuntuリポジトリで提供されているため、aptを使用してインストールできます:
|
1 2 |
sudo apt update sudo apt install openvpn |
ステップ2:認証局の作成
OpenVPNサーバー用の信頼できる証明書を発行するために、シンプルな認証局(CA)を作成します。これを行うには、wgetを使用して、CAマシンとOpenVPNサーバーの両方に最新バージョンのEasyRSAをダウンロードします。最新バージョンを取得するには、公式のEasyRSA GitHubプロジェクトのリリース(Releases)ページにアクセスし、.tgzで終わるファイルのダウンロードリンクをコピーして、次のコマンドに貼り付けます:
|
1 |
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz <span class="s1">--no-check-certificate</span> |
次に、tarボールを展開します:
|
1 2 |
cd ~ tar xvf EasyRSA-3.0.4.tgz |

この時点で、必要なすべてのソフトウェアがCAコンピューターとサーバーに正常にインストールされました。
ステップ3 – EasyRSA変数の設定とCAの構築
EasyRSAには、次のコマンドを使用してCAの多数の変数を定義するために編集できる設定ファイルが付属しています:
|
1 |
cd ~/EasyRSA-3.0.4/ |
ディレクトリ内にvars.exampleという名前のファイルがあります。このファイルのコピーを作成し、拡張子なしでvarsという名前にします。
|
1 |
cp vars.example vars |
お好みのテキストエディタを使用して、この新しいファイルを開きます。
|
1 |
nano vars |
次に、新しい証明書のフィールドのデフォルト値を設定する設定を見つけます。以下のようになっているはずです。
|
1 2 3 4 5 6 |
#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 "me@example.net" #set_var EASYRSA_REQ_OU "My Organizational Unit" |
以下に示すように、これらの変数をお好みの値に更新します。
|
1 2 3 4 5 6 |
set_var EASYRSA_REQ_COUNTRY "SL" set_var EASYRSA_REQ_PROVINCE "Zurich" set_var EASYRSA_REQ_CITY "Zurich City" set_var EASYRSA_REQ_ORG "CloudSigma" set_var EASYRSA_REQ_EMAIL "admin@example.com" set_var EASYRSA_REQ_OU "Community" |
準備ができたら、ファイルを保存して閉じます。次のステップでは、easyrsaスクリプトを呼び出し、init-pkiオプションを指定して実行し、CAサーバー上で公開鍵基盤(PKI)を初期化します。
|
1 |
./easyrsa init-pki |

次に、CAを操作するたびにパスワードを求められないように、nopassオプションを指定してbuild-caコマンドを実行します。
|
1 |
./easyrsa build-ca nopass |
出力の中で、CAのコモンネーム(Common Name)を確認するように求められます。

これでCAのセットアップが完了し、証明書署名要求(CSR)への署名を開始する準備が整いました。
ステップ 4 – サーバー証明書、鍵、および暗号化ファイルの生成
CAの準備ができたら、サーバーから秘密鍵と証明書要求を生成し、それをCAに送信して署名を受け、必要な証明書を作成できます。まず、OpenVPNサーバー上のEasyRSAディレクトリに移動します。
|
1 |
cd EasyRSA-3.0.4 |
そこから、init-pkiオプションを指定してeasyrsaスクリプトを実行します。このコマンドはCAコンピューター上ですでに実行していますが、ここでも実行する必要があります。これは、サーバーとCAのPKIディレクトリが異なるためです。
|
1 |
./easyrsa init-pki |
次に、再びeasyrsaスクリプトを呼び出します。今回はgen-reqオプションを指定し、その後にcomputer’sのジェネリック名を続けます。
|
1 |
./easyrsa gen-req server nopass |
これにより、サーバー用の秘密鍵と、server.reqという名前の証明書要求ファイルが作成されます。サーバーの鍵を/etc/openvpn/ディレクトリにコピーします。
|
1 |
sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/ |
安全な方法(以下の例ではSCPなど)を使用して、server.reqファイルをCAコンピューターに転送します。
|
1 |
scp ~/EasyRSA-3.0.4/pki/reqs/server.req cloudsigma@your_CA_ip:/tmp |
次に、CAコンピューター上のEasyRSAディレクトリに移動します。
|
1 |
cd EasyRSA-3.0.4/ |
再びeasyrsaスクリプトを使用してserver.reqファイルをインポートし、ファイルパスの後にそのコモンネームを追加します。
|
1 |
./easyrsa import-req /tmp/server.req server |
次に、sign-reqオプションを指定してeasyrsaスクリプトを実行し、その後に要求タイプとコモンネームを続けて、要求に署名します。OpenVPNサーバーの証明書要求については、必ずserver要求タイプを使用してください。
|
1 |
./easyrsa sign-req server server |
出力は、リクエストが信頼できるソースからのものであることを確認するように求めます。yes と入力して Enter キーを押し、確認します。正確性を確保するために、以下に示す詳細を確認してください。このリクエストはまだパスワード検証されていないことに注意してください。
サブジェクトを要求し、3650日間のサーバー証明書として署名します:

CAキーを暗号化している場合は、この時点でパスワードを求められます。次に、安全な方法を使用して、署名された証明書をVPNサーバーに転送します:
|
1 |
scp pki/issued/server.crt siigma@your_server_ip:/tmp |
CAコンピューターからログアウトする前に、ca.rtファイルをサーバーに転送します:
|
1 |
scp pki/ca.crt siigma@our_server_ip:/tmp |
次に、OpenVPNサーバーに再度ログインし、server.crtファイルとca.crtファイルを/etc/openvpn/ディレクトリにコピーします:
|
1 |
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/ |
次に、EasyRSAディレクトリに移動します:
|
1 |
cd ~/EasyRSA-3.0.4/ |
キー交換中に使用できる強力なDiffie-Hellmanキーを作成するには、次のコードを入力します:
|
1 |
./easyrsa gen-dh |
完了したら、サーバーのTLSヘルスチェック機能を向上させるためにHMAC署名を生成します:
|
1 |
openvpn --genkey --secret ta.key |
コマンドが完了したら、2つの新しいファイルを/etc/openvpn/ディレクトリにコピーします:
|
1 2 |
sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/ sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/ |
これで、サーバーに必要なすべての証明書とキーファイルが生成されます。これで、クライアントコンピューターがOpenVPNサーバーにアクセスするために使用する適切な証明書とキーを作成できます。
ステップ 4 – クライアント証明書とキーペアの生成
次に、クライアントキーといくつかの証明書を作成します。複数のクライアントがある場合は、クライアントごとにこのプロセスを繰り返すことができます。ただし、クライアントごとに一意の名前の値をスクリプトに渡す必要があることに注意してください。このチュートリアルでは、最初の証明書とキーのペアに client1 という名前を付けます。まず、クライアント証明書とキーファイルを保存するためのディレクトリ構造をホームディレクトリに作成します:
|
1 |
mkdir -p ~/client-configs/keys |
セキュリティ上の理由から、証明書/キーペアとクライアントの設定ファイルをこのディレクトリに保存するため、ここで権限を取り消す必要があります:
|
1 |
chmod -R 700 ~/client-configs |
次に、EasyRSAディレクトリに戻り、gen-reqおよびnopassオプションとクライアントの一般的な名前を指定してeasyrsaスクリプトを実行します:
|
1 2 |
cd ~/EasyRSA-3.0.4/ ./easyrsa gen-req client1 nopass |
Enterキーを押してコモンネームを確認します。その後、client1.keyファイルを以前に作成した /client-configs/keys/ ディレクトリにコピーします:
|
1 |
cp pki/private/client1.key ~/client-configs/keys/ |
次に、安全な方法を使用して、client1.reqファイルをCAコンピューターに転送します:
|
1 |
scp pki/reqs/client1.req sigma@your_CA_ip:/tmp |
CAコンピューターにログインし、EasyRSAディレクトリに移動して、証明書要求をインポートします:
|
1 2 3 |
ssh siigma@your_CA_ip cd EasyRSA-3.0.4/ ./easyrsa import-req /tmp/client1.req client1 |

次に、前のステップと同様に、サーバー上で要求に署名します。ただし、今回はクライアントの要求タイプを指定する必要があります:
|
1 |
./easyrsa sign-req client client1 |
プロンプトが表示されたら、yes と入力して、証明書要求に署名すること、および証明書要求が信頼できるソースからのものであることを確認します。続行するには“yes”と入力し、それ以外を入力すると破棄されます:
|
1 |
確認 要求 詳細: Yes |

CAキーを暗号化している場合は、ここでもパスワードの入力を求められます。これにより、client1.crtという名前のクライアント証明書ファイルが作成されます。このファイルをサーバーに転送します:
|
1 |
scp pki/issued/client1.crt siigma@your_server_ip:/tmp |
OpenVPNサーバーにSSHで戻り、クライアント証明書を / client-configs / keys / ディレクトリにコピーします。
|
1 |
cp /tmp/client1.crt ~/client-configs/keys/ |
次に、ca.crtファイルとta.keyファイルを / client-configs / keys / ディレクトリにコピーします。
|
1 2 |
cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/ sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/ |
これで、サーバーとクライアントのすべての証明書とキーが生成され、サーバー上の対応するディレクトリに保存されました。これで、サーバー上でのOpenVPNのセットアップを続行できます。
ステップ 5 – OpenVPNサービスの構成
クライアントとサーバーの証明書を生成した後、これらの資格情報を使用するようにOpenVPNサービスを構成できます。まず、OpenVPNのサンプル設定ファイルを設定ディレクトリにコピーし、それを解凍してセットアップのベースとして使用します。
|
1 2 |
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gzip -d /etc/openvpn/server.conf.gz |
お好みのテキストエディタでサーバー設定ファイルを開きます。
|
1 |
sudo nano /etc/openvpn/server.conf |
次に、tls-authコマンドを探してHMAC部分を見つけます。
|
1 |
tls-auth ta.key 0 # このファイルは秘密です |
コメントアウトされたパスワードの行を探して、パスワード部分を見つけます。AES-256-CBC暗号化は優れた暗号化レベルを提供し、広くサポートされています。この行はコメントアウトされていないはずですが、もしそうでない場合は、先頭の “;” を削除してください:
|
1 |
cipher AES-256-CBC |
その下に、HMACメッセージダイジェストアルゴリズムを選択するためのauthコマンドを追加します。これにはSHA256が良い選択肢です。
|
1 |
auth SHA256 |
次に、Diffie-Hellmanパラメータを定義するdhステートメントの行を探します。EasyRSAの最近の変更により、Diffie-Hellmanキーのファイル名が、サンプルのサーバー設定ファイルに記載されているファイル名と異なる場合があります。必要に応じて、前のステップのキーと一致するように2048を削除して、ここに記載されているファイル名を変更します。
|
1 |
dh dh.pem |
最後に、userとgroupの設定を探し、各行の先頭にある “;” を削除します:
|
1 2 |
user nobody group nogroup |
ここまでの、サンプルのserver.confファイルに加えた変更により、OpenVPNが動作するようになるはずです。
ステップ 6 – サーバーのネットワーク構成
VPN経由でトラフィックを適切にルーティングするために、IPフォワーディングを構成します。これは、サーバーが提供するVPN機能に不可欠です。
|
1 |
sudo nano /etc/sysctl.conf |
net.ipv4.ip_forwardを設定しているコメントアウトされた行を探します。行の先頭から “#” 文字を削除して、この設定のコメントを解除します。
|
1 |
net.ipv4.ip_forward=1 |
完了したらファイルを保存して閉じます。ファイルを読み込んで現在のセッションの値を調整するには、次のように入力します。
|
1 |
sudo sysctl -p |

次に、マシンのパブリックネットワークインターフェースを追加します。
|
1 |
ip route | grep default |
パブリックインターフェースは、このコマンドの出力内の “dev” という単語に続く文字列です。たとえば、この結果はens3という名前のインターフェースを示しています。

関連する設定を追加するために、/etc/ufw/before.rulesファイルを開きます。
|
1 |
$ sudo nano /etc/ufw/before.rules |
ファイルの先頭付近に、以下のハイライトされた行を追加して、natテーブルのPOSTROUTINGチェーンのデフォルトポリシーを設定し、VPNから送信されるトラフィックをマスカレードします。以下の -A POSTROUTING 行の ens3 を、上記のコマンドで見つかったインターフェースに変更してください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# rules.before # ufwコマンドラインで追加されたルールの前に実行されるべきルール。カスタム # ルールは以下のチェーンのいずれかに追加する必要があります: # ufw-before-input # ufw-before-output # ufw-before-forward # START OPENVPN RULES # NATテーブルのルール *nat :POSTROUTING ACCEPT [0:0] # OpenVPNクライアントからwlp11s0へのトラフィックを許可(検出したインターフェースに変更してください!) -A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE COMMIT # END OPENVPN RULES # これらの必要な行は削除しないでください。削除するとエラーが発生します . . . |
完了したらファイルを保存して閉じます。次に、UFWに対してデフォルトで転送(フォワード)されたパケットも許可するように設定する必要があります。これを行うには、/etc/default/ufw ファイルを開きます。
|
1 |
sudo nano /etc/default/ufw |
内部で DEFAULT_FORWARD_POLICY ディレクティブを見つけ、値を DROP から ACCEPT に変更します。
|
1 |
DEFAULT_FORWARD_POLICY="ACCEPT" |
完了したらファイルを保存して閉じます。次に、OpenVPNへのトラフィックを有効にするためにファイアウォールを調整します。/etc/openvpn/server.conf ファイルでポートとプロトコルを変更していない場合は、ポート1194へのUDPトラフィックを開放する必要があります。ポートやプロトコルを変更した場合は、ここで選択した値に置き換えてください。前提条件のチュートリアルに従った際にSSHポートを追加し忘れた場合は、ここでも追加してください。
|
1 2 |
sudo ufw allow 1194/udp sudo ufw allow OpenSSH |
これらのルールを追加した後、UFWを一度無効にしてから再度有効にし、再起動して変更したすべてのファイルから設定を読み込みます。
|
1 2 |
sudo ufw disable sudo ufw enable |

おめでとうございます。これでサーバーがOpenVPNトラフィックを正しく処理するように設定されました!
まとめ
このチュートリアルを最後まで進めたことで、安全にインターネットを閲覧できるようになりました。あなたの身元、位置情報、トラフィックを第三者の目から守ることができます。
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。