Raspberry Pi

ラズパイ4とsoftetherで自宅にVPNサーバを構築する

こんにちは、鹿せんべいです。

僕がラズパイ4とsoftetherを使ったVPNサーバで実現したいことは3点です。

  1. 自宅以外の場所から自宅のVPNサーバ経由でインターネットにアクセスする
  2. 自宅以外の場所から自宅のファイルサーバ等の情報資産にアクセスする
  3. 上記の構築を通して、インフラの知識を深める

①について実装できたので、備忘録的に書きます。

環境

流れ

  1. 自宅のIPを固定化
  2. ラズパイにSoftEtherのVPN serverをインストール
  3. MacbookにVPN server managerをインストールし、VPN serverを設定
  4. ラズパイのネットワーク設定
  5. ルータ(TP-Link)にVPN serverとの接続を設定
  6. iPhoneやAndroidで動作を確認

2番のVPNserverの自動起動の設定と、5番のラズパイのネットワーク設定(ブリッジの設定)が驚くほどスタックしました。
ネットに転がっている情報が少し古いものが多く、エラーの解消に手間取りました。

1. 自宅のIPを固定化

光回線を契約する

自宅のIPを固定化して、インターネット経由で自宅にアクセスできるようにします。

これはそれぞれのISPにて設定していただく必要があります。どうやら固定IPサービスを提供していないプロバイダもあるようなので、注意が必要ですね。私が使用しているのはSo-net光で、固定IPサービスに対応しています。

ただ固定IPサービスは回線費用に追加で1,320円/月支払うことになります。勉強代として払いますが、痛い出費ですね。

モバイルWi-FiやSoftbank Airなどでインターネットに接続している場合、固定IPを振ることができないと思います。

僕は以前Softbank Airを契約していましたが、使用が混み合う夜間に速度が絞られることに我慢ができなくなり、違約金を払って解約しました。

So-net 光 は僕の住んでいるマンション内のケーブリングが十分ではなく、100Mbpsに制限されていますが、平均的に下り80~90Mbpsくらいはあります。

これを機に光回線に乗り換えるのは、いいと思いますね。まあラズパイでVPNサーバーを作ろうという人がへぼいWi-Fiを使っているとは思いにくいけどね。

固定IPサービスを申し込む

固定IPサービスに対応している回線が引けたら、あるいは引けていれば固定IPサービスに申し込みます。

各ISPによってサービスの名称や申し込みかたは違うと思いますので、調べて申し込みしてください。

ちなみにSo-net光はマイページ>ご契約サービスのご利用状況>サービスを追加>固定IPアドレスと選択していき、申し込みにたどり着けます。

ちなみに申請すると即座に固定IPが割り当てられます。

ルーターを設定

固定IPが発行されたら、自宅のルータのWAN側に固定IPを設定しましょう。

ちなみに僕が使用しているルーターはTP-LinkのArcher A10です。IPv6に対応していますし、IEEE802.11acの通信規格に対応していて、まあまあコスパがいい。僕が買った時は12,000円くらいだったのに、今amazon見たら、7,200円だったw

ずっと同じルーターを使い続けていて、なんだかインターネットの速度が出ないという場合、ルーターが原因である可能性があるので、見直してみることをオススメします。

192.168.xx.yyなど各自のルータのIPをブラウザに入力し、ルータにアクセスします。

管理画面を開いたら、WANインターフェイスにユーザー名、パスワードを入力します。

tp-linkの設定画面
  • インターネット接続タイプ:PPPoE
  • ユーザー名:固定IPで新たに発行されたもの
  • パスワード:固定IPで発行されたもの

So-netの場合は以下のように、固定IPサービス専用のユーザーIDとパスワードが発行されます。

staticip_setting
https://www.so-net.ne.jp/option/staticip/setting/


ルーターによって設定に差はあると思いますが、WAN側のインターフェイスを発行された固定IPに設定します。

動作を確認

設定できたら、確認くん(https://www.ugtop.com/spill.shtml)などでIPアドレスを確認します。

これで固定IPが表示されていると、WAN側に固定IPを割り振ることができています。

2. ラズパイにSoftEtherのVPN serverをインストール

WAN側のインターフェイスに固定IPを割り当てることができたら、次はラズパイにSoftEtherのVPN serverをインストールします。

ほとんど公式ドキュメント(https://ja.softether.org/4-docs/1-manual/7/7.3)を見ながらの作業になります。

VPN Serverをダウンロード

softetherのダウンロードページ(https://www.softether-download.com/en.aspx?product=softether)からソフトウェアのダウンロードを行います。

  • Select Software: Softether VPN
  • Select Componet: Softether VPN Server
  • Select Platform: Linux
  • Select CPU: ARM EABI (32bit)

僕のダウンロード時は、Ver4.32が最新だったので、このtar.gzファイルをダウンロードする。

ダウンロードしたtar.gzファイルをtarコマンドで展開する。後ほど作成されたvpnserverのフォルダは適切なディレクトリに配置するので、tarコマンドを実行する対象のtar.gzファイルは今はどこでも(ダウンロードフォルダでも)構わない。

$ tar xzvf softether-vpnserver-v4.34-9745-beta-2020.04.05-linux-arm_eabi-32bit.tar.gz

tarコマンドを実行すると「vpnserver」というフォルダが作業ディレクトリに作成される。

実行ファイルを作成

VPN serverをインストールする前準備として、vpnserverの実行可能ファイルを作成する。

tarコマンドを実行して作成された「vpnserver」のディレクトリに移動して、makeコマンドを実行する。

$ make

makeを実行すると、何度か質問されるので、回答していきます。

Do you want to read the License Agreement for this software ?
1. Yes
2. No
Please choose one of above number:
1

ライセンスを読みますか?という質問に対しては、「1」と回答し、ライセンスを確認しましょう。

ライセンスの中身が表示された後、理解の有無を尋ねられますので「1」と回答します。

Did you read and understand the License Agreement ?
(If you couldn't read above text, Please read License_ReadMe.txt
file with any text editor.)
1. Yes
2. No
Please choose one of above number:
1

そして、承認するか否かを尋ねられますので、「1」と回答します。

Did you agree the License Agreement ?
1. Agree
2. Do Not Agree
Please choose one of above number:
1

3回ほど「1」と回答すると、vpnserverのプログラムの生成が開始します。

VPN Serverのディレクトリ作成・配置

上記のvpnserverのプログラムの生成が完了したら、tarコマンドを実行した際に、作成された「vpnserver」のフォルダを/usr/local/のディレクトリに移動します。

$ sudo mv vpnserver /usr/local

/usr/local/のディレクトリに「vpnserver」のフォルダを移動できたら、chmodコマンドで権限を書き換えて保護しましょう。

$ chmod 600 *
$ chmod 700 vpncmd vpnserver

動作確認

ここまでできたら、まず動作できるかの事前確認を行いましょう。vpnserver配下のvpncmdを実行し、VPN toolsを起動すると、動作環境をチェックしてくれます。

$ /usr/local/vpnserver/vpncmd

vpncmdプログラムが立ち上がったら、「3」のVPN Toolsコマンドの使用を選択します。

VPN Tools>check

checkを実行すると、カーネル系、メモリ操作系、ファイルシステム、スレッド処理システム、ネットワークシステムがそれぞれチェックされ、全て合格と表示されました。

これでラズパイ上で、Softether VPN Serverが正常に動作しそうだと確認できました。

# VPN Toolsを終了する
VPN Tools>exit

スタートアップスクリプトへの登録

上記まで実行できていれば、Softether VPN Serverはsystemctl startなどのコマンドで起動することができるわけですが、ラズパイを再起動する度にいちいちコマンドを打ち込むのはなかなか厳しいものがあります。ですので、自動起動を設定します。

systemdにデーモンプロセスを登録していきましょう。まずはvpnserver.serviceのファイルを作成します。

ユニットファイル作成

$ sudo touch /usr/lib/systemd/system/vpnserver.service
$ sudo chmod 664 /usr/lib/systemd/system/vpnserver.service
$ sudo vi /usr/lib/systemd/system/vpnserver.service

上記のsudo vi /usr/lib/systemd/system/vpnserver.serviceでvpnserver.serviceファイルを編集します。

[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/lib/systemd/system/vpnserver.sh
ExecStop=/usr/local/vpnserver/vpnserver stop
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.targe

シェルスクリプト作成

次にvpnserver.serviceファイルの7行目の/usr/lib/systemd/system/vpnserver.shのシェルスクリプトファイルを作成します。

#!/bin/bash

/usr/local/vpnserver/vpnserver start
#tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'`
#brctl addif br0 $tap

色々調べたところ、tapデバイスをブリッジするために4,5行目を記載していたのだが、「すでにブリッジに登録されている」旨のエラーが発生したため、コメントアウトしました。自動起動のスクリプトは全てVPNserverのセットアップしてから最後に設定したためだと思います。

この4,5行目を記載するために、shファイルを作成したのだが、結局コメントアウトしたので、何をしているのかわからないw(※startのスクリプトだけならvpnserver.serviceに書いた方が断然いい)


とりあえず、上記のような中身で進めることにします。

※追記
後ほど、4. ラズパイのネットワーク設定のところでコメント外すことになります。この段階ではエラーが発生するので、コメントアウトのままでいいです。

systemdに自動起動の登録

$ sudo systemctl enable vpnserver

自動起動のunit-filesのstatusを確認

無事にsystemctlのコマンドを実行し、登録ができたら、念のために確認しておく。以下のコマンドを入力し、enabledになっていればデーモンプロセスとして登録されていることがわかりますね。

$ sudo systemctl list-unit-files | grep vpn
vpnserver.service                      enabled    

動作確認

では、実際にOSの再起動を行い自動的にプロセスが起動し、VPNのセッション待機状態になっているかを確かめよう。

rebootを実行する。

$ sudo reboot

再起動したら、以下のコマンドを入力し、ステータスを確認する。
Active: active (running)になっていると、起動に成功している。

$ sudo systemctl status vpnserver
● vpnserver.service - SoftEther VPN Server
Loaded: loaded (/usr/lib/systemd/system/vpnserver.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-05-31 13:55:54 JST; 4min 6s ago
Process: 670 ExecStart=/usr/lib/systemd/system/vpnserver.sh (code=exited, status=0/SUCCESS)
Main PID: 716 (vpnserver)
Tasks: 38 (limit: 4915)
Memory: 18.6M
CGroup: /system.slice/vpnserver.service
├─716 /usr/local/vpnserver/vpnserver execsvc
└─717 /usr/local/vpnserver/vpnserver execsvc

ちなみにここで起動に失敗している場合などは、journalctl -xeのコマンドを入力し、遡ると割と明確にエラーが表示されていることが多い。

例えば、そのようなファイルはありません。だったり、構文が誤っています。など原因箇所が特定できることが多い。

systemctl enableのコマンドでエラーがでた場合は、以下の記事も参考になるかもしれない。

3. MacbookにVPN server managerをインストールし、VPN serverを設定

ここからは一旦ラズパイから離れ、別のPCでの作業となります。僕の場合はMacBook Proでの実行です。

VPN server managerをダウンロード

softetherのダウンロードページ(https://www.softether-download.com/en.aspx?product=softether)からソフトウェアのダウンロードを行います。

  • Select Software: Softether VPN
  • Select Componet: Softether VPN Server Manager for Mac OS X
    • 使用するPCの環境に合わせて選択
  • Select Platform: MacOS X
  • Select CPU: Intel(x86 and x64)

VPN Server setup

インストールができたら、VPN Server Manager.appを起動します。

New Settingを選択します。

  • Setting Name: 任意
  • Host Name: ラズパイ(VPN serverが入っているPC)のIPアドレス
  • Password: パスワードを設定

入力ができたら、OKをクリックします。

ラズパイへ接続

今settingした接続先を選択し、Connectをクリックします。

SoftEther VPN Server / Bridge Easy Setup

ここからはガシガシと簡易セットアップを行なっていきましょう。

Remote Access VPN Serverを選択し、Nextをクリック。

確認画面が表示されるので、「はい」を選択する。(なぜここだけ日本語なのだろう……??)

ちなみに簡単に翻訳すると、現在のセッティングを続行したら、VPN serverが初期化されるで。ほんまにええんか?です。

ユーザーアカウントの作成

  • User Name, Full Name, Note: 任意
  • Auth Type: Password Authentication
  • Password: 任意の文字列を設定

設定ができたら、OKをクリックします。

以下のように色々と設定してきます。

1. local bridge(ローカルブリジッジ)の設定

  • Virtual Hub: 作成した仮想HUBを選択。
    • まだ作成していない場合は、先に5.仮想HUBの作成から行ってください。
  • Type To Create: Bridge with New Tap Device
  • LAN Adapter: eth0
    • type to createの選択前しか変更できない
  • New Tap Device Name: 任意の名前を入力

入力ができたら、Create Local Bridgeをクリック。

「はい」を選択し、Exitをクリック。

2. IPsec / L2TP Setting

  • L2TP server: Enable L2TP Server Functionを選択
  • IPsec Pre-Shared Key: 任意の文字列を入力

入力できたら、OKをクリック。

3. DNSの設定

右側の、Change the Dynamic DNS Hostnameに任意の文字列を入力し、Set to Above Hostnameをクリック。

設定ができたら、Exitをクリック。

4. VPN Azure Cloudの設定

使用しないので、VPN Azure SettingはDisable VPN Azureを選択。

設定ができたら、OKをクリック。

5. 仮想HUBの作成

1. local bridge(ローカルブリジッジ)の設定で仮想HUBを選択しているので、すでに作成できている場合、特に新しい設定は必要ない。

  • Virtual Hub Name: 任意の文字列
  • Password: 任意の文字列

設定ができたら、OKをクリック。

以上で、VPN serverの設定は終了です。

Tapデバイスの確認

「1. local bridge(ローカルブリジッジ)の設定」で設定した、Tap Deviceが追加されているか確認しましょう。ラズパイで以下を実行します。

$ ifconfig

~~中略~~

tap_bridge1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

tap_[設定したNew Tap Devise Name]が確認できました。

4. ラズパイのネットワーク設定

VPN server manegerでのセットアップは完了したので、再びラズベリーパイ上での作業となる。

network interfaceの設定

以下のようなコマンドを入力。

pi@raspberrypi:~ $ sudo vi /etc/network/interfaces

ファイルの中身は、wlan0、eth0にはIPは振らない。ローカルループバックは設定。

そして、br0に固定IPを振る。

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto wlan0
iface wlan0 inet manual

auto eth0
iface eth0 inet manual

auto lo
iface lo inet loopback

# SoftEther VPN
auto br0
iface br0 inet static
address 192.168.xx.yy
netmask 255.255.255.0
network 192.168.xx.0
broadcast 192.168.255.255
gateway 192.168.xx.zz

bridge_ports all
bridge_maxwait 10
  • address:ラズパイのIPアドレスを指定。いつぞやのVPNserver managerで設定した値にしておくと、何かと都合がいい。まあ簡単に変えられるからそれほど問題ではないけど。
  • gatewy:ルーターのIPアドレスを指定。
いつぞやのVPN server manager

設定ができたら、再起動をかける。

pi@raspberrypi:/ $ sudo reboot

再起動できたら、ifconfigでbr0に指定した固定IPが振られているか確認を行う。

pi@raspberrypi:~ $ ifconfig
br0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 192.168.xx.yy  netmask 255.255.255.0  broadcast 192.168.255.255

~~中略~~
eth0:
……
lo:
……
tap_bridge1:
……
wlan0:
……

br0の所にinet 192.168.xx.yyのように自分の指定したIPアドレスが振られていれば、OKです。

ブリッジの設定

続いてブリッジの設定を行うために、bridge-utilsのインストールをする。

pi@raspberrypi:~ $ sudo apt install bridge-utils

br0とeth0をブリッジ接続する。

pi@raspberrypi:~ $ sudo brctl addif br0 eth0

コマンドを実行したら、念のために確認する。

pi@raspberrypi:~ $ sudo brctl show
bridge name	 bridge id		    STP enabled	  interfaces
br0		   8000.dca6326ea2ea	 no		     eth0

tapデバイスも同様にブリッジの設定を行う。

ここでようやく/usr/lib/systemd/system/vpnserver.shのファイルのコメントアウトしていた部分を外そう。

#!/bin/bash

/usr/local/vpnserver/vpnserver start
tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'`
brctl addif br0 $tap

再起動し、ブリッジを確認する。

pi@raspberrypi:~ $ sudo reboot
pi@raspberrypi:~ $ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.5ea60457423b	no		eth0
							tap_bridge1

eth0とtap_bridge1がbr0に接続していることが確認できた。

5. ルータ(TP-Link)にVPN serverとの接続を設定

ルーター⇄ラズパイ間のポートの解放を行う。

使用しているルーターによって設定が異なるので、以外とここは難しいかもしれない。

ここではTP-Linkの場合の設定を記載する。

仮想サーバーの設定

ブラウザでルーターにアクセスする。

TP-LinkではNAT転送のタブから仮想サーバーの設定を行う。

500番のポートの4500番のポートを設定する。

ALGの設定

続いて、同じくNAT転送のタブからALG(アプリケーションレイヤーゲートウェイ)の設定を行う。

L2TPパススルーとIPSecのパススルーを有効化。

6. iPhoneやAndroidで動作を確認

設定項目の確認

名称の多少の違いこそあれど、iPhoneやAndroid、MacOS、WindowsOSに限らず、設定する項目はほぼ同じである。

念のために入力する項目が、設定したどの項目に紐づくのかを確認しておこう。

まずホストネームは右側のxxxx.softether.netというものがそうである。

↑Server: VPN server managerで設定したDNSのHostname

UserNameやPasswordは以下の画面で設定した。

↑Account: VPN server managerで設定したUser Name
↑password: VPN server managerで設定したUserのPassword

IPsecのpre-shared keyは下記画面で設定した。

↑Secret: VPN server managerで設定したIPsec Pre-Shared Key

上記の内容を正しく入力すれば、VPNサーバに接続することができる。

iPhoneSE 第二世代

設定

Setting(設定) > General(一般) > VPNを選択。

Add VPN Configuration…をタップ。

設定を入力。

  • Type: L2TP
  • Description: 任意の文字列
  • Server: VPN server managerで設定したDNSのHostnameを入力。
  • Account: VPN server managerで設定したUser Nameを入力。
  • Password: VPN server managerで設定したUserのPasswordを入力。
  • Secret: VPN server managerで設定したIPsec Pre-Shared Keyを入力 。

設定ができたら、Statusを接続に変更。

動作確認

確認くん(https://www.ugtop.com/spill.shtml)などを利用して、VPN接続できているか確認する。

VPN接続し、確認くんのIPアドレスが自宅の固定IPになっていれば成功。

Pixel 3

AndroidもiPhoneとほぼ同じですが、一応接続の方法を見ていく。

設定

Setting(設定) > Network & internet > Advanced > VPNを選択。

  • Name: 任意の文字列
  • Type: L2TP/IPSec PSK
  • Server address: VPN server managerで設定したDNSのHostnameを入力。
  • IPsec Pre-Shared Key: VPN server managerで設定したIPsec Pre-Shared Keyを入力 。
  • Username: VPN server managerで設定したUser Nameを入力。
  • Password: VPN server managerで設定したUserのPasswordを入力。

設定ができたら、VPN接続する。

動作確認

確認くん(https://www.ugtop.com/spill.shtml)などを利用して、VPN接続できているか確認する。

VPN接続し、確認くんのIPアドレスが自宅の固定IPになっていれば成功。

MacBook Pro

MacBook ProでのVPN接続の方法を確認する。

設定

システム環境設定 > ネットワークを開く

左下の+ボタンをクリックする。

  • インターフェイス: VPN
  • VPNタイプ: L2TP over IPSec
  • サービス名: VPN(L2TP)2
  • サーバアドレス: VPN server managerで設定したDNSのHostnameを入力。
  • アカウント名: VPN server managerで設定したUser Nameを入力。

認証設定をクリック。

  • パスワード: VPN server managerで設定したUserのPasswordを入力。
  • 共有シークレット: VPN server managerで設定したIPsec Pre-Shared Keyを入力 。

もしアカウント名や、パスワードがわからなければ再度設定項目の確認の部分をみてほしい。

動作確認

確認くん(https://www.ugtop.com/spill.shtml)などを利用して、VPN接続できているか確認する。

VPN接続し、確認くんのIPアドレスが自宅の固定IPになっていれば成功。

Ubuntu

まとめ

以上で、ラズベリーパイ4(raspberry pi 4 modelB)とsoftetherを用いたVPNサーバーの構築は完了だ。当初掲げていた目的は、以下のような項目だった。

  1. 自宅以外の場所から自宅のVPNサーバ経由でインターネットにアクセスする
  2. 自宅以外の場所から自宅のファイルサーバ等の情報資産にアクセスする
  3. 上記の構築を通して、インフラの知識を深める

①については完了。③も確実に進捗した。

②についても進めたいと思う。

※追記
ファイルサーバー構築の記事をアップしました。

参考サイト