Pandora Pocket

IT系と日常系の備忘録。三日坊主。

RaspberryPi 3 B+にRaspbianをインストールしてVPN(SoftEther)サーバー構築した時の覚書

SDカードがお釈迦になって環境を作りなおしたので覚書。

Raspbianのインストール

Raspbianのダウンロード

ここからイメージをダウンロード。
https://www.raspberrypi.org/downloads/raspbian/

複数のイメージがあり、

  • Raspbian Buster with desktop and recommended software(GUIかつ推奨されるアプリケーションがすでにインストール済)
  • Raspbian Buster with desktop(GUI版)
  • Raspbian Buster Lite(コンソールのみ)

となっている。今回はLiteを用いた。

ストレージのフォーマットと書き込み

今回はお釈迦になったSDカードの代わりとして、ESXiを構築していた時に使っていたUSBメモリーを利用。
RaspberryPi3 B+から標準でUSBブートできるようになったらしい。

SD Card Formatterで初期化後、Etcherを使ってさくっと焼いた。

SSHで接続するので、エクスプローラでbootのドライブを開き、直下に ssh という名前の空ファイルを作成。

これでOK。

SSH接続

Windows 10から(どのバージョンからだったかは忘れた・・・)mDNSに対応したので、RaspberryPiのIPアドレスがわからなくても ‘raspberrypi.local‘ で接続可能。便利。

mDNSが利用できない環境の場合。
MACアドレスがB8:27から始まるものがRaspberryPiなので、arpコマンドやLAN内探査ソフトでも使えばディスプレイにつながなくてもわかる。

for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.0.%i
arp -a

参考:

デフォルトのユーザ名は"pi"、パスワードは"raspberry"となっている。

f:id:Ovis:20190831230329p:plain

初期設定

apt upgrade をするとインターフェイス名がeth0からenx+MACアドレスの形になるらしいので、インターフェイス名が変わらないように設定する。
コマンド: sudo -e /etc/udev/rules.d/70-persistent-net.rules

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:5e:3b:00", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="eth0"

RaspberryPiのMACアドレスは下記コマンドで確認可能。
コマンド:ifconfig | grep 'ether'

本来リブートが必要だけど、この後の処理でリブートするので後回し。

終わったらRaspbianのコンフィグツールを使って初期設定。

コマンド: sudo raspi-config
f:id:Ovis:20190831232228p:plain

コマンドを入力するとブルーバックのこんな画面になるので、下記の設定を実施。

ホスト名変更

2.Network options→ N1 Hostname で変更。複数のRaspberryPiがある場合、変更しておいたほうが競合しなくて済む。

自動ログイン解除

3 Boot Options → B1 Desktop/CLI より。B1 Consoleに変更。

ロケール変更

4 Localisation Options → I1 Change Localeより。 Asia→Tokyo。

タイムゾーン変更

4 Localisation Options → I2 Change Timezone より。Asia→Tokyo。

領域拡張

7 Advanced Options → A1 Expand Filesystem より。これをやらないとストレージを丸ごと利用してくれないらしい。が、SDカードのみでUSBメモリーの場合は不要らしい。

設定が終わったらFinishを選択して終了。リブートが必要なので言われるがままリブートを実施。

リポジトリ更新、自動更新設定

リブートが終わったらaptやファームウェアの更新をしておく。

sudo rpi-update
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y

基本的に普段はいちいちログインしないので、自動的に更新するようにしておきたい。
unattended-upgrades パッケージを導入することで解決できる。
コマンド: sudo apt install unattended-upgrades インストール後下記のコマンドを実行すると、自動更新が行われるようになる。
コマンド: sudo dpkg-reconfigure -plow unattended-upgrades

自動的に更新が続くといつかはストレージがゴミで埋まるので、不要パッケージは削除する。
コマンド: sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Remove-Unused-Dependencies "true"; に変更。(デフォルトはfalseかつコメントアウトされている) 今回基本的に全部自動的に更新してもらいたいので設定していないものの、更新してほしくないパッケージがある場合はそれぞれ設定が必要。

リブートが必要な更新もあるので、自動リブート設定も仕込む。
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";Unattended-Upgrade::Automatic-Reboot-Time "02:00"; の設定のコメントアウトを外して、再起動したい時間に変更。

ウォッチドッグの追加

何かの拍子にシステムが正常に動作しなくなった場合、自動的にハードウェア側で再起動を行うことができる。
コマンド: sudo nano /boot/config.txt
dtparam=watchdog=on を追加。

カーネルモジュール側の設定。
下記コマンドでファイル作成。 コマンド: sudo nano /etc/modprobe.d/bcm2835-wdt.conf
options bcm2835_wdt heartbeat=14 nowayout=0 を追加。14秒に一回のハートビートを行うことを期待する。

systemdの設定変更。
コマンド: sudo nano /etc/systemd/system.conf
#RuntimeWatchdogSec=0 となっている箇所があるので、新規に作るかコメントを外すかして RuntimeWatchdogSec=14 に変更。

再起動後下記コマンドを実行。
コマンド: dmesg | grep bcm2835-wdt

[ 0.586795] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer こんな感じで表示されていればウォッチドッグは正常稼働しているはず。

フォーク爆弾として有名な下記のコマンドを実行し、数分後再起動されることも確認。

コマンド: :(){ :|:& };:

ユーザー作成

デフォルトのpiユーザー以外のものを作って、そちらに移行したほうがセキュリティ上いくらかは安全(鍵認証するなら問題ない気もするけど)なので、先達の意見に従い別のユーザーを作成する。

まずはユーザーを作成。(hogeユーザーを作成する)
コマンド: sudo useradd -m hoge -s /bin/bash

パスワード設定。
コマンド: sudo passwd hoge

piユーザーと同じグループに所属させておきたいので、
コマンド: groups pi を実行し、取得されたグループを今回作ったユーザーに指定する。
コマンド: sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio hoge

パスワード入力なしでsudoを実行できるように変更する。

コマンド: root # nano /etc/sudoers.d/010_pi-nopasswd 初期設定だと pi ALL=(ALL) NOPASSWD: ALL となっているので、piの部分を今回作ったユーザーに差し替える。

ほかのサイトを見るとpiユーザーのホームディレクトリ内のファイルを作成したユーザーのホームディレクトリにコピーする手順がありますが、今回はまだ作ったばかりでホームディレクトリに移動する必要のあるファイルはないので行わない。(.bashrcとかいじってるならそれは移動させる)

作ったユーザーでSSHログインできるかを確認。
sudoが実行でき、かつパスワードを聞かれなければOK。

piユーザー削除

先ほどまで作業に資料していたpiユーザーはこれにてお役御免。
コマンド: sudo userdel -r pi
グループpiはさっき追加したユーザーが追加されているので削除されず。まぁグループは残しておいても良いかな、と。

SSH設定

ポートマッピングしてない限り外部から侵入されることはまずないと思われるものの、やっておくに越したことはない。
ポート22は有名すぎてアタックされるので、別の番号に変更する。(ポートスキャンすればバレるので気休めではある)

コマンド: sudo nano /etc/ssh/sshd_config

#Port 22 となっている行の下あたりに Port 変更後の値 を入力。 PermitRootLogin no も追加。これでrootユーザーの直接ログインを禁止。
PermitEmptyPasswords no も追加しておくと、パスワードが空でのログインを禁止できる。

ここまで変更したら保存し、SSHを再起動。
コマンド: sudo service ssh restart

現時点で利用している接続を切断せず、別途今変更した値でログインできるかどうか確認。
できたなら前の接続は切断してOK。

SSH鍵認証

パスワード認証はセキュリティ上決して頑丈ではない(長く複雑であればよっぽど問題ないとは思うものの)ので、鍵認証を行う。
ローカルで公開鍵を作成し、ホームディレクトリに .ssh ディレクトリを作成しパーミッションを変更。
コマンド: mkdir /home/hoge/.ssh
コマンド: chmod 0700 /home/hoge/.ssh

SCPなりSFTPなりで.sshフォルダに公開鍵を保存し、名前を authorized_keys に変更、パーミッションを600にする。
コマンド: chmod 0600 /home/hoge/.ssh/authorized_keys

鍵認証でSSH接続できることを確認。
できたなら、より一層のセキュリティ強化のため、パスワードログインを無効化する。
コマンド: sudo nano /etc/ssh/sshd_config
PasswordAuthentication noを追加。 ChallengeResponseAuthentication no はデフォルトで指定されているはずではあるものの、もし指定されていなければ記入しておくこと。

NTP設定

時間同期を行っておかないとどんどん時間が狂ってしまうので、できるだけ近い場所にあるNTPサーバーを指定。

コマンド: sudo nano /etc/systemd/timesyncd.conf

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
NTP=ntp.nict.jp
FallbackNTP=ntp.jst.mfeed.ad.jp

NICTのNTPサーバーをプライマリとして、万が一接続できなかった時用にインターネットマルチフィードのNTPサーバーを指定。

ここまでやっておいたらWin32DiskImagerやDDforWindows(SDカードの場合)、USB Image Toolあたりでイメージを取得しておくと、この後失敗した時にすぐ復活させやすい。
なお、Win32DiskImagerもUSB Image Toolも、領域丸ごと取得してくれる模様。Bootパーティションしか表示されてなくてもそれを取得すればOKみたい。

ブリッジ系の設定

SoftEtherの都合、ブリッジが必要なので、下記の通り設定を行う。

まず bridge-utils をインストール。
コマンド: sudo apt install -y bridge-utils

IPアドレス等の設定は /etc/network/interfaces.d 配下にファイルを作成し、リスタートすることで反映される。
設定内容は下記のサイトを参考にした。

コマンド: sudo nano /etc/network/interfaces.d/NetworkConfig

SoftEtherのインストール

公式サイトからファイルのURLを取得。
f:id:Ovis:20190901123806p:plain

RaspberryPiでwget(今回は /home/pi にDLした)
コマンド: wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.32-9731-beta/softether-vpnserver-v4.32-9731-beta-2020.01.01-linux-arm_eabi-32bit.tar.gz

圧縮ファイルを展開。
コマンド: tar zxf softether-vpnserver-v4.32-9731-beta-2020.01.01-linux-arm_eabi-32bit.tar.gz

展開したら作成されたディレクトリに移動してmakeする。

コマンド: cd vpnserver; make

f:id:Ovis:20190901125301p:plain
1を選択。

f:id:Ovis:20190901125332p:plain
1を選択。

f:id:Ovis:20190901125401p:plain
1を選択。

makeが完了したら下記コマンドを実行して、 /usr/local 配下にディレクトリを移動、実効権限を付加する。

cd ../
sudo mv vpnserver /usr/local/
cd /usr/local/vpnserver/
sudo chmod 600 *
sudo chmod 700 vpncmd
sudo chmod 700 vpnserver

自動実行できるようSystemdに登録する。

コマンド: sudo nano /etc/systemd/system/softether-vpnserver.service

起動用スクリプトも別途作成。
コマンド: nano /usr/local/vpnserver/vpnserver_start 実行権限も付与する。
コマンド: sudo chmod 755 /usr/local/vpnserver/vpnserver_start

ファイルを作成し終わったら下記のコマンドでSystemdをリスタート。
コマンド: sudo systemctl daemon-reload

有効化して起動する。
sudo systemctl enable softether-vpnserver.service
sudo systemctl start softether-vpnserver.service

正しく起動しているかどうか確認。
コマンド: sudo systemctl status softether-vpnserver.service

pi@rasp:~ $ sudo systemctl status softether-vpnserver.service ● softether-vpnserver.service - SoftEther VPN Server Loaded: loaded (/etc/systemd/system/softether-vpnserver.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2019-09-01 13:29:20 JST; 45s ago Process: 2761 ExecStart=/usr/local/vpnserver/vpnserver start (code=exited, status=0/SUCCESS) Main PID: 2764 (vpnserver) Tasks: 31 (limit: 16777216)

Active: active (running) となっていればOKのはず。

SoftEtherの設定

Windowsの SE-VPN サーバー管理(ツール) を起動して、新しい接続設定を作成
f:id:Ovis:20190901134422p:plain

初回接続時はパスワードを指定しろとウィンドウが出るので入力。

簡易セットアップウィザードが表示されるので、 リモートアクセスVPNサーバー にチェックを入れて 次へ ボタンをクリック。
f:id:Ovis:20190901134544p:plain

確認ダイアログが表示されるので、はい をクリック。
f:id:Ovis:20190901134633p:plain

仮想Hub名は何でもよいのでそのままにしておく。
f:id:Ovis:20190901134726p:plain

ダイナミックDNS機能の設定

ホスト名をお好みのものに変更。
f:id:Ovis:20190901134831p:plain

IPsec / L2TP / EtherIP / L2TPv3 設定

今回はL2TPサーバー機能(L2TP over IPsec)を利用するので、 L2TPサーバー機能を有効にする(L2TP over IPsec) にチェックを入れ、IPsec共通設定の事前共有鍵を設定。
f:id:Ovis:20190901134910p:plain

VPNAzureサービスの設定

お好みで。
f:id:Ovis:20190901135124p:plain

VPN接続ユーザー作成

ユーザーを作成する ボタンをクリック。
f:id:Ovis:20190901135216p:plain

ユーザー名と認証方法を設定。今回はとりあえずパスワード認証で。
f:id:Ovis:20190901135316p:plain

ローカルブリッジの設定

ローカルブリッジの設定はとりあえずeth0を選ぶ。
f:id:Ovis:20190901154148p:plain

ローカルブリッジ設定 ボタンをクリック。
f:id:Ovis:20190901135548p:plain

既存のローカルブリッジを一度削除。(よく考えたら上の作業では何もする必要がなかったかも)
f:id:Ovis:20190901135641p:plain

新しいローカルブリッジの定義を作成する。
新しいtapデバイスとのブリッジ接続 を選択し、 新しいtapデバイス に適当な名前を入れて、 ローカルブリッジを追加 をクリック。
f:id:Ovis:20190901135920p:plain

これでつながるはず。

うまくいかない場合はSoftEtherのログを見る。

sudo su
cd /usr/local/vpnserver/server_log/
tail -f vpn_yyyymmdd.log

ついでにTeamViewerをインストール

GUI版でなくてもTeamViewerを入れておくと、自宅外からコンソールを開けるほか、LAN内のパソコンに対してWakeOnLANがTeamViewer経由でスマホからできるようになるので便利。

公式サイトからパッケージファイルをDLしてRaspberryPiに配置。
コマンド: sudo apt install ./teamviewer-host_14.5.1691_armhf.deb

インストールするとTeamViewerのリポジトリがaptに登録されるので、今後はaptからアップデート可能。

セットアップは下記のコマンドを実行。
コマンド: teamviewer setup

日本語メッセージなので迷うこともないかと。

参考

Raspberry PiにハードウェアWatchdogを設定してみましょう | CANDY LINE Blog