ラズパイ4とsoftetherで自宅にVPNサーバを構築する
目次
- 環境
- 流れ
- 1. 自宅のIPを固定化
- 2. ラズパイにSoftEtherのVPN serverをインストール
- 3. MacbookにVPN server managerをインストールし、VPN serverを設定
- 4. ラズパイのネットワーク設定
- 5. ルータ(TP-Link)にVPN serverとの接続を設定
- 6. iPhoneやAndroidで動作を確認
- まとめ
- 参考サイト
環境
- ラズパイ(Raspberry Pi 4 Model B)
- OS: Raspbian3.3.1
- SoftEther VPN(https://ja.softether.org/)
- version: 4.32
- So-net 光
- ※固定IPサービスを利用
- TP-Link ルーター AC2600
- 接続用端末(iPhoneSE第2世代、Pixel3a、MacBook Pro)
流れ
- 自宅のIPを固定化
- ラズパイにSoftEtherのVPN serverをインストール
- MacbookにVPN server managerをインストールし、VPN serverを設定
- ラズパイのネットワーク設定
- ルータ(TP-Link)にVPN serverとの接続を設定
- iPhoneやAndroidで動作を確認
2番のVPNserverの自動起動の設定と、5番のラズパイのネットワーク設定(ブリッジの設定)が驚くほどスタックしました。 ネットに転がっている情報が少し古いものが多く、エラーの解消に手間取りました。
1. 自宅のIPを固定化
2022/2/7追記
これまで固定IPで利用してきましたが、固定IPのサービスを提供していないau光でも問題なく動作しています。確実性という点では固定IPサービス利用時に比べ下がるかもしれませんが、無理に申し込まなくてもVPN構築できます!
光回線を契約する
自宅の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インターフェイスにユーザー名、パスワードを入力します。
- インターネット接続タイプ:PPPoE
- ユーザー名:固定IPで新たに発行されたもの
- パスワード:固定IPで発行されたもの
So-netの場合は以下のように、固定IPサービス専用のユーザーIDとパスワードが発行されます。
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」と回答します。
そして、承認するか否かを尋ねられますので、「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.target
シェルスクリプト作成
次にvpnserver.serviceファイルの7行目の/usr/lib/systemd/system/vpnserver.shのシェルスクリプトファイルを作成します。
$ sudo touch /usr/lib/systemd/system/vpnserver.sh
$ sudo chmod 664 /usr/lib/systemd/system/vpnserver.sh
$ sudo vi /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
※追記 後ほど、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のコマンドでエラーがでた場合は、以下の記事も参考になるかもしれない。
https://synrock-tech.com/network/vpn/systemd
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でのセットアップは完了したので、再びラズベリーパイ上での作業となる。
etc/dhcpcd.confの設定
以下コマンドを入力し、etc/dhcpcd.confにbr0の設定を行う。
pi@raspberrypi:~ $ sudo vi /etc/dhcpcd.conf
ファイルの最後に以下のように記載。
# raspberrypi
interface br0
static ip_address=192.168.xx.yy
static routers=192.168.xx.zz
static domain_name_servers=192.168.xx.zz
- ip_address:ラズパイのIPアドレスを指定。
- routers, domain_name_servers:ルーターのIPアドレスを指定。
※もしeth0の設定がコメントアウトになっていない場合(eth0に固定IPを設定している場合)は、コメントアウトしeht0のstaticIPを設定を解除する。
# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
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アドレスを指定。etc/dhcpcd.confの値と合わせる。いつぞやのVPNserver managerで設定した値にしておくと、何かと都合がいい。まあ簡単に変えられるからそれほど問題ではないけど。
- gatewy:ルーターのIPアドレスを指定。etc/dhcpcd.confのroutersの値と同じ。
設定ができたら、再起動をかける。
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のパススルーを有効化。
▼au光の人は以下を参考に設定
6. iPhoneやAndroidで動作を確認
設定項目の確認
名称の多少の違いこそあれど、iPhoneやAndroid、MacOS、WindowsOSに限らず、設定する項目はほぼ同じである。
念のために入力する項目が、設定したどの項目に紐づくのかを確認しておこう。
まずホストネームは右側のxxxx.softether.netというものがそうである。
UserNameやPasswordは以下の画面で設定した。
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
https://synrock-tech.com/network/vpn/ubuntu-l2tp-vpn
まとめ
以上で、ラズベリーパイ4(raspberry pi 4 modelB)とsoftetherを用いたVPNサーバーの構築は完了だ。当初掲げていた目的は、以下のような項目だった。
- 自宅以外の場所から自宅のVPNサーバ経由でインターネットにアクセスする
- 自宅以外の場所から自宅のファイルサーバ等の情報資産にアクセスする
- 上記の構築を通して、インフラの知識を深める
①については完了。③も確実に進捗した。
②についても進めたいと思う。
※追記 ファイルサーバー構築の記事をアップしました。
https://synrock-tech.com/network/vpn/raspberry-pi4-samba-fileserver
参考サイト
- SoftEther VPN プロジェクト公式サイト(https://ja.softether.org/) →やはり公式サイトを一番参照しました。
- Qiita Raspberry PiでのVPNサーバ構築(https://qiita.com/tkyonezu/items/00311e2285366984891c)
- Raspberry Pi 3A+の利用アイディアとしてVPNサーバー(https://raspida.com/rpi3ap-idea-vpn)
- debianリファレンス第5章ネットワークの設定(https://www.debian.org/doc/manuals/debian-reference/ch05.ja.html)