最近テレワークが注目を集めています。そこで必要となるのが、オフィスのネットワーク内に保存してあるファイルなどを自宅から安全に読み書きできる環境です。
インフラエンジニアが常駐する大企業なら、すでにそういった環境があるかもしれません。ところが小規模なオフィスなどは、なかなか実現できないでしょう。
企業だけでなくフリーランスで活動する人が打合せやシェアオフィスなどで作業する際に自宅のネットワークにアクセスできると便利です。
そういった要求に応えるのがVirtual Private Network(以下VPN)です。
ネットワークに強いLinuxをベースにするラズパイ(Raspberry Pi)を使えばVPNも簡単に構築できます。
そこで本記事では、ネットワーク内にあるラズパイを経由して外出先からアクセスするVPNの環境を構築します。また必要なネットワークの概要も合わせて解説します。
目次
- VPNとは
- VPNの構築に必要なネットワークの知識
- 2.1. 基本中の基本「ネットワーク」とは
- 2.2. ネットワーク上のパソコンにアクセスする
- ネットワーク間の関所「ルーター」の役割
- ルーターの外側から内側への通信
- 4.1. 自宅のルーターのIPアドレスが見つからない
- 4.2. 自宅のルーターのIPアドレスが変動する問題の対処
- 4.3. 自宅のルーターが通信をブロック
- ラズパイにインストールするVPNサーバ
- No-IPを使ったダイナミックDNSの設定
- 6.1. No-IPにアカウントを作成
- 6.2. Ddclientのインストール
- ラズパイのIPアドレスを固定する
- 外側からの通信を通すようにルーターを設定する
- PiVPNを使用してWireguardをインストール
- VPNサーバにクライアントを追加
- まとめ
1. VPNとは
VPNとは、仮想プライベートネットワークと呼ばれる技術です。
グローバルなインターネット通信上で仮想的な専用線接続を実現し、通信のセキュリティを保つために使われます。具体的には、自宅やオフィスのネットワークに外出先から安全に接続する用途などに使われます。
外部からネットワークにアクセスするためには、ネットワークの出入り口となるルーターに通信できる設定を追加する必要があります。当然、出入口の設定を作るということは、悪意を持ったユーザによる侵入を許す可能性もあります。
そこで「ネットワークは開放したいが攻撃はブロックする」という要求に応えるために登場した技術がVPNです。
VPNは、インターネット経由の通信や異なるネットワーク間の通信を仮想の回線(トンネル)によって直接接続しているかのように振舞う技術です。
入ってきた通信は必ずVPNサーバ通過し、許可した人からの通信以外はVPNサーバが遮断することでセキュリティを維持しながらネットワークに接続できるようになります。
イメージとしては、外出先のパソコンから特定のネットワーク内にあるVPNサーバまで直通のトンネルを通すような技術で、この概念を「トンネリング」と呼びます。
このトンネリングのおかげで、世界中どこのインターネットでも、まるで自宅のネットワーク内で作業しているような環境を作ることができます。
2. VPNの構築に必要なネットワークの知識
VPNを使用するにはVPNサーバを構築する必要がありますが、ラズパイを使えば手軽に構築できます。
とはいえ、設定を間違えるとセキュリティーホールになり、そこから悪意のあるユーザの侵入を許してしまいます。
そこで、まず初めにVPNの構築に必要となるネットワークの知識をおさらいします。
2.1. 基本中の基本「ネットワーク」とは
最初にインターネット(ネットワーク)について説明します。
インターネットは、例えば自宅やオフィスのようなパソコンが何台か接続された小さなネットワークの組み合わせと考えることができます。
小さなネットワークが隣のネットワーク、さらに隣というように連結していくことで世界中のパソコンが接続された状態がインターネットです。
本記事の解説例としているのは一般家庭や小規模なオフィスです。一般的なインターネット接続は、プロバイダのネットワークと接続することによってインターネットにアクセスできるようになっています。このプロバイダとの接続部分にはルーターが置かれているはずです。
ネットワーク同士を単純に接続しただけでは、ネットワーク外の見ず知らずのパソコンからも勝手にアクセスされてしまいます。そこでネットワークとネットワークのつなぎ目に「ルーター」と呼ばれる機器を関所のように設置して、インターネットとネットワークを分離します。
自宅や小規模なオフィスでは、Wi-Fiの機能を備えたWi-Fiルーターが身近な機器です。
2.2. ネットワーク上のパソコンにアクセスする
ネットワークに接続された特定のパソコンにアクセスするには、以下のような情報が必要です。
- ホスト名は?
- ホスト名に対応するIPアドレスは?
- 通信相手のパソコンの、どのアプリケーション(ポート)と通信するのか?
- 通信の方法は?
Device Plusの英語版のWebページにアクセスするケースを例に説明します。
Webページを管理しているパソコン(サーバー)の正式なホスト名(FQDN)は「www.deviceplus.com」です。そこで皆さんはブラウザのアドレスバーに「www.deviceplus.com」と打ち込みます。
するとブラウザはインターネット上に公開されているDNSサーバーに問い合わせて「www.deviceplus.com」に対応するIPアドレスが「13.52.144.235」であることを突き止めます。
これでブラウザは「13.52.144.235」に対してWebページを要求(リクエスト)することができます。
サーバ「13.52.144.235」上では複数のアプリケーションが起動しています。そこで、どのアプリケーションへのリクエストなのかを特定する必要があり、そこで使われるのが「ポート番号」です。
サーバ(パソコン)の中のネットワークと接続する部分には65536個の出入り口が用意され、これをポートと呼びます。
例えばWebページのリクエストに対応するアプリケーションは「80番のポート」で待機する慣例になっています。また、暗号化されたWebページのリクエストに対応するアプリケーションは「443番のポート」で待機します。
ちなみに、一つのポートを占有できるアプリケーションは一つです。
ブラウザは、IPアドレスとポート番号を指定することでサーバのWebページを処理するアプリケーションと接続できるようになります。最後に必要な条件は通信の方式です。当然ブラウザとサーバ上のアプリケーションは同じ通信の方式を使わなければデータを交換できません。
インターネット上で使用される通信の方式は通常「TCP」か「UDP」のどちらかです。
TCPは「通信が確実に行われたか?」を都度チェックする通信方式です。一方UDPはチェックを行わない方式でTCPより信頼性は低くなりますが、その分高速にデータを送ることができます。
ただし皆さんが「TCP/UDPのどちらを使用するか?」を考える必要はありません。アプリケーションや通信の内容でTCP/UDPのどちらを使用するかは、サーバやアプリによって決められています。
通信の内容とTCP/UDPの対応はTCPやUDPにおけるポート番号の一覧を参照してください。
これでブラウザはWebページのデータをリクエストできるようになります。
まとめると、皆さんの「www.deviceplus.com」に対するWebページのリクエストは
「IPアドレスが13.52.144.235のサーバー(パソコン)」の
「ポート番号が80番、もしくは443番」に
「TCPの通信」で
接続することになります。
また、通信には「どこから」という情報も必要なのでリクエストには
「IPアドレスが123.456.789.2のパソコン」の
「ポート番号が23456番」から
という情報も付加されます。(このIPアドレス、ポート番号は架空のものです)
3. ネットワーク間の関所「ルーター」の役割
VPNの構築に必要なネットワークの知識の中で、ネットワーク間に置かれる「ルーター」は「悪意のある通信をブロックするための関所」と説明しました。
重要な機器なので、この「ルーター」の機能を以下にまとめます。
3.1. 通信の監視
通信の監視はルーターの最も重要な役割です。
ネットワークとネットワークの間にはルーター(Wi-Fiルーターも含む)が設置され、常に通信を監視しています。
ここでの「ネットワークとネットワーク」が指すのは「皆さんのパソコンやスマートフォンが接続されている自宅のネットワーク」と「プロバイダのネットワーク」です。以降、自宅のネットワークを「内側」、プロバイダのネットワークを「外側」と呼びます。
ルーターは通信を常に監視しますが、通信の内容までは理解できません。ルーターが監視するのは通常、以下の4点です。
- IPアドレス: どこから来るのか?/どこに向かうのか?
- ポート番号: どこから来るのか?/どこに向かうのか?
- 通信の方式: TCP?/UDP?
- 新たに始まった通信か?/既存の通信の応答か?
通常、自宅や小規模オフィスのネットワークでは外側から内側に向かって通信をすることはあまりありません。
そこでルーターは「外側から内側に向かう通信」を完全にブロックする設定で出荷されています。
Webサイトの閲覧やメールなどの一般的な用途でインターネットを使用する場合は、ルーターを初期設定の状態で使用しても問題はありません。
3.2. ネットワークの分離
自宅のネットワーク(内側)とプロバイダのネットワーク(外側)はケーブル接続で繋がっていますが、ルーターの監視機能によって通信的には分断された状態と考えることができます。
ネットワークを分断することで悪意のある通信を遮断することができますが、もう一つ別のメリットもあります。
それはIPアドレスの管理を容易にすることです。
ネットワーク上でパソコン同士が通信するためには、ネットワーク上で重複しないIPアドレスを持たなければいけません。これは「どこに向かうのか?(相手)」だけでなく「どこからリクエストされたのか?(自分)」も同様です。
一般的にサーバは不特定多数からのリクエストを受け付けるため、そのIPアドレスには管理団体から割り当てられる固定IPアドレスがランダムに配布されます
一方、リクエストを送る側(自分)は通常、不特定多数からアクセスを受け付ける必要はありません。しかしインターネット上で通信するためには、リクエストを送る側も重複しないIPアドレスを割り当てる必要があります。
これはインターネットでWebサイトを閲覧するだけでも同様です。
特に意識したことはないかもしれませんが、プロバイダが自動的にインターネット上で重複しないIPアドレスを割り当ててくれるためインターネットに接続できるのです。
ところが、プロバイダが割り当てるIPアドレスは1つだけです。
自宅のネットワーク内にパソコンやスマートフォン、ラズパイなど複数のデバイスがつながっていても割り当てられるIPアドレスは1つです。
そこでインターネットの出入り口になるルーターが内側の通信を取りまとめて、代わりに外側と通信を行います。
外側から見れば、インターネット上で重複しないIPアドレスを持ったルーターと通信をしているイメージです。
そのため通信相手からの応答はルーターに返ります。
ルーターは受け取った応答を内側の「どのデバイスからのリクエストに対する応答か?」を判定して、そのデバイスに届けます。
ルーターが「どのデバイスからのリクエストか」を見分けるために使用するのが、内側のネットワークで重複しないIPアドレスです。この内側だけで使用されるIPアドレスは、プライベートIPと呼ばれ、192.168.1.2のようなものがよく使用されます。
このようにルーターで内側と外側を分離することで、インターネット上で重複しない一つのIPアドレスを自宅のネットワークに接続された複数のデバイスで共有できるようになります。
この機能をNAPT(Network Address Port Translation)と呼びます。(ほかにも「IPマスカレード」、「ENAT」(拡張NAT)、「PAT」と呼ぶ場合もあります。)
4. ルーターの外側から内側への通信
インターネットをWebサイトの閲覧やメールの送受信などの一般的な用途で使用する限り、外部から自宅のネットワーク内に向かって新たな通信が開始されることはありません。
しかし今回のVPNは外側から内側への通信が必要です。そこで前述のネットワークの仕組みに関する知識だけでは不十分です。
外側から内側への通信での問題点と対応を説明します。
4.1. 自宅のルーターのIPアドレスが見つからない
本記事の目的は、外出先から自宅のネットワーク内にあるラズパイ(VPNサーバー)に接続し、そのラズパイを経由することで、あたかも自宅のネットワークに接続しているような状態を作ることです。
外出先でインターネットに接続できることが前提です。これは外出先のネットワークで使用しているルーターによってインターネット上で重複しないIPアドレスが割り当てられている(もしくはIPマスカレードされている)ことを意味します。
この状態で自宅のネットワークの入り口となるルーターと通信を開始しようとすると問題に気付くはずです。
自宅のルーターのIPアドレスは契約しているプロバイダから自動的に割り当てられるため、このIPアドレスを外出先から知ることができません。
また、通常プロバイダから割り当てられるIPアドレスは変更される可能性があります。
通常インターネットで、例えば「www.deviceplus.com」というようなホスト名(FQDN)からIPアドレスを検索できるようにするには
(1) インターネット上で重複しないホスト名を取得する
(2) ホスト名とIPアドレスの対応を管理するDNSサーバを用意する
(3) IPアドレスを上記のDNSサーバに登録する
の作業が必要であり、(1)から(3)の作業は一度だけ行います。
ところが上記は管理団体から割り当てられた固定IPアドレスを持つ場合の手順であり、いつ変動するか分からないプロバイダから割り当てられたIPアドレスでは上手くいきません。
これは通常のDNSサーバでは、自宅のルーターに割り当てられたIPアドレスを検索できないことを意味します。
4.2. 自宅のルーターのIPアドレスが変動する問題の対処
前述のようにIPアドレスが変動する場合は、DNSサーバに登録できません。
そこで考え出されたのが「ダイナミックDNS(Dynamic DNS)」と呼ばれる技術です。
この技術を使えば、ホスト名と常に変化するIPアドレスを対応づけることができます。ダイナミックDNSは「DDNS」と略称で呼ぶ場合もあります。
前述の手順の(1)と(2)は、ダイナミックDNSを提供するNo-IPを利用することで解決します。
ダイナミックDNSのサービスはいくつかあり、No-IPもその中の一つです。無料で「インターネット上で重複しないホスト名」が割り当てられ、DNSサーバのように「ホスト名と変動するIPアドレスの対応を検索」することができます。
残る(3)はDdclientと呼ばれるアプリケーションで対応します。
DdclientはIPアドレスが変化するごとに自動的にダイナミックDNS(今回はNo-IPのサーバー)にIPアドレスを通知します。
DdclientはVPNサーバを構築するラズパイにインストールして、常時起動しておきます。
これで外出先から自宅のネットワークの入り口となるルーターまでアクセスできる環境が整いました。
4.3. 自宅のルーターが通信をブロック
ダイナミックDNSを利用することで外出先から自宅のルーターのIPアドレスを見つけ出し接続することができるようになります。
ところが、次に下記の問題が起こる可能性があります。
(1) ルーターが外側から内側への新規の通信を遮断する
(2) VPNサーバ(ラズパイ)がインターネット上で重複しないIPアドレスを持っていない
(1)・(2)のいずれも自宅のネットワークの入り口となるルーターの設定を変更することで対処します。使用しているルーター毎に設定方法が異なるので、ルーターのマニュアルを参考しながら変更します。
ルーターの設定を変更し、外側から接続してくる通信を内側へ通過するようにします。ただし許可するのは内側にあるVPNサーバに対しての通信のみです。
内側に入る通信をVPNサーバに経由させることで、セキュリティを確保します。これで安全に外側からの通信を受け入れられます。
また「どの通信がVPNサーバへのものか?」を見分けるためにポート番号を利用します。
あらかじめVPNサーバが使用するポート番号を決めておき(今回は51820番)、そのポート番号への通信のみラズパイに割り当てたIPアドレスに変換します。
インターネット上で重複しないIPアドレスを持たない自宅のネットワーク内のラズパイに外側から接続することができるようになります。
5. ラズパイにインストールするVPNサーバ
外出先から自宅のネットワーク内にあるラズパイに接続する仕組みが理解できたところで、ラズパイにインストールするVPNサーバのアプリケーションを決定します。
現在、人気の高いVPNサーバのアプリケーションはOpenVPNとWireguardです。
OpenVPNは最も普及しているVPNサーバです。VPNサーバを使用する状況に合わせて細かい調整ができますが初心者には難易度が高いと思います。
もう一つのWireguardはシンプルな構造にすることでパフォーマンスの向上を狙って開発された比較的新しいVPNサーバです。設定もOpenVPNに比べてシンプルです。
本記事ではWireguardを使用します。
VPNサーバの構築は悪意のあるユーザに攻撃される危険性もあるので、設定にはある程度のネットワークの知識が必要です。
そこでPiVPNというアプリケーションを使います。PiVPNはWireguardをインストールするだけでなくウィザード方式で設定ができるので初心者でも安全にVPNサーバを構築できます。
6. No-IPを使ったダイナミックDNSの設定
外出先から自宅のルーターにアクセスするにはIPアドレスを知る必要があります。しかしプロバイダからルーターに割り当てられるIPアドレスは変動する可能性があり通常のDNSサーバは利用できません。
この問題に対処するのがダイナミックDNSです。
本記事ではダイナミックDNSにNo-IPを利用します。
6.1. No-IPにアカウントを作成
本記事ではNo-IPのサービスを利用します。無料で使用できます。
IPアドレスと同様にインターネット上ではホスト名も重複できません。No-IPでは、この重複しないホスト名も割り当ててくれます。
ブラウザで「https://www.noip.com/」を開いてください。
「Hostname」のフィールドに希望するホスト名を入力して「Sign Up」を押します。
必要事項を入力し「Free Sign UP」を押すと、メールアドレスを確認するメールが送られます。受信したEメールにある「Confirm Account」ボタンを押せばユーザ登録の完了です。
No-IPにログインした状態で「My Account」を押すと正式なユーザ登録画面が現れます。
ここでは最低でも「Username」の設定が必要です。また、割り当てられたホスト名は「Dashboard」画面の「Hostname」部分に表示されています。
No-IPに登録したUsername・Password・Hostnameは後ほど使用します。
ホスト名は「deviceplus.hopto.org」のような表記です。(「Hostname」のフィールドに「deviceplus」を指定した例)
6.2. Ddclientのインストール
続いてルーターに割り当てられたIPアドレスを調査して自動的にNo-IPに送信するアプリケーションをインストールします。
ラズパイのOSを最新の状態にアップデートします。ターミナルを起動して次のコマンドを入力してください。
sudo apt update && sudo apt upgrade -y
アップデートが終了したらDdclientをインストールします。
sudo apt install ddclient -y
インストールが終了したらDdclientの設定を変更します。ターミナルから以下のコマンドを入力してください。
sudo nano /etc/ddclient.conf
変更点は次の通りです。
username・password・hostnameの3点を、先ほどNo-IPで指定したUsername・Password・Hostnameに変更します。
use=web ssl=yes protocol=noip login=<USERNAME> password=<PASSWORD> <YOUR_HOSTNAME>
設定ファイルの編集が終了したら、次のコマンドでDdclientを起動します。
sudo ddclient -daemon 10m
7. ラズパイのIPアドレスを固定する
ネットワーク間の関所「ルーター」の役割で説明したように、自宅のルーターは外側からの通信を内側のデバイスへ適切に振り分けます。
その際に役立つのが内側にあるデバイスのIPアドレスとポート番号です。
ポート番号はアプリケーションや通信の内容によってあらかじめ決まりますが、IPアドレスは内側のネットワークを管理する管理者が適切に割り当てる必要があります。
通常はルーターのDHCPという機能で自動的に重複しないIPアドレスを割り当てられるので意識する必要はありません。
しかし今回の用途であるVPSでは外側からの通信を内側にある適切なデバイスに転送しなければなりません。
そこで、IPを自動で割り当てるDHCPで配布されるIPアドレスではなく、自分で適切に割り当てたIPアドレスを固定割り当てする設定に変更します。
ラズパイに固定IPアドレスを割り当てる方法については公式ドキュメント、TCP/IP networking(英語)に従い、dhcpcd.confを編集してください。
今回のVPNに限らずラズパイをサーバとして使用する場合はIPアドレスを固定することをお勧めします。
8. 外側からの通信を通すようにルーターを設定する
ネットワーク間の関所「ルーター」の役割で説明したように、通常自宅のルーターは外側から内側へ向かう新規の通信をブロックするように設定されています。
VPNサーバ(ラズパイにインストールしたアプリケーション)が待機しているポート番号に対する通信のみ通過させるようにルーターの設定を変更します。
この際に必要な情報は次の3点です。
- VPNサーバ(ラズパイ)のIPアドレス
- VPNサーバが待機するポート番号
- 通信の方式
ラズパイのIPアドレスは前項で設定したものです。
VPNサーバが待機するポート番号には51820番ポートを使用します。これはWireguardに初期設定されている値です。
通信の方式はUDPを指定します。
手順は使用しているルーターによって異なります。ルーターのマニュアルを参考にしてください。
この設定は「ポートフォワーディング」と呼ばれる機能ですが、「ポート開放」のように別の呼び方で呼称される場合もあります。
ちなみにポートフォワーディングは、自動的にIPアドレスとポート番号を使って外側と内側を連携するIPマスカレードを手動で設定する機能です。
9. PiVPNを使用してWireguardをインストール
続いてラズパイにVPNサーバのアプリケーションをインストールします。
ラズパイにインストールするVPNサーバで前述したように、VPNの設定を間違えると重大なセキュリティーホールになる可能性があります。
初めての方でも安全にVPNサーバを構築できるようにPiVPNとよばれるWireguardのインストールを補助するアプリケーションを使用します。
ターミナル上で次のコマンドを入力してください。
curl -L https://install.pivpn.io | bash
しばらくすると次のようなインストール画面が起動します。
「Enter」を2回押します。
続いて次の画面のようにラズパイに固定IPアドレスが割り当てられているか聞いてきます。
先ほど決めたIPアドレスを設定できるように「Yes」を選択して「Enter」キーを押します。
VPNサーバを管理するユーザの選択画面が現れます。
今回はユーザ「pi」を選択します。
VPNサーバとしてWireguardとOpenVPNのどちらをインストールするか選択します。
Wireguard(初期値)を選択します。
インストールにはしばらく時間がかかります。
インストールが終わるとWireguardが待機するポート番号を入力する画面が現れます。
初期値は51820です。
ルーターのポートフォワーディング設定でほかの番号を指定している場合は、それを入力します。
設定の確認画面が出るので「Enter」キーを押します。
続いて「DNSサーバの選択」画面が表示されます。
以前の記事、ラズパイとDnsmasqで作るDNSサーバで独自のDNSサーバを構築している場合は「Custom」を選択します。
特別な理由がなければ「Google」を選択すれば問題ないでしょう。ほかのサーバを指定しても構いません。
続いて「管理団体から割り当てられた固定IPアドレス」を持っているか、「ダイナミックDNS」を使用するかを選択します。
固定IPアドレスの場合は、プロバイダから配布されたIPアドレスを指定します。
ダイナミックDNSを使用する場合(通常はこちら)は「下矢印」キーを押してカーソルを「DNS Entry」に移動し「スペース」キーを押して選択ください。
「Enter」キーを押すとホスト名を入力する画面となるので、No-IPで作成したホスト名(Hostname)を指定します。
サーバーキーを生成するかたずねられるので「Enter」キーを押します。
続いて、自動的にセキュリティーアップデート(Unattended Upgrades)を行うかを選択します。
必須ではありませんが、「Yes」を選択することをお勧めします。
PiVPNによるインストールと設定が完了すると再起動を促されます。「Yes」を選択して再起動してください。
10. VPNサーバにクライアントを追加
ここまでで外出先から自宅のネットワークにログインする準備は整いました。
最後の設定は外出先からログインするデバイスの登録です。デバイスはVPNサーバに登録されていないと接続できません。
「クライアント用プロファイルの作成」と呼ばれます。VPNサーバにログインするための合鍵(confファイル)を作成しクライアントに渡すイメージです。
次のコマンドを入力してください。
pivpn add
接続する端末の名前を聞かれたら適当な名前を入力してください。管理しやすい名前を指定します。
終了すると「/home/pi/configs/」にクライアントのOSごとにconfファイルが作られます。
以上でVPNサーバ(ラズパイ)での作業は終了です。
以降はクライアントでの作業です。VPNサーバから先ほど作成したconfファイルをコピーするのを忘れないでください。
VPNサーバー(Wireguard)のクライアントの設定は、お使いのOSによって異なります。以下を参照してください。
confファイルの取り扱いには十分注意してください。このファイルの中には、外部から自宅のネットワークに接続するために必要な全ての情報が含まれています。
11. まとめ
いかがでしょうか。VPNサーバの構築は難しいと感じましたか?
これは外側から内側へ向かう通信を許可するためには、ネットワークの仕組みについての知識が必要となるからです。特にルーターの働きを確実に理解していないとセキュリティーホールの原因にもなってしまいます。
本記事は、インフラエンジニアの分野に近い内容です。
Linuxベースの小型コンピュータであるラズパイを使えば、いつものLチカのような電子工作ばかりではなく、ネットワーク構築の学習機器や実用的なサーバとしても使用できます。
最近ではIoTの動きもあり、さまざまな電子機器をネットワークに接続するようになりました。ぜひ、VPNサーバの構築を通してネットワークの知識も身につけましょう。