ラズパイでVPNを構築

お盆の長期連休時間があったので,何度も挫折したVPNを構築してみた.

自宅にはWindows10proのデスクトップ,ラズパイ.それとiPadを持っているので,外出先からiPadで自宅のデスクトップをリモートで入れたらいいなと思っていた.構想はこう↓

ラズパイをVPNサーバーにしてそれ経由でデスクトップにリモートで入ろうという計画.

これを構築するのに3つ設定が必要

  • 自宅のルータでIPフォワーディング設定
  • DDNSサービスを使用して自宅のグローバルIPを特定
  • ラズパイでVPN構築

以下でその設定を詳しく説明していきます.

自宅のルータでIPフォワーディング設定

下の図のように一般家庭で使用されているルーターに関して,外部からのアクセスは基本全ポート遮断されている.普段我々のインターネットの使用用途は自宅からどこかのサーバーにアクセスするのみだからだ(Youtubeをみる,LINEをする).我々から外部サーバーにリクエストするだけで,外部から我々にリクエストされることはない.

しかし今回は外部から自宅にあるラズパイ(VPNサーバー)にアクセスしに行くわけで,ポートを解放しないといけない,しかもラズパイにそのアクセスを通さないといけない.IPフォワーディング設定をすることで,外部からのVPNアクセスをラズパイに通すことができるようになる.

1,IPフォワーディング設定

自宅のルーターはNTTのOCN兼ルータの端末である.そこでIPフォワーディング設定をしていく,この端末では”静的NAPT設定”とよばれている.しかも使用可能なポートにVPNがよく使用されている1194番がないので,今回は使用可能な他のポートにする

下の図のように設定しました.”公開対象ポート”と”宛先ポート”に今回使用するVPNのポートを入力. ”宛先アドレス”にラズパイが割り当てられるIPアドレスを設定.こうすることで指定したポートで外部からアクセスすると宛先アドレスである192.168.1.110のプライベートアドレスの端末に届くというわけです.なのでラズパイのIPアドレスは固定IPアドレスでないといけません.

DDNSサービスを使用して自宅のグローバルIPを 特定

一般的にグローバルIPは日によって変わってしまう.そうなると外部から自宅にVPNアクセスをする場合,日が経つとグローバルIPが変更されて自宅のIPアドレスが分からなくなってしまう.

DNSを使用して定期的に自分のIPアドレスを更新することで,外部からドメイン名でアクセスすれば,IPが変更されても自宅にアクセスすることができる.

1,DNSの設定

今回は無料でDDNSが利用できるMyDNSを使用させてもらった.

会員登録をしたら,ドメイン名を設定をする.設定は”DOMAIN INFO”を選択して,Domainの欄にOOOO.mydns.jpを入力する.OOOOは希望のドメイン名を入力他の人と重複している場合はエラーになる.Hostnameの欄は*を入力する.これで完了.

2,IPアドレスの更新設定

自宅のグローバルIPをMyDNSのサーバーに更新させるシェルを作成する.これをラズパイのcronに登録させることで定期的に更新させる.

シェルの作成

シェルの作成コマンド:nano (シェル名).sh /(保存したいディレクトリ)

開いたシェルに以下を記述する

curl https://ipv4.mydns.jp/login.html -k -u (マスターID):(パスワード)

マスターID,パスワードはMyDNSに登録した際のID,パスを入力

これをchmodコマンドで実行可能なファイルにして実行してみる

成功すると,mydnsのIP Address Directページに自宅のグローバルIPアドレスが記載される

cronの設定

以下のコマンドを実行してcronの設定画面を表示させる

コマンド:crontab -e

開いたウィンドに以下を記述する

0 6 * * * (シェルの絶対パスを入力)

”0 6 * * *”とは毎日6時にこのシェルを実行させるという意味.詳しくは調べてください.

ラズパイでVPN構築

PiVPNというものを使用してVPNを構築した.以前はほかのサービスでVPNを構築しようとしていたが,このPiVPNは設定がものすごく簡単.まずはIPアドレスの設定からしていく.

1,IPアドレスの固定

ラズパイのIPアドレスを固定する.これは後述する”自宅のルータでIPフォワーディング設定”をする際,IPアドレスは固定でないといけない.

・現在のIPアドレスを確認する

コマンド:ifconfig

**@**-RasPi:~ $ ifconfig

eth0   Link encap:イーサネット  ハードウェアアドレス**

          inetアドレス:192.168.1.3 ブロードキャスト:192.168.1.255  マスク:255.255.255.0

          inet6アドレス: **/64 範囲:グローバル

          inet6アドレス: fe80::15a1:bfb9:b474:fe57/64 範囲:リンク

          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1

          RXパケット:499903 エラー:0 損失:0 オーバラン:0 フレーム:0

          TXパケット:196153 エラー:0 損失:0 オーバラン:0 キャリア:0

      衝突(Collisions):0 TXキュー長:0

          RXバイト:464082305 (442.5 MiB)  TXバイト:17714788 (16.8 MiB)

使用しているインターフェイス名は"eh0"

・IPアドレスの固定

コマンド:sudo nano /etc/dhcpcd.conf

このファイルに以下の記述を追加.

interface eth0

        static ip_address=192.168.1.110/24

        static routers=192.168.1.1

        static domain_name_servers=192.168.1.1

IPアドレスは192.168.1.110で固定する.このときにルータのDHCPサーバーで割り当てられるIPアドレスで”192.168.1.110”を除外しておくとIPアドレスの重複を防げる.自宅で110台の端末をネットにつなげることは絶対にないので重複はまずしないと思うが.

・IPアドレスの確認

コマンド:ifconfig

eth0      Link encap:イーサネット  ハードウェアアドレス**

          inetアドレス:192.168.1.110 ブロードキャスト:192.168.1.255  マスク:255.255.255.0

          inet6アドレス:***

          inet6アドレス: fe80::15a1:bfb9:b474:fe57/64 範囲:リンク

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  メトリック:1

          RXパケット:369 エラー:0 損失:0 オーバラン:0 フレーム:0

          TXパケット:451 エラー:0 損失:0 オーバラン:0 キャリア:0

ちゃんと変更されている

2,PiVPNでVPN設定

ラズパイ上でPiVPNを使用してVPNの設定をしていく.これがとても簡単で質問に答えていけば簡単に構築ができてしまう.

コマンド:curl -L https://install.pivpn.io | bash

このコマンドを実行すると以下のようなウインドが出てきて質問に答えていく

”このOSは動作確認していないがたぶん動くから続けていいですか”と聞かれているのでYESで次にいく

サービスのインストールの際にサービスリスタートするときあなたに聞かずにリスタートしてもいい?と聞いているのでYES
ルータのDHCPが割り当てるIPアドレスにしないようにしてくださいと警告してるのでOKを押す
ラズパイのユーザーを選択してと書いてあるので次の画面でユーザーを選択する.
VPNを2種類から選べる今回はOpenVPNにした.スマホでVPNを使用する場合はWIreGuardを薦めているらし,今回は前から知っているOpenVPNにしました.(選択方法は赤い■印を方向キーでOpenVPNに持っていきスペースキーを押してエンター)
VPNに関して細かな設定をする場合はYESにする.TCPにしたりだとか,暗号化をより強固にしたりだとか.今回はデフォルト設定にするのでNOを選択
UDPのポートをここで選択できる.デフォルトは1194番だがルーターのIPフォワーディングでその番号ができないで他の番号を選択.
クライアント側(今回でいうiPad側)のDNSサーバーをどこにするか聞かれている.Googleにしておけば問題ないだろう.

ここではクライアント側(IPad)からサーバー(ラズパイ)にアクセスする際,IPアドレスでアクセスするか,ドメイン名でアクセスするか聞かれている.IPアドレスは変わってしまうため,ドメイン名でアクセスをする.(先ほど設定したドメイン名を入力)

これで設定は終わり.いくつかキャプチャをし忘れてしまったので飛ばしてしまっている箇所がある.この後”pivpn add”コマンドでクライアント側のプロファイルを作ってくれと書いてある.サーバー側(ラズパイ)でクライアントの設定をしたのもこのためである.なのでクライアント側(IPad)で設定することは特にない.このプロファイルをインポートしてあげればよい.
再起動を強く勧められているのでYESにして再起動をさせる.

再起動が完了したら,pivpn addコマンドでクライアントのプロファイルを作成する.

コマンド:pivon add

最初にクライアントの名前を聞かれる.とりあえず自分の名前にしておいた.

次に証明書の期限を聞かれる.デフォルトの1080日にした.

次にパスワードを聞かれるので登録する.

pivpn add

::: Create a client ovpn profile, optional nopass

:::

::: Usage: pivpn <-a|add> [-n|--name ] [-p|--password ]|[nopass] [-d|--days ] [-b|--bitwarden] [-i|--iOS] [-o|--ovpn] [-h|--help]

:::

::: Commands:

:::  [none]               Interactive mode

:::  nopass               Create a client without a password

:::  -n,--name            Name for the Client (default: "raspberrypi")

:::  -p,--password        Password for the Client (no default)

:::  -d,--days            Expire the certificate after specified number of days (default: 1080)

:::  -b,--bitwarden       Create and save a client through Bitwarden

:::  -i,--iOS             Generate a certificate that leverages iOS keychain

:::  -o,--ovpn            Regenerate a .ovpn config file for an existing client

:::  -h,--help            Show this help dialog

Enter a Name for the Client:  [ユーザー名]             ユーザー名を入力

How many days should the certificate last?  1080          証明書の有効期限を入力

Enter the password for the client:                  パスワード入力

Enter the password again to verify:                 パスワード再入力  

spawn ./easyrsa build-client-full [ユーザー名]

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021

Generating an EC private key

writing new

Verifying - Enter PEM pass phrase:

-----

Check that the request matches the signature

Signature ok

The Subject's Distinguished Name is as follows

commonName                                     

Certificate is to be certified

Write out database with 1 new entries

Data Base Updated

Client's cert found: [ユーザー名].crt

Client's Private Key found: [ユーザー名].key

CA public Key found: ca.crt

tls Private Key found: ta.key

========================================================

Done! [ユーザー名].ovpn successfully created!

[ユーザー名].ovpn was copied to:

  /home/[ラズパイユーザー名]/ovpns                            この場所にプロファイルが保存される

for easy transfer. Please use this profile only on one

device and create additional profiles for other devices.

========================================================

 プロファイルを(/home/[ラズパイユーザー名]/ovpns/に保存されている)IPadのOpenVPNアプリにインポートさせる.IPadのファイルアプリを使用して,ラズパイをsambaサーバーにさせ転送した.

結果

なんと1発でVPNの接続ができてしまった.すごい!!だけどインターネットアクセスができない.       なんでだろう...

調べていくと”pivpn”のコマンドにデバック機能がありました.以下のコマンドを実行.

コマンド:pivpn -d

すると ”Iptables MASQUERADE rule set”というのがNGになっていました.このコマンドがおかしい所を指摘してくれるだけではなく,自動で直してもくれる優秀なデバック機能でなんとこのコマンドを実行するだけでなおってしまいました.非常にうれしい!!”Iptables MASQUERADE rule”がセットされていないというのは以下の図ということでした.

VPNで構築されたネットワークがeth0のネットワークと繋がっていなかった.

終わりに

これで晴れて外出先からiPadで自宅のデスクトップにアクセスができる.しかもWOL設定をしたので,デスクトップ電源ONもできちゃう!.iPad画面ちっちゃいから見づらいかもと思ってたら,iPadOS16で画面拡張が追加されているじゃないですか!!すごい!!(M1チップのiPadに限るが)

とリモートデスクトップできて感動していたのですが,今はクラウド時代自宅につなげる意味がないのかもと思っていしまった...

でもフリーWIFIにつなげたときにVPNすればセキュリティーは高くなるか!!おわり

Follow me!

ラズパイでVPNを構築” に対して2件のコメントがあります。

  1. 名無しさん より:

    ラズパイ はPI4ですか?

    1. Takashi より:

      僕のは結構前のpi2Bだったと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA