Raspberry Pi 4 Model B 8GB(Revision:d03114)にVPNサーバーを構築した。

 IPv4 PPPoEのルーターにRaspberry Piを接続したので、IPv4 over IPv6のルーターで接続しているデバイスからはアクセスができません。繋ぎ変えれば良いことですが、スマートではないと言う名の楽がしたいものです。

 今回はグローバルIPアドレスの環境下で、Raspberry PiにVPNサーバーを構築、IPv4 over IPv6のルーターで接続しているデバイスや外出先でもアクセスができるようにします。

 VPNサーバーはルーター内で立てられるモデルもあります。処理能力や規格の兼ね合いもあり、Raspberry Piに構築します。安物ルーターのVPNは懲りた経験があるからです。

 VPNとしてはSoftEther VPNやOpenVPNがポピュラーだと考えています。Shadowsocksは異なるものなので行いません。

 PiVPNと言うものを見つけました。それでWireGuardと言うものを知りました。3通りのインストール方法から1つを選択して、2つのVPNから1つを選択して構築できるのは素敵です。

 決めました!PiVPNで1番目の方法でOpenVPNを構築して楽をしてしまいましょう。

 OpenVPN用にポート開放を行う必要があります。そう書いてあります。デフォルトのポートでも構いません。また、IPアドレスにドメインを当てて名前解決を図りたいです。それが完了してからPiVPNに移ります。

 ルーターでUDP1194ポートを開けました。名前解決に関してはドメインを取得するか、ダイナミックドメインネームシステム(DDNS)を用います。グローバルIPアドレスが変更になっても、名前解決が安易なのはDDNSです。
 ルーターのメーカーやモデルによってはDDNSが標準装備されています。おさしみくんは残念ながらいずれにも該当しないので、外部のDDNSサービスを頼ることにします。

 他にもありそうです。おさしみくんはDDNS Nowにします。ネーミングセンスがお気に入りで、直感でロマンを感じた為です。その後にウェブサイトを読んで楽園だと感じたのは否定しません。

ぐうかわくくさま様!

[Linux] crondでIPアドレスを自動更新する方法
1. wgetがインストールされているか確認します。
wget https://ddns.kuku.lu/
インストールされていなければ、「sudo yum install wget」(CentOSなど)、「sudo apt-get install wget」(Ubuntuなど)でインストールしてください。

2. cronに登録して定期的(1分ごと)に実行させるには、下記のようにします。
crontab -e
下記を行末に追記
0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=ユーザ名&password=パスワード"
ユーザ名: DDNSNowに登録したユーザ名 (f5.siなどドメイン部分は除く)
パスワード: DDNSNowに登録したパスワード (もしくはパスワードのかわりにAPIトークンを指定してもOK)
IPv6接続もある環境でAAAAレコードも更新したい場合は、下記も追加します。
0-59 * * * * wget -O DDNSNow_update.log "https://v6.f5.si/update.php?domain=ユーザ名&password=パスワード"
レスポンスは下記の通りです。末尾に追加メッセージが含まれることがあるため、完全一致ではなく部分一致または前方一致で判定してください。
ERROR:100 (※パスワードまたはトークンが間違っている)
ERROR:110 (※ユーザ名が間違っている)
ERROR:120 (※IPアドレスの形式が不正)
ERROR:200 (※DDNS Now側システムエラー、DBサーバに接続不能)
ERROR:210 (※DDNS Now側システムエラー、DNSサーバに接続不能)
ERROR:300 (※DDNS Now側システムエラー、更新確認不能)
ERROR:400 (※詳細設定でCNAMEが設定中のためAレコードが利用不可)
OK:SUCCESS (※正常に処理完了)

 プロバイダー側のメンテナンスでルーターのPPPoE接続が切断され、再接続したり。停電でルーターの電源が切れ、再起動した時にうれしいサービスです。理由は変更されたグローバルIPアドレスを自動更新できるからです。

 早速登録しちゃうことにします!可愛く自動更新♪今すぐナウ!!

画像1

画像2

pi@raspberrypi4mb8gb:~ $ dpkg -l | grep -e wget -e cron 
ii  cron                                    3.0pl1-134+deb10u1                  armhf        process scheduling daemon
ii  wget                                    1.20.1-1.1                          armhf        retrieves files from the web                         armhf        retrieves files from the web
pi@raspberrypi4mb8gb:~ $ wget https://ddns.kuku.lu/
--2020-11-01 19:10:34--  https://ddns.kuku.lu/
ddns.kuku.lu (ddns.kuku.lu) をDNSに問いあわせています... 172.67.71.160, 104.26.2.85, 104.26.3.85
ddns.kuku.lu (ddns.kuku.lu)|172.67.71.160|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`index.html' に保存中

index.html         [ <=>    ]  21.10K  --.-KB/s 時間 0.003s   

2020-11-01 19:10:35 (7.07 MB/s) - `index.html' へ保存終了 [21606]

pi@raspberrypi4mb8gb:~ $ ls
Bookshelf  Documents  Music     Public     Videos
Desktop    Downloads  Pictures  Templates  index.html
pi@raspberrypi4mb8gb:~ $ sudo crontab -l
no crontab for root

pi@raspberrypi4mb8gb:~ $ crontab -l
no crontab for pi

 入っています。グローバルIPアドレスの自動更新はRoot権限が不要な為、一般ユーザでcronに登録します。

pi@raspberrypi4mb8gb:~ $ crontab -e
no crontab for pi - using an empty one

Select an editor.  To change later, run 'select-editor'.
 1. /bin/nano        <---- easiest
 2. /usr/bin/vim.tiny
 3. /bin/ed

Choose 1-3 [1]: 1

 おさしみくんはnanoを選択しました。

0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=hogepiyo&password=xxxxxxxxxxxx"
pi@raspberrypi4mb8gb:~ $ crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=hogepiyo&password=xxxxxxxxxxxx"
pi@raspberrypi4mb8gb:~ $ ls
Bookshelf  DDNSNow_update.log  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  index.html
pi@raspberrypi4mb8gb:~ $ cat DDNSNow_update.log
OK:SUCCESS (good)

 正常に処理完了できました。これでポート開放と名前解決が済んだのでPiVPNに移れます。
 ポートはUDP1194。DNSプロバイダーはローカルではなくGoogle。カスタムサーチドメインは有効にしない。IPではなくDNSネームで登録。互換性は考慮しない。暗号鍵の長さは256Bit。unattended-upgradesは有効にする。OpenVPNプロファイル名はhogepiyo。有効期限は3,650日。ファイルのみで接続とします。1番目の方法でそれなりに楽をします。
 OpenVPNプロファイルはターミナルソフトのRLoginでSFTPファイルの転送で引っ張り出します。

pi@raspberrypi4mb8gb:~ $ curl -L https://install.pivpn.io | bash

画像3

画像4

画像5

画像6

画像7

画像8

画像9

画像10

画像11

画像12

画像13

画像14

画像15

画像16

画像17

画像18

画像19

画像20

画像21

画像22

画像23

画像24

画像25

画像26

pi@raspberrypi4mb8gb:~ $ pivpn help
::: Control all PiVPN specific functions!
:::
::: Usage: pivpn <command> [option]
:::
::: Commands:
:::  -a, add [nopass]     Create a client ovpn profile, optional nopass
:::  -c, clients          List any connected clients to the server
:::  -d, debug            Start a debugging session if having trouble
:::  -l, list             List all valid and revoked certificates
:::  -r, revoke           Revoke a client ovpn profile
:::  -h, help             Show this help dialog
:::  -u, uninstall        Uninstall PiVPN from your system!
:::  -up, update          Updates PiVPN Scripts
:::  -bk, backup          Backup Openvpn and ovpns dir

pi@raspberrypi4mb8gb:~ $ pivpn -a nopass
::: Create a client ovpn profile, optional nopass
:::
::: Usage: pivpn <-a|add> [-n|--name <arg>] [-p|--password <arg>]|[nopass] [-d|--days <number>] [-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: 'raspberrypi4mb8gb')
:::  -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:  hogepiyo
How many days should the certificate last?  3650
spawn ./easyrsa build-client-full hogepiyo nopass

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019
Generating an EC private key
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-1235.TGTs3W/tmp.jYwV2F'
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-1235.TGTs3W/tmp.E7yiC8
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'hogepiyo'
Certificate is to be certified until Oct 30 11:33:45 2030 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Client's cert found: hogepiyo.crt
Client's Private Key found: hogepiyo.key
CA public Key found: ca.crt
tls Private Key found: ta.key


========================================================
Done! hogepiyo.ovpn successfully created! 
hogepiyo.ovpn was copied to:
 /home/pi/ovpns
for easy transfer. Please use this profile only on one
device and create additional profiles for other devices.
========================================================
pi@raspberrypi4mb8gb:~ $ cd /home/pi/ovpns
pi@raspberrypi4mb8gb:~/ovpns $ ls
hogepiyo.ovpn

画像28

画像29

画像30

 後はクライアントソフトをインストールしてプロファイルを読み込ませれば完了です。

画像31

 OpenVPNを経由してSSHに接続できました。ぐうかわでグローバルIPアドレスを自動更新できる。ルーターに線を繋ぎ変える必要が消えました。

 それなりに楽をしたので満足です。人によってはもっと楽ができるのだと考えます。お好みでどうぞ。

この記事が気に入ったらサポートをしてみませんか?