はじめに
先日、新しくサーバを借りてVPN環境を構築しました。色んなサイトを参考にしましたがけっこうづまづいたので、つまづいたポイントに着目しながら構築方法を紹介したいと思います。
VPNを利用するメリットとしてよくあるのが、外出先にいながら自宅のネットワークにアクセスしてデータを見ることができることですが、この記事では直近のネットワークとVPNとの接続を暗号化し、フリーWi-Fi等でもセキュアにインターネットを利用できることを目的としています。なので、VPNへの接続だけではなく、そこからインターネットに接続する方法まで説明します。もちろん前者の理由でもこの記事は十分参考になるかと思います。
また、OpenVPNではルーティング方式とブリッジ方式の2通りが選べますが、この記事ではルーティング方式の構築方法を説明します。
OpenVPNの構築に関しては「さくらのVPS512(月々税抜635円)で固定IPアドレスをゲットする(OpenVPNサーバを作る)」が大変参考になりました。この記事ではCentOSをメインにしていますが、ここではUbuntuを例に紹介しています。また、この記事ではネットワーク(IPマスカレード等)の説明が省略されていたので、その設定もできるだけ詳しく説明していこうと思います。
環境
- Ubuntu 16.04 LTS
- OpenVPN 2.3.10
インストール
必要なソフトをインストールします。まずは今回の主役であるOpenVPNをインストールします。
$ sudo apt -y install openvpn
次に Easy RSA をダウンロードします。apt
でインストールすることもできますが、専用のコマンドが用意されておらず、各種鍵を生成するコマンドがサブコマンド方式になっていなくて少々使いづらいので、今回は公式のリポジトリから最新版をダウンロードすることにします。
$ git clone https://github.com/OpenVPN/easy-rsa.git
git
コマンドがない場合はapt
でインストールしてください。
カレントディレクトリに Easy RSA がダウンロードされます。どこにダウンロードしても良いです。
認証鍵の生成
Easy RSA のディレクトリに移動します。
$ cd easy-rsa/easyrsa3
ここから認証に必要な各種鍵を生成していきます。ここで注意するポイントは、鍵を生成するコマンドを実行するときは、easyrsa3
ディレクトリ以下でなければいけません。たとえば、このディレクトリのパスを環境変数に登録して標準コマンドとして実行したりするとエラーが発生します。注意してください。以下の鍵の生成コマンドはすべてeasyrsa3
以下で実行するものとします。
初期設定
初期設定をします。以下のコマンドを実行します。
$ ./easyrsa init-pki
エラーが出ずに
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: path/to/easy-rsa/easyrsa3/pki
のように表示されればOKです。
CA証明書の生成
CA証明書を生成します。
$ ./easyrsa build-ca
途中でパスフレーズ(pass phrase)を訊かれるので、パスフレーズを入力してください。その後、もう一度パスフレーズを訊かれるので同じパスフレーズを入力してください。
また、CAの名称(Common Name)を訊かれるので、適当にわかりやすい名前を入力してください。ユーザ名、ホスト名、サーバ名、なんでも良いです。
生成された鍵を/etc/openvpn
以下にコピーします。
$ sudo cp pki/ca.crt /etc/openvpn
サーバ証明書の生成
サーバ証明書を生成します。
$ ./easyrsa build-server-full server nopass
途中でパスフレーズを訊かれたら、先ほどのCA証明書のパスフレーズを入力します。
生成された鍵をコピーします。
$ sudo cp pki/issued/server.crt /etc/openvpn
$ sudo cp pki/private/server.key /etc/openvpn
DH鍵の生成
DH鍵を生成します。
$ ./easyrsa gen-dh
鍵の生成には時間がかかる場合があります。
生成された鍵をコピーします。
$ sudo cp pki/dh.pem /etc/openvpn
クライアント証明書の生成
クライアント証明書を生成します。
$ ./easyrsa gen-crl
パスフレーズを訊かれたら、CA証明書のパスフレーズを入力します。
生成された鍵をコピーします。
$ sudo cp pki/crl.pem /etc/openvpn
$ sudo chmod o+r /etc/openvpn/crl.pem
他の参考サイトではダミーのクライアント証明書を作る手順が説明されていますが、これはただの確認なので、やらなくても問題ありません。
OpenVPNサーバの設定
OpenVPNサーバを起動するための設定ファイルを作成します。/etc/openvpn
以下にserver.conf
というファイルを作成し、以下の設定を入力します。
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
crl-verify crl.pem
ifconfig-pool-persist ipp.txt
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3
基本的には上記の設定で問題ないかと思います。以下、細かく説明していきます。
ポート(port)
OpenVPNに接続するポート番号です。このポートはクライアント、サーバともに開放されていないといけません(サーバでのポートの設定については後述します)。
OpenVPNのデフォルトのポート番号は1194
です。ポートが制限されていない環境では変更する必要はありませんが、大学や社内ネットワークの場合、1194
番ポートが遮断されているかもしれません。
その場合は443
番ポートを使用することをおすすめします。443
番ポートはHTTPSで使用するポート番号であるため、インターネットに接続できるネットワークであれば遮断されていることはほぼありません。
ただし、社内ネットワークでVPN接続を行う場合はコンプライアンス違反とならないように気をつけてください。社内ネットワークにてVPNが使用しても差し支えないかどうかはネットワーク管理者に相談してください。
プロトコル(proto)
接続するプロトコルを設定します。tcp
またはudp
を指定します。
デフォルトはudp
です。udp
のほうが速度が速いのでudp
をおすすめします。
ただし上記と同じく大学や社内ネットワークではudp
が遮断されている場合があるので、うまく接続できない場合はtcp
を使用することができます。なお、443
番ポートを使用する場合はudp
ではなくtcp
を使用することをおすすめします。
接続方式(dev)
ルーティング方式で接続するか、ブリッジ方式で接続するかを設定します。ルーティング方式の場合はtun
, ブリッジ方式の場合はtap
を指定します。
今回の説明はルーティング方式なのでtun
を指定してください。ブリッジ方式の場合は、これ以外にも設定が異なる箇所があるので、ブリッジの場合は各自調べてください。
CA証明書(ca)
各種鍵の生成で生成されたCA証明書を指定します。ファイル名を変更していない場合(この記事の説明通りの場合)はそのままでOKです。
サーバ証明書(cert, key)
CA証明書と同じく、生成されたサーバ証明書を指定します。そのままでOKです。
DH鍵(dh)
DH鍵を指定します。上記と同じくそのままでOKです。
クライアント証明書(crl)
クライアント証明書を指定します。そのままでOKです。
IPアドレスのテーブルファイル(ifconfig-pool-persist)
VPNに接続してくるクライアントのプライベートIPを管理するためのテーブルファイルです。
複数の端末をVPNに接続したときに、端末同士でプライベートIPアドレスがかぶらないように制御するためのテーブルです。保存するファイル名を指定するだけなので、そのままでOKです。
ネットワークの設定(server)
VPNで使用するプライベートIPアドレスとサブネットマスクを指定します。デフォルトは10.8.0.0 255.255.255.0
です。変更する場合には適切なプライベートIPアドレスとサブネットマスクを指定します。通常はそのままでOKです。
クライアントの設定(push)
クライアントの接続方法を指定します。
"redirect-gateway def1 bypass-dhcp"
はVPN接続後にすべてのトラフィックをVPN経由で行います。この設定がないとVPNに接続してもWebトラフィックは直近のネットワークで行ってしまいます。
"route 10.8.0.0 255.255.255.0"
はVPNで使用するプライベートIPアドレスとサブネットマスクをクライアント側に通知します。server
と同じプライベートIPアドレス、サブネットマスクを指定します。
"dhcp-option DNS 8.8.8.8"
は使用するDNSを指定します。今回はGoogleパブリックDNSを使用しているので8.8.8.8
が設定されています。通常はこのままでOKですが、DNSを変更したい場合は変更してください。
クライアント間の接続(client-to-client)
クライアント間の接続を許可するかどうかを指定します。許可する場合はこの設定を追加します。
生存確認(keepalive)
通信相手の生存確認のためのパケット送信の間隔と閾値を指定します。デフォルトは 10 120
です。
左の数値が何秒ごとにパケットを送信するかを表し、右の数値がその秒数まで経っても応答がない場合にコネクションを切断することを表します。たとえばデフォルトの 10 120
では、10秒ごとにパケットを送信し、相手が応答するかどうか(切断していないかどうか)を確認します。そして120秒経過しても(12回のパケット送信を行っても)相手から応答がない場合は、切断されます。
comp-lzo
通信パケットを圧縮するかどうかを指定します。圧縮する場合はこの設定を追加します。
圧縮すると通信するパケット数が減るため通信速度は速くなりますが、圧縮処理がかかるため、性能の低いマシンだと圧縮することにより速度が低下する場合があります。圧縮するかどうかはマシンの性能によりますが、通常は圧縮する設定でOKです。
ユーザとグループ(user, group)
OpenVPNのプロセスをどのユーザ、どのグループで実行するかを指定します。rootユーザで実行するのはセキュアではないため、この設定は入れておくべきです。デフォルトは、ユーザがnobody
で、グループがnogroup
です。
この設定がハマったポイントで、多くのサイトでは、グループをnobody
と設定していますが、Ubuntuではnobody
というグループがないため、エラーになります。おそらくCentOSではグループもnobody
とするとうまくいきますが、ここがUbuntuと違うので、Ubuntuで構築している人は注意です。
参考元: UbuntuにOpenVPNを導入する
設定の永続化(persist-key, persist-tun)
再起動時に特定のリソースにアクセスすることを避けるためのオプションらしいです。通常はつけておいてOKです。
状態(status)
OpenVPNに接続しているクライアントの状態(情報)を書き込むファイルを指定します。デフォルトはopenvpn-status.log
です。
このファイルはデフォルト設定の場合は/etc/openvpn
以下に保存されます。ログは/var/log
以下に置いたほうが管理しやすいので、/var/log/openvpn-status.log
に変更しています。特に理由がなければ/var/log
をおすすめします。
ログ(log, log-append)
OpenVPNのログを書き込むファイルを指定します。デフォルトはopenvpn.log
です。
このファイルはデフォルトの設定の場合は/etc/openvpn
以下に保存されます。openvpn-status.log
と同様に/var/log/openvpn.log
に保存されるように変更しています。
ログの冗長性(verb)
ログファイルに書き込む内容の冗長性の度合いを指定します。デフォルトは3
です。
数値が低い場合は必要最低限のログしか書き込まれませんが、数値が高くなるにつれて事細かにログを書き込むようになります。数値は0〜9までで、数値の目安は以下の通りです。
レベル | 説明 |
---|---|
0 | 致命的なエラー以外はログを出力しない |
4 | 適切な程度のログを出力する |
5〜6 | 接続エラーのデバッグに役立つようにログを出力する |
9 | 非常に冗長的にログを出力する |
ファイアウォールの設定
ファイアウォールを設定します。iptables
コマンドで設定するサイトの説明が多かったですが、ここではUbuntuにデフォルトでインストールされているufw
コマンドを使ってファイアウォールを設定していきます。
UFWでのファイアウォールの設定は「ufwでファイアーウォールを設定」がわかりやすかったです。
まずはすべてのポートを遮断します。
$ sudo ufw default deny
次に今回のOpenVPNで使う1194
番ポート(UDP)を許可します。
$ sudo ufw allow 1194/udp
OpenVPNサーバの設定でポートを1194
以外にした場合は適宜変更してください。UDPではなくTCPにした場合も同様です。
また、ここまでの設定をSSHでログインして行っている場合は、SSHのポートも開けておく必要があります。たとえば、SSHのポートを2222
で設定している場合は
$ sudo ufw allow 2222
のように設定します。SSHは通常22
番ポートですが、22
番ポートでの使用はセキュリティ上おすすめしません。SSHで使用するポートの変更の手順に関してはここでは省略します。
SSHのポートを開けておくのを忘れると、SSHからログアウトしたあとにサーバに接続できなくなってしまうので十分注意してください。
ここまで設定できたら、ファイアウォールを有効化します。
$ sudo ufw enable
ファイアウォールが有効化されているか、また正しくポートが設定されているかを確認するには以下のコマンドを実行します。
$ sudo ufw status
Status: active
To Action From
-- ------ ----
2222/tcp ALLOW Anywhere
1194/udp ALLOW Anywhere
2222/tcp (v6) ALLOW Anywhere (v6)
1194/udp (v6) ALLOW Anywhere (v6)
上記のようにOpenVPNのポートが開いていればOKです。SSHを利用している場合はSSHのポート(上記の例では2222
番ポート)が開いていることも確認してください。念のため、別のシェルを起動してSSHでログインできるかどうか確認すると確実です。
フォワーディングとマスカレードの設定
この状態の設定だと、VPNには接続できても、そこからインターネットに接続できません。インターネットに接続しようとしても、送信したパケットがクライアントに転送されるように設定しないとWebサイトにアクセスすることができなくなってしまいます。なのでインターネットに接続するための設定を行います。
フォワーディングとマスカレードの設定に関しては、「ufw でルータをつくる」と「UFW と NAPT を両立させる」がとても参考になりました。
IPフォワーディング
まずはパケット転送を有効にします。/etc/default/ufw
を開き、DEFAULT_FORWARD_POLICY
をDROP
からACCEPT
に変更します。
- DEFAULT_FORWARD_POLICY="DROP"
+ DEFAULT_FORWARD_POLICY="ACCEPT"
IPフォワーディングを有効にします。/etc/ufw/sysctl.conf
を開き、net.ipv4.ip_forward=1
の一行をアンコメントします。
- # net.ipv4.ip_forward=1
+ net.ipv4.ip_forward=1
IPマスカレード
IPマスカレードを有効にします。その前に、インターネットにつながっているネットワークインターフェースの名称を調べます。ifconfig
を実行します。
$ ifconfig
ens3 Link encap:Ethernet HWaddr ab:cd:ef:gh:ij:kl
inet addr:216.58.197.228 Bcast:216.58.198.255 Mask:255.255.254.0
inet6 addr: 0123:4567:890:1234:216:58:197:228/64 Scope:Global
inet6 addr: abcd::efgh:ijkl:mnop:qrst/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1892979 errors:0 dropped:0 overruns:0 frame:0
TX packets:167294 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:241710378 (241.7 MB) TX bytes:107644167 (107.6 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:160 errors:0 dropped:0 overruns:0 frame:0
TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:11840 (11.8 KB) TX bytes:11840 (11.8 KB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:38514 errors:0 dropped:0 overruns:0 frame:0
TX packets:60151 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:8130438 (8.1 MB) TX bytes:69942984 (69.9 MB)
複数のインターフェースが出てくると思いますが、その中で inet addr
がグローバル IP アドレスになっているものを探してください。上記の例でいうと、ens3
がそれに該当します。それを覚えておきます。
/etc/ufw/before.rules
を開き、以下を追加します。一番下の行にCOMMIT
と書かれているはずなので、この下に追加していきます。
COMMIT
+
+ *nat
+ :POSTROUTING ACCEPT [0:0]
+ -A POSTROUTING -s 10.8.0.0/24 -o ens3 -j MASQUERADE
+ COMMIT
POSTROUTING
のIPアドレスはOpenVPNサーバの設定のserver
の箇所にあるものと同じIPアドレス、サブネットマスクを設定します。サブネットマスクが255.255.255.0
の場合は/24
となります。この記事の例と同じIPアドレスの設定にした場合は、ここでの設定も同じでOKです。
ens3
という箇所は、先ほど ifconfig
で調べた際の、インターネットにつながっているネットワークインターフェースの名称です。別の名称だった場合は変更してください。多くの場合は ens3
や eth0
などになっているかと思われます。
ここまで設定できたらファイアウォールを再起動して変更を反映させます。
$ sudo ufw reload
エラーが出なければOKです。
【注意】さくらの VPS における「ネットワークインターフェース」について
実は、今までずっと問題なく接続できていた VPN が、数週間前に、設定も全くいじっていないのに突然接続できなくなってしまいました。その原因が数週間ずっとわからず、数週間調べ続けてようやくわかったのですが、どうやらさくらの VPS で、ネットワークインターフェース名が変わったような気がします。
もちろん確証はないのですが、ifconfig
を実行したときの、インターネットにつながっているインターフェースの名称が、今まで eth0
だったのが突然 ens3
に変わっていました。その影響で、VPN 接続でインターネットに接続できなくなってしまいました。
ここからが注意ポイントなのですが、インターフェース名が変わったにもかかわらず、さくらの VPS コントロールパネルでは、eth0
と表記されています。
コントロールパネルで見る限りでは、インターネットにつながっているインターフェースは eth0
となっていますが、実際には違います。なので、必ず ifconfig
の実行結果を確認してください。これはさくらの VPS に限らず、他のサーバでも ifconfig
の結果を信用するようにしてください。
OpenVPNサーバの起動
いよいよここでOpenVPNを起動します。
$ sudo systemctl start openvpn
問題なく起動できているか確認するには以下のコマンドを実行します。
$ ps -ef | grep openvpn | grep -v grep
プロセスが起動していればOKです。
ここで注意すべき点は二つあります。一つはエラーが発生していても、標準出力には表示されないことです。エラーが発生している場合は/var/log/openvpn.log
にエラーが出力されるので、そのファイルを確認してみてください。上記コマンドでプロセスが起動していなかった場合はエラーが発生していることを意味します。
もう一つはエラーが発生して起動されなかったとしても、systemdにおけるOpenVPNはactive
と表示されることです。なので
$ systemctl status openvpn
でactive
になっていたとしても、プロセスが起動していない場合はエラーなので、十分注意してください。ここはかなりの罠ポイントです。
OpenVPN サーバが起動できない場合
設定は合っているはずなのに、/var/log/openvpn.log
に謎のエラーが発生して OpenVPN のプロセスが表示されない場合は、代わりに openvpn@server
が起動できるか確認してください。
$ sudo systemctl stop openvpn
$ sudo systemctl start openvpn@server
$ ps -ef | grep openvpn | grep -v grep
ps
コマンドで、OpenVPN のプロセスが起動していた場合はこれで OK です。今後は、openvpn
の代わりに openvpn@server
を使用してください。これでも起動できなかった場合は /etc/openvpn/server.conf
の設定が間違っていたり、UFW でポートが閉じていたりしている可能性があるので、そちらをもう一度確認してください。
また、サーバをリブートしたときに openvpn
ではなく openvpn@server
が自動起動されるように、設定を変更します。
$ sudo systemctl disable openvpn
$ sudo systemctl enable openvpn@server
$ systemctl is-enabled openvpn openvpn@server
disabled
enabled
openvpn
が disabled
で、openvpn@server
が enabled
となっていれば OK です。
クライアント用秘密鍵の生成
ここまで来たらサーバ側の設定はあともう少しです。クライアント側で使用する鍵を生成します。各種鍵を生成したときと同様に、Easy RSA のディレクトリに移動します。
$ cd easy-rsa/easyrsa3
以下のコマンドを実行します。
$ ./easyrsa build-client-full username
username
には任意のユーザ名を入力します。なんでも良いですが、複数の端末で利用する場合はわかりやすいユーザ名をつけてください。
パスフレーズを訊かれるので、設定します。確認のためにもう一度訊かれるので同じパスフレーズを入力します。最後にCA証明書のパスフレーズを訊かれるので、CA証明書を生成したときのパスフレーズを入力します。パスフレーズが多くなってくるとややこしいので、すべて同じパスフレーズにしても良いかと思います(このファイルが盗まれない限りはパスフレーズの役目はないので)。
クライアント側にダウンロードする鍵ファイルをわかりやすい場所にコピーして、所有者を変更します。今回はホームディレクトリにコピーします。
$ sudo cp /etc/openvpn/ca.crt ~
$ cp pki/issued/username.crt ~
$ cp pki/private/username.key ~
$ sudo chown sshuser:sshuser ~/ca.crt
$ sudo chown sshuser:sshuser ~/username.crt
$ sudo chown sshuser:sshuser ~/username.key
username
は先ほどと同じユーザ名を入力してください。sshuser
にはVPNサーバの現在ログインしているユーザのユーザ名を入力してください。
鍵ファイルのダウンロード
先ほどホームディレクトリにコピーした3つの鍵ファイルを、OpenVPNに接続するクライアントPCにダウンロードします。やり方は様々ありますが、scp
コマンドを利用するのが一番簡単だと思います。scp
コマンドの使い方に関しては「scpコマンドでサーバー上のファイルorディレクトリをローカルに落としてくる」を参考にしてください。
これでサーバ側の設定は終了です。次はクライアント側の設定です。
クライアントアプリのインストール
VPNの設定はOS標準の設定機能でも行えるので、はじめはその設定方法で調べていたのですが、どのサイトを見ても、専用のクライアントアプリを使用していたので、先人たちの教えに従い、アプリをインストールして設定しました。OpenVPNでは各種OSに対応したアプリが提供されているので、それを使って接続するのが一般的なようです。
ここでは、Macについて紹介します。Windowsの人は「さくらのVPS512(月々税抜635円)で固定IPアドレスをゲットする(OpenVPNサーバを作る)」を参考にしてください。
Tunnelblickというアプリを使用します。公式サイトからStable
をダウンロードします。ダウンロードしたら、ファイルを開き、画面の指示に従ってインストールしてください。
インストール後の設定についても基本的に画面に指示に従っていれば簡単にできます。詳しくは「OpenVPN プロトコルを用いた VPN Gate への接続方法」を参考にしてください。
OpenVPNクライアントの設定
設定ファイルを用意していない場合、ダウンロードしますかと訊かれるのでダウンロードしましょう。
ダウンロードしたファイルは、コメントがたくさん書かれていますが、コメントを取り除いて必要な部分だけを抽出したクライアントの設定ファイルが以下の通りです。ダウンロードするか訊かれなかったり間違ってダウンロードしないを選択してしまった場合でも、空のファイルを生成して、以下の設定を書き込めばOKです。
ファイル名はなんでも良いですが、ファイル名がクライアントアプリ上では接続先の名称になるのでわかりやすい名前をつけてください。ここではVPN.ovpn
というファイル名にしています。拡張子は.ovpn
でないといけないので注意してください。
client
dev tun
proto udp
remote 192.168.0.0 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert username.crt
key username.key
comp-lzo
verb 3
dev
とproto
に関しては、サーバ側で設定したものを使用してください。この記事と同じ設定にした場合はこちらもそのままでOKです。
remote
に書かれているIPアドレスは、接続するVPNサーバのグローバルIPアドレスを指定してください。上記の設定では例としてプライベートIPアドレスが書かれていますが、ここをサーバのグローバルIPアドレスに変更します。IPアドレスの後ろのポート番号はサーバで設定したポート番号を設定してください。
ca
, cert
, key
にはダウンロードした3つの鍵ファイルのファイル名を指定します。username
は設定したユーザ名を入力してください。
persist-key
, persist-tun
, comp-lzo
, verb
に関してもサーバ側と同様で、サーバ側に設定してあればこちらにも入力し、設定していない場合は外します。resolv-retry
とnobind
に関してはクライアントのみの設定となりますが、特に問題がないかぎりこのままでOKです。
設定の読み込み
先ほど作成したクライアント側の設定ファイル(VPN.ovpn
)と、ダウンロードした3つの鍵を一つのフォルダにまとめます。そのフォルダは、一度VPNの環境が整ってしまえばほとんど開くことはないので、邪魔にならないところに保存します。自分はホームディレクトリ以下に.vpn
という隠しフォルダで保存しています。
Tunnelblickの指示に従ってやった場合はデスクトップに設定ファイルのサンプルが含まれたフォルダが生成されますが、そのフォルダの中に3つの鍵ファイルを入れて邪魔にならない場所に移動させればOKです。
メニューバーにあるTunnelblickのアイコンをクリックし、VPNの詳細を開きます。「接続先」と書かれている欄に、クライアントの設定ファイル(鍵と設定ファイルが入ったフォルダではなく、設定ファイルVPN.ovpn
)をドラッグアンドドロップして、接続ボタンを押します。
「OpenVPN プロトコルを用いた VPN Gate への接続方法」の記事では、フォルダの拡張子を.tblk
に変更して、そのフォルダ(tblk)を選択していますが、その必要はありません。通常のフォルダのままで、その中にある設定ファイルをドラッグアンドドロップしてください。
接続が開始するとウィンドウが出てきます。接続が完了したらVPNに接続できたことを意味します。そして、その後、適当にサイトにアクセスしてページをリロードしてもちゃんとアクセスできればインターネット接続も成功です、お疲れさまでした!
VPN経由でインターネットに接続されているかを確認するには、このサイトにアクセスして、Public IP address
の欄を見てください。IPアドレスがVPNサーバ側のグローバルIPアドレスであればVPN経由で接続できていることがわかります。
iPhoneからの接続(おまけ)
ここまでができてしまえば、iPhoneからの接続は思ったより簡単だったのでおまけとして紹介します。まずは、iPhone用のOpenVPNクライアントである OpenVPN Connect をインストールします。
次にiPhoneに鍵ファイルをインポートします。ここでの鍵ファイルは、WindowsやMacですでに使用しているものではなく新しいものを使ってください。つまり「クライアント用秘密鍵の生成」の際に行った手順をもう一度繰り返して新しいクライアント用秘密鍵を生成してください。それをクライアントPCにダウンロードしてから、iPhoneにインポートします。
インポートはiTunes経由で行うのが一番簡単です。iTunesでのインポートの手順については「iPhoneやiPad (iOS) でOpenVPNを使ってみよう!」がわかりやすいのでこちらを参考にしてください。このサイトの例ではクライアント秘密鍵を設定ファイルに埋め込んでファイルを一つにまとめる方法が説明されていますが、必須ではありません。PCのときと同様に3つの鍵ファイルと設定ファイルを一つのフォルダにまとめて、そのフォルダを OpenVPN Connect アプリにドラッグアンドドロップすればOKです。
フォルダのインポートが完了したら、OpenVPN Connect アプリを起動し、参考サイトの通り「+」マークを押して、スイッチをオンにすればVPNに接続できます。iPhoneの画面上部に「VPN」と表示されれば接続成功です!
注意ポイント
Ubuntuにはnobodyというグループは存在しない
多くのサイトで、groupをnobody
としていたので、解決するまでに時間がかかりました。これに関してはOpenVPNのログを見ればすぐに解決できたはずなんですが…(次へ続く)
OpenVPNのエラーの存在がわかりにくい
OpenVPNのエラーはログファイルに書き込まれるわけですが、起動した時点では、たとえエラーでも何も表示されません。しかも、systemdで見たときのOpenVPNはactive
になっているのでそちらを信用してしまうと、エラーで起動していないことすら見逃してしまったりします。ps
コマンドを使ってちゃんとプロセスが起動していることを確認しましょう。
マスカレードに設定したIPとVPNで使うIPを一致させる
/etc/openvpn/server.conf
のserver
に設定するIPアドレス(サブネットマスク)と、/etc/ufw/before.rules
にIPマスカレードとして追加するIPアドレス(サブネットマスク)が一致していないとマスカレードが機能しません。当たり前だろうと思いますが設定してるときは間違えていても意外に気づかなかったりします。
プライベートIPアドレスがかぶってはいけない
これに関しては自分はつまづかなかったのですが、直近のネットワークのプライベートIPと、VPN先のプライベートIPが競合すると接続できなくなるようです。プライベートIPアドレスは、VPNに入る前にいるものと被らないものを設定しましょう。
再起動を忘れずに
これは基本的なことではありますが、UFWにしろOpenVPNにしろ、設定を変更しても再起動しないと変更が反映されません。特にUFWの場合は変更が反映されていなくても、status
には変更後の状態で表示されるので、反映されたものと勘違いすることが1〜2回ありました。設定の変更後は再起動を忘れずに。
まとめ
VPN構築は、簡単なようにも見えますが、ちょっと設定を間違えるとつながらなくて、ログもわかりにくいので原因を追求するのが大変です。自分の場合は、10時間以上原因がわからなくて、最終的には「前にエラーでダメだったところなんだけど、もう一回やってみたらうまくいった」という結果でした。
人によってつまづくポイントはさまざまだと思いますが、この記事が、OpenVPNをこれから構築する人たちの役に立てば幸いです。