ラズパイで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で次にいく
ここではクライアント側(IPad)からサーバー(ラズパイ)にアクセスする際,IPアドレスでアクセスするか,ドメイン名でアクセスするか聞かれている.IPアドレスは変わってしまうため,ドメイン名でアクセスをする.(先ほど設定したドメイン名を入力)
再起動が完了したら,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”がセットされていないというのは以下の図ということでした.
終わりに
これで晴れて外出先からiPadで自宅のデスクトップにアクセスができる.しかもWOL設定をしたので,デスクトップ電源ONもできちゃう!.iPad画面ちっちゃいから見づらいかもと思ってたら,iPadOS16で画面拡張が追加されているじゃないですか!!すごい!!(M1チップのiPadに限るが)
とリモートデスクトップできて感動していたのですが,今はクラウド時代自宅につなげる意味がないのかもと思っていしまった...
でもフリーWIFIにつなげたときにVPNすればセキュリティーは高くなるか!!おわり
ラズパイ はPI4ですか?
僕のは結構前のpi2Bだったと思います。