序章

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

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

OpenVPN は、幅広い構成に対応するフル機能のオープンソースのSecure Socket Layer(SSL)VPNソリューションです。 このチュートリアルでは、CentOS 7サーバーでOpenVPNをセットアップし、クライアントマシンからアクセスできるように構成します。

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

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

前提条件

このチュートリアルに従うには、次のものが必要です。

これらの前提条件が整ったら、CentOS7でOpenVPNサーバーのセットアップと構成を開始する準備が整います。

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

まず、サーバーにOpenVPNをインストールします。 また、VPNで使用する内部認証局(CA)の設定に役立つ公開鍵インフラストラクチャ管理ツールであるEasyRSAもインストールします。 また、Easy RSAを使用してSSLキーペアを生成し、VPN接続を保護します。

root以外のsudoユーザーとしてサーバーにログインし、パッケージリストを更新して、最新バージョンがすべて揃っていることを確認します。

  1. sudo yum update -y

エンタープライズLinux用の追加パッケージ(EPEL)リポジトリは、Fedora Projectによって管理される追加のリポジトリであり、非標準ですが人気のあるパッケージが含まれています。 OpenVPNはデフォルトのCentOSリポジトリでは利用できませんが、EPELで利用できるので、EPELをインストールします。

  1. sudo yum install epel-release -y

次に、パッケージリストをもう一度更新します。

  1. sudo yum update -y

次に、OpenVPNとwgetをインストールします。これらは、EasyRSAのインストールに使用します。

  1. sudo yum install -y openvpn wget

wgetを使用して、EasyRSAをダウンロードします。 このチュートリアルでは、easy-rsa-2を使用することをお勧めします。これは、このバージョンで利用可能なドキュメントが他にもあるためです。 easy-rsa-2の最新バージョンのダウンロードリンクは、プロジェクトのリリースページにあります。

  1. wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz

次に、tarを使用して圧縮ファイルを抽出します。

  1. tar xfz /tmp/easyrsa

これにより、サーバー上にeasy-rsa-old-2.3.3という新しいディレクトリが作成されます。 /etc/openvpnの下に新しいサブディレクトリを作成し、easy-rsaという名前を付けます。

  1. sudo mkdir /etc/openvpn/easy-rsa

抽出したEasyRSAファイルを新しいディレクトリにコピーします。

  1. sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa

次に、ディレクトリの所有者をroot以外のsudoユーザーに変更します。

sudo chown sammy /etc/openvpn/easy-rsa/

これらのプログラムがインストールされ、システムの適切な場所に移動されたら、次のステップはOpenVPNのサーバー側の構成をカスタマイズすることです。

ステップ2—OpenVPNの設定

他の多くの広く使用されているオープンソースツールと同様に、利用可能な構成オプションは数十あります。 このセクションでは、基本的なOpenVPNサーバー構成をセットアップする方法について説明します。

OpenVPNのドキュメントディレクトリには、いくつかの設定ファイルの例があります。 まず、サンプルのserver.confファイルを独自の構成ファイルの開始点としてコピーします。

  1. sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn

選択したテキストエディタで編集するために新しいファイルを開きます。 この例ではnanoを使用します。これは、サーバーにまだインストールされていない場合は、yum install nanoコマンドでダウンロードできます。

  1. sudo nano /etc/openvpn/server.conf

このファイルには変更が必要な行がいくつかありますが、そのほとんどは、行の先頭にあるセミコロン;を削除してコメントを解除する必要があります。 これらの行の機能、およびこのチュートリアルで言及されていない他の行は、それぞれの上のコメントで詳細に説明されています。

開始するには、push "redirect-gateway def1 bypass-dhcp"を含む行を見つけてコメントを外します。 これを行うと、OpenVPNサーバーを介してすべてのトラフィックをリダイレクトするようにクライアントに指示されます。 この機能を有効にすると、SSHなどの他のネットワークサービスとの接続の問題が発生する可能性があることに注意してください。

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

クライアントはISPが提供するデフォルトのDNSサーバーを使用できないため(トラフィックが再ルーティングされるため)、OpenVPNへの接続に使用できるDNSサーバーをクライアントに通知する必要があります。 さまざまなDNSサーバーを選択できますが、ここでは、8.8.8.88.8.4.4のIPを持つGoogleのパブリックDNSサーバーを使用します。

これを設定するには、push "dhcp-option DNS ..."の両方の回線のコメントを解除し、IPアドレスを更新します。

/etc/openvpn/server.conf
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

OpenVPNは、起動後に特権なしで実行する必要があるため、nobodyのユーザーとグループで実行するように指示する必要があります。 これを有効にするには、user nobodyおよびgroup nobody行のコメントを解除します。

/etc/openvpn/server.conf
user nobody
group nobody

次に、topology subnet行のコメントを解除します。 これは、その下のserver 10.8.0.0 255.255.255.0行とともに、OpenVPNインストールをサブネットワークとして機能するように構成し、クライアントマシンに使用するIPアドレスを通知します。 この場合、サーバーは10.8.0.1になり、最初のクライアントは10.8.0.2になります。

/etc/openvpn/server.conf
topology subnet

また、サーバー構成ファイルに次の行を追加することをお勧めします。 これにより、着信クライアント証明書が本当にクライアントからのものであるかどうかが再確認され、後の手順で確立するセキュリティパラメータが強化されます。

/etc/openvpn/server.conf
remote-cert-eku "TLS Web Client Authentication"

最後に、OpenVPNは、ユーザーがTLS認証を有効にすることを強くお勧めします。これは、コンピューターネットワークを介した安全な通信を保証する暗号化プロトコルです。 これを行うには、静的暗号化キーを生成する必要があります(この例では、myvpn.tlsauthという名前が付けられていますが、任意の名前を選択できます)。 このキーを作成する前に、tls-auth ta.key 0を含む構成ファイルの行にセミコロンを付けて、コメントを付けてください。 次に、その下の行にtls-crypt myvpn.tlsauthを追加します。

/etc/openvpn/server.conf
;tls-auth ta.key 0
tls-crypt myvpn.tlsauth

OpenVPNサーバー構成ファイルを保存して終了し(nanoでは、CTRL - XYENTERを押して実行します)、次のコマンドで静的暗号化キーを生成します:

  1. sudo openvpn --genkey --secret /etc/openvpn/myvpn.tlsauth

サーバーが構成されたので、VPN接続に安全に接続するために必要なSSLキーと証明書の設定に進むことができます。

ステップ3—キーと証明書の生成

Easy RSAは、プログラムにインストールされている一連のスクリプトを使用して、キーと証明書を生成します。 証明書を生成する必要があるたびに再構成することを回避するために、Easy RSAの構成を変更して、国、都市、優先電子メールアドレスなどの証明書フィールドに使用するデフォルト値を定義できます。

Easy RSAが生成したキーと証明書を保存するディレクトリを作成することから、キーと証明書を生成するプロセスを開始します。

  1. sudo mkdir /etc/openvpn/easy-rsa/keys

デフォルトの証明書変数は、/etc/openvpn/easy-rsavarsファイルに設定されているため、そのファイルを開いて編集します。

  1. sudo nano /etc/openvpn/easy-rsa/vars

ファイルの一番下までスクロールし、export KEY_で始まる値を情報に一致するように変更します。 最も重要なものは次のとおりです。

  • KEY_CN:ここで、サーバーに解決されるドメインまたはサブドメインを入力します。
  • KEY_NAME:ここにserverと入力する必要があります。 他の何かを入力する場合は、server.keyおよびserver.crtを参照する構成ファイルも更新する必要があります。

このファイルで変更する可能性のある他の変数は次のとおりです。

  • KEY_COUNTRY:この変数には、居住国の国の2文字の略語を入力します。
  • KEY_PROVINCE:これはあなたの住居の州の名前または略語である必要があります。
  • KEY_CITY:ここにあなたが住んでいる都市の名前を入力してください。
  • KEY_ORG:これは組織または会社の名前である必要があります。
  • KEY_EMAIL:セキュリティ証明書に接続するメールアドレスを入力します。
  • KEY_OU:これは、所属する「組織単位」の名前である必要があります。通常は、部門またはチームの名前です。

残りの変数は、特定のユースケース以外では安全に無視できます。 変更を加えると、ファイルは次のようになります。

/ etc / openvpn / easy-rsa / vars
. . .

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York"
export KEY_ORG="DigitalOcean"
export KEY_EMAIL="[email protected]"
export KEY_EMAIL=[email protected]
export KEY_CN=openvpn.example.com
export KEY_NAME="server"
export KEY_OU="Community"
. . .

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

キーと証明書の生成を開始するには、easy-rsaディレクトリに移動し、varsファイルで設定した新しい変数のsourceに移動します。

  1. cd /etc/openvpn/easy-rsa
  2. source ./vars

EasyRSAのclean-allスクリプトを実行して、フォルダーに既に存在するすべてのキーと証明書を削除し、認証局を生成します。

  1. ./clean-all

次に、build-caスクリプトを使用して認証局を構築します。 証明書フィールドの値を入力するように求められますが、以前にvarsファイルで変数を設定した場合、すべてのオプションがデフォルトとしてすでに設定されています。 ENTERを押すと、それぞれのデフォルトを受け入れることができます。

  1. ./build-ca

このスクリプトは、ca.keyというファイルを生成します。 これは、サーバーとクライアントの証明書に署名するために使用される秘密鍵です。 紛失した場合、この認証局からの証明書を信頼できなくなります。また、誰かがこのファイルにアクセスできる場合は、知らないうちに新しい証明書に署名してVPNにアクセスできます。 このため、OpenVPNはca.keyを可能な限りオフラインにできる場所に保存することをお勧めします。これは、新しい証明書を作成するときにのみアクティブ化する必要があります。

次に、build-key-serverスクリプトを使用して、サーバーのキーと証明書を作成します。

  1. ./build-key-server server

CAの構築と同様に、デフォルトとして設定した値が表示されるので、これらのプロンプトでENTERを押すことができます。 さらに、チャレンジパスワードとオプションの会社名を入力するように求められます。 チャレンジパスワードを入力すると、クライアントからVPNに接続するときにパスワードの入力を求められます。 チャレンジパスワードを設定したくない場合は、この行を空白のままにして、ENTERを押してください。 最後に、Yと入力して変更をコミットします。

サーバーキーと証明書の作成の最後の部分は、Diffie-Hellmanキー交換ファイルの生成です。 これを行うには、build-dhスクリプトを使用します。

  1. ./build-dh

これが完了するまでに数分かかる場合があります。

サーバーがキー交換ファイルの生成を終了したら、サーバーのキーと証明書をkeysディレクトリからopenvpnディレクトリにコピーします。

  1. cd /etc/openvpn/easy-rsa/keys
  2. sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

OpenVPNサーバーがクライアントを認証するには、各クライアントにも証明書が必要です。 これらのキーと証明書はサーバー上に作成され、クライアントにコピーする必要があります。これは後の手順で行います。 VPNに接続する予定のクライアントごとに個別のキーと証明書を生成することをお勧めします。

ここではクライアントを1つだけ設定するため、clientと呼びますが、必要に応じて、これをよりわかりやすい名前に変更できます。

  1. cd /etc/openvpn/easy-rsa
  2. ./build-key client

最後に、バージョン管理されたOpenSSL構成ファイルopenssl-1.0.0.cnfをバージョンなしの名前openssl.cnfにコピーします。 そうしないと、OpenSSLがバージョンを検出できないために構成をロードできないというエラーが発生する可能性があります。

  1. cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

サーバーとクライアントに必要なすべてのキーと証明書が生成されたので、2台のマシン間のルーティングの設定に進むことができます。

ステップ4—ルーティング

これまで、サーバーにOpenVPNをインストールして構成し、クライアントがVPNにアクセスするために必要なキーと証明書を生成しました。 ただし、クライアントからの着信Webトラフィックの送信先に関する指示はOpenVPNにまだ提供されていません。 いくつかのファイアウォールルールとルーティング構成を確立することにより、サーバーがクライアントトラフィックを処理する方法を規定できます。

このチュートリアルの開始時に前提条件に従っていると仮定すると、サーバーにfirewalldがインストールされて実行されているはずです。 OpenVPNがファイアウォールを通過できるようにするには、アクティブなfirewalldゾーンが何であるかを知る必要があります。 次のコマンドでこれを見つけます。

  1. sudo firewall-cmd --get-active-zones
Output
trusted Interfaces: tun0

次に、アクティブゾーン内でfirewalldによって許可されるサービスのリストにopenvpnサービスを追加し、--permanentオプションを追加してコマンドを再度実行することにより、その設定を永続的にします。

  1. sudo firewall-cmd --zone=trusted --add-service openvpn
  2. sudo firewall-cmd --zone=trusted --add-service openvpn --permanent

次のコマンドを使用して、サービスが正しく追加されたことを確認できます。

  1. sudo firewall-cmd --list-services --zone=trusted
Output
openvpn

次に、現在のランタイムインスタンスにマスカレードを追加し、--permanentオプションを使用してマスカレードを再度追加して、将来のすべてのインスタンスにマスカレードを追加します。

  1. sudo firewall-cmd --add-masquerade
  2. sudo firewall-cmd --permanent --add-masquerade

次のコマンドを使用して、マスカレードが正しく追加されたことを確認できます。

  1. sudo firewall-cmd --query-masquerade
Output
yes

次に、OpenVPNサブネットにルーティングを転送します。 これを行うには、最初にサーバーで使用されるプライマリネットワークインターフェイスを表す変数(この例ではSHARK)を作成し、次にその変数を使用してルーティングルールを永続的に追加します。

  1. SHARK=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
  2. sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $SHARK -j MASQUERADE

これらの変更をファイアウォールルールに実装するには、firewalldをリロードしてください。

  1. sudo firewall-cmd --reload

次に、IP転送を有効にします。 これにより、すべてのWebトラフィックがクライアントからサーバーのIPアドレスにルーティングされ、クライアントのパブリックIPアドレスが事実上非表示になります。

sysctl.confを開いて編集します。

  1. sudo nano /etc/sysctl.conf

次に、ファイルの先頭に次の行を追加します。

/etc/sysctl.conf
net.ipv4.ip_forward = 1

最後に、ネットワークサービスを再起動して、IP転送を有効にします。

  1. sudo systemctl restart network.service

ルーティングとファイアウォールのルールを設定すると、サーバーでOpenVPNサービスを開始できます。

ステップ5—OpenVPNを開始する

OpenVPNは、systemctlを使用してsystemdサービスとして管理されます。 サーバーが稼働している限りいつでもVPNに接続できるように、起動時に起動するようにOpenVPNを構成します。 これを行うには、OpenVPNサーバーをsystemctlに追加して有効にします。

  1. sudo systemctl -f enable [email protected]

次に、OpenVPNサービスを開始します。

  1. sudo systemctl start [email protected]

次のコマンドを使用して、OpenVPNサービスがアクティブであることを再確認します。 出力にactive (running)が表示されます。

  1. sudo systemctl status [email protected]
Output
[email protected] - OpenVPN Robust And Highly Flexible Tunneling Application On server Loaded: loaded (/usr/lib/systemd/system/[email protected]; enabled; vendor preset: disabled) Active: **active (running)** since Wed 2018-03-14 15:20:11 EDT; 7s ago Main PID: 2824 (openvpn) Status: "Initialization Sequence Completed" CGroup: /system.slice/system-openvpn.slice/[email protected] └─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf . . .

これで、OpenVPNのサーバー側の構成が完了しました。 次に、クライアントマシンを構成し、OpenVPNサーバーに接続します。

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

クライアントマシンのオペレーティングシステムに関係なく、ローカルに保存されたCA証明書のコピー、ステップ3で生成されたクライアントキーと証明書、およびステップ2の最後に生成された静的暗号化キーが必要になります。

サーバーで次のファイルを見つけます。 一意のわかりやすい名前で複数のクライアントキーを生成した場合、キーと証明書の名前は異なります。 この記事では、clientを使用しました。

/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key
/etc/openvpn/myvpn.tlsauth

これらのファイルをクライアントマシンにコピーします。 SFTPまたはお好みの方法を使用できます。 テキストエディタでファイルを開き、コンテンツをコピーしてクライアントマシンの新しいファイルに貼り付けることもできます。 使用する方法に関係なく、これらのファイルを保存する場所に注意してください。

次に、クライアントマシン上にclient.ovpnというファイルを作成します。 これはOpenVPNクライアントの構成ファイルであり、サーバーへの接続方法を示しています。

  1. sudo nano client.ovpn

次に、client.ovpnに次の行を追加します。 これらの行の多くは、コメントを外したり、server.confファイルに追加したもの、またはデフォルトですでにファイルに含まれているものを反映していることに注意してください。

client.ovpn
client
tls-client
ca /path/to/ca.crt
cert /path/to/client.crt
key /path/to/client.key
tls-crypt /path/to/myvpn.tlsauth
remote-cert-eku "TLS Web Client Authentication"
proto udp
remote your_server_ip 1194 udp
dev tun
topology subnet
pull
user nobody
group nobody

これらの行を追加するときは、次の点に注意してください。

  • キーと証明書にクライアントに付けた名前を反映するように、最初の行を変更する必要があります。 私たちの場合、これはclientです。
  • また、IPアドレスをyour_server_ipからサーバーのIPアドレスに更新する必要があります。 ポート1194は同じままでかまいません
  • キーファイルと証明書ファイルへのパスが正しいことを確認してください

このファイルは、OpenVPNクライアントがサーバーに接続するために使用できるようになりました。 以下は、クライアントを接続する方法に関するOS固有の手順です。

ウィンドウズ:

Windowsでは、GUIに付属する公式の OpenVPNCommunityEditionバイナリが必要になります。 .ovpn構成ファイルを適切なディレクトリC:\Program Files\OpenVPN\configに配置し、GUIで接続をクリックします。 Windows上のOpenVPNGUIは、管理者権限で実行する必要があります。

マックOS:

macOSでは、オープンソースアプリケーション Tunnelblick は、WindowsのOpenVPN GUIと同様のインターフェイスを提供し、OpenVPNと必要なTUN/TAPドライバーが付属しています。 Windowsと同様に、必要な手順は.ovpn構成ファイルを~/Library/Application Support/Tunnelblick/Configurationsディレクトリに配置することだけです。 または、.ovpnファイルをダブルクリックすることもできます。

Linux:

Linuxでは、ディストリビューションの公式リポジトリからOpenVPNをインストールする必要があります。 次に、以下を実行してOpenVPNを呼び出すことができます。

  1. sudo openvpn --config ~/path/to/client.ovpn

クライアント接続が正常に確立されたら、 GoogleをチェックしてパブリックIPを表示することにより、トラフィックがVPN経由でルーティングされていることを確認できます。

結論

これで、OpenVPNサーバーで完全に機能する仮想プライベートネットワークが実行されているはずです。 悪意のある攻撃者があなたの活動を追跡することを心配することなく、Webを閲覧してコンテンツをダウンロードできます。

VPNに自動的に接続するようにクライアントを構成したり、クライアント固有のルールとアクセスポリシーを構成したりするなど、OpenVPNのインストールをさらにカスタマイズするために実行できるいくつかの手順があります。 これらおよびその他のOpenVPNのカスタマイズについては、公式のOpenVPNドキュメントを参照してください。 インターネット上の自分自身とマシンを保護する他の方法に興味がある場合は、7サーバーを保護するためのセキュリティ対策に関する記事を確認してください。