Raspberry Pi(ラズベリーパイ)を使用した自宅VPNサーバの構築手順をまとめておきます。
Raspberry Pi に「SoftEtherVPN」というフリーソフトを使用して構築します。
これによって自宅外から自宅内のネットワークに安全にアクセスできるようになり、外出先から自宅のパソコンにリモートでアクセスできるようになります。
今回は Raspberry Pi と「SoftEtherVPN」というフリーソフトを用いてVPNサーバの構築を行いました。
また、外部から接続するクライアントとして iPhone8 (iOS11) を例に接続方法を紹介します。
VPNサーバの構築は複数のネットワーク機器が関係してくるため、手順が複雑で繋がらない場合に原因の特定するのが難しくなります。そのため今回は、一度に全ての設定を行わず、段階を分けて少しずつ設定・接続確認を行っていきます。
目次[非表示]
はじめに
最終的なネットワーク構成のイメージ
最終的なネットワーク構成の全体像です。
ここでは細かい技術の話は割愛します(説明できるほど詳しくないので…)。
環境構築の流れ
最初の概要でも書きましたが、構成が複雑でネットワーク機器が複数存在するため、繋がらないときに RaspberryPi の設定が悪いのか、ルータが悪いのか、SoftEhterVPNの設定が悪いのかなど、原因箇所の特定が大変になります。
繋がらない場合に、原因の切り分けが自力でできる方はいいのですが、全員がそうというわけではないので、今回は構築手順を段階的に分けて行い、少しづつ繋がる範囲を広げていきます。
大まかな手順は以下のようになります。
- 最低限の環境を構築する(セキュリティなし)
- 自宅内でVPN接続できることを確認する
- RaspberryPiにネットワークインタフェースを設定する(ブリッジデバイス、tapデバイス)
- 再度、自宅内でVPN接続できることを確認する
- 自宅外からVPN接続できるようにする(ルータを超えられるようにする)
- 自宅外からVPN接続できることを確認する
- セキュリティを設定する
- 再度、自宅外からVPN接続できることを確認する
RaspberryPi に SoftEtherVPN をインストールする
SoftEtherVPN のダウンロード
ダウンロードファイルの確認
SoftEhterVPN のダウンロードは Raspberry Pi 上で行いますが、事前にダウンロードする「バージョン」とダウンロード先の「URL」を公式サイトより確認しておきます。
【ダウンロード】
https://jp.softether-download.com/
公式サイトにアクセスし、ダウンロードするソフトウェアを選択します。
「コンポーネント」「プラットフォーム」「CPU」を選択すると、ダウンロード可能なリストが表示されます。
ダウンロードはRaspberry Pi 上で行うため、リンクを右クリックし、リンク先のアッドレスをコピーしておいてください。
ダウンロード
以下のコマンドを実行し、SoftEhterVPNをダウンロードします。
「wget」の後に先ほど調べた、ダウンロード先のアドレスを指定します。
1 | wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.28-9669-beta/softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-arm_eabi-32bit.tar.gz |
SoftEtherVPN のインストール
以下のコマンドを実行し、ダウンロードしたパッケージを解凍します。
1 | tar zxf softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-arm_eabi-32bit.tar.gz |
解凍できたら、以下のコマンドを順に実行し、ソースコードのコンパイルを実行します。
1 2 | cd vpnserver make |
コンパイル中に3回確認画面が表示されるのですべて「1」を入力してください。
コンパイルが完了したら、以下のコマンドを順に実行し、フォルダの移動とアクセス権限の変更を行います。
1 2 3 4 5 6 | cd .. sudo mv vpnserver /usr/local/ cd /usr/local/vpnserver/ sudo chmod 600 * sudo chmod 700 vpncmd sudo chmod 700 vpnserver |
以上でインストールは完了です。
起動スクリプトの作成
Raspberry Pi 起動時に SoftEhterVPN を自動起動するための設定を行います。
以下のコマンドを実行し、「サービス管理ユーティリティ」ソフトをインストールします。
1 | sudo apt-get install -y chkconfig |
以下のコマンドを実行し、起動スクリプトを新規作成します。
1 | sudo nano /etc/init.d/vpnserver |
テキストエディタに切り替わるので、以下の記述をコピーします。
「Ctrl+O」で保存し、「Ctrl+X」でエディタを終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #!/bin/sh ### BEGIN INIT INFO # Provides: vpnserver # Required-Start: $local_fs $network # Required-Stop: $local_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: SoftEther VPN Server ### END INIT INFO DAEMON=/usr/local/vpnserver/vpnserver LOCK=/var/lock/vpnserver vpn_start() { ${DAEMON} start } vpn_stop() { ${DAEMON} stop } test -x ${DAEMON} || exit 0 case "$1" in start) vpn_start touch ${LOCK} ;; stop) vpn_stop rm ${LOCK} ;; restart) vpn_stop sleep 3 vpn_start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0 |
以下のコマンドを実行し、サービスの登録と開始を行います。
1 2 3 | sudo chmod +x /etc/init.d/vpnserver sudo chkconfig --add vpnserver sudo /etc/init.d/vpnserver start |
Windows で SoftEtherVPN の設定を行う
SoftEhterVPN の設定を行います。設定は Windows での操作になります。
管理ツールのダウンロード
設定を行うための管理ツール「SoftEhter VPN Server Manager for Windows」のダウンロードを行います。
【ダウンロード】
https://jp.softether-download.com/
公式サイトにアクセスして、ダウンロードするソフトウェアを選択します。
「コンポーネント」「プラットフォーム」「CPU」を選択すると、ダウンロード可能なリストが表示されます。
今回はインストール不要のパッケージ版を選択します。インストーラ版でも大丈夫です。
ダウンロードしたら任意のフォルダに解凍します。
VPNサーバの初期設定
フォルダ内の「vpnsmger.exe」を実行し、「SoftEhter VPN Server Manager」を起動します。
接続先の登録
接続先(Raspberry Pi)の登録を行います。[新しい接続先設定]を選択します。
[接続設定名]と[ホスト名]設定を行います。
[接続設定名]は分かれば何でも大丈夫です。[ホスト名]はRaspberry Pi のIPアドレスを設定します。
設定ができたら[OK]ボタンをクリックしてください。
Raspberry Pi への接続
登録した接続先を選択し、[接続]ボタンをクリックします。
サーバ管理用のパスワード設定を求められるので、パスワードを設定します。
簡易セットアップ
簡易セットアップ画面が表示されるので、順番に設定を行います。
SoftEhter VPN Server / Bridge 簡易セットアップ
[リモートアクセス VPN サーバー]を選択します。
確認画面が表示されるので[OK]ボタンをクリックします。
仮想HUBの名前を設定します。名前は何でも大丈夫ですが、特に変える必要もないので「VPN」のままで行きます。
ダイナミック DNS 機能
ダイナミック DNS(DDNS)の設定を行います。
[ダイナミック DNS ホスト名の変更]で好きなホスト名を設定してください。
設定したら[上記の DNS ホスト名に変更する]ボタンをクリックして[閉じる]ボタンで終了します。
IPsec / L2TP / EtherIP / L2TPv3 サーバ機能の設定
VPN接続に使用するプロトコルの設定を行います。
[L2TP サーバ機能を有効にする]を選択し、[IPsec 事前共有鍵]を設定します。
VPN Azure サービスの設定
使用しないため[VPN Azure を無効にする]を選択します。
VPNアクセスユーザの作成
VPN接続を行うためのユーザを作成します。
[ユーザを作成する]ボタンをクリックします。
[ユーザー名]と[認証方法]を設定します。認証方法を[匿名認証]に変更します。
※最低限繋がることを確認した後で[パスワード認証]に変更を行います。
ローカルブリッジの設定
[ローカルブリッジの設定]で「eth0」を選択してください。
自宅内でVPN接続ができることを確認する
ここまでで最低限のVPN環境は整いました。まずは自宅内でVPN接続が可能かどうかを確認します。
クライアント(iPhone)が自宅内のネットワークに参加(WIFI接続)している必要があります。
現在のネットワーク構成は以下のようになります。
iPhoneにVPN構成を追加
iPhoneの操作になります。
[設定]から[一般]を選択します。
続いて[VPN]を選択します。
[VPN構成を追加…]を選択します。
VPNサーバの設定を行います。
【タイプ】
[L2TP]を選択します。
【説明】
何でもよいです。
【サーバ】
RaspberryPi のIPアドレス「192.168.0.70」を設定します。
【アカウント】
作成したユーザ名を入力します。
【RSA SecurID】
使用しないので「OFF」にしておきます。
【パスワード】
現時点では認証方式を「匿名認証」に設定しているためパスワード自体はないですが、何かしら入力しておく必要があります。適当に「123」などを設定しておきます。
【シークレット】
IPsec 事前共有鍵で設定した文字列になります。今回の場合は「vpn」となります。
【全ての信号を送信】
「ON」にしておきます。
設定できたら右上の[完了]をタップして設定を保存します。
iPhoneでVPN接続を行う
追加したVPN構成を選択し、接続を「ON」にします。
「接続済み」と表示され、iPhone のステータスバーに「VPN」アイコンが表示されれば接続成功です。
この時点で接続できない場合は、最初から設定を見直しましょう。
ブリッジデバイスの追加と設定
仮想ブリッジの作成
以下のコマンドを実行し、「仮想ブリッジの設定ユーティリティ」ソフトをインストールします。
1 | sudo apt-get install -y bridge-utils |
以下のコマンドを実行し、ネットワークインタフェースの設定ファイルにブリッジデバイスの追加を行います。
1 | sudo nano /etc/network/interfaces |
テキストエディタに切り替わるので、以下の記述を末尾に追記します。
「Ctrl+O」で保存し、「Ctrl+X」でエディタを終了します。
1 2 3 4 | auto br0 iface br0 inet manual bridge_ports eth0 bridge_maxwait 10 |
メモ
3行目の「bridge_ports」でブリッジ接続を行うネットワークデバイスを設定しています。
環境によってはデバイス名が異なる場合があるので「ifconfig」コマンドにてデバイス名を確認し、自身の環境に置き換えてください。
IPアドレス設定の変更
以下のコマンドを実行し、IPアドレスの設定を行います。
1 | sudo nano /etc/dhcpcd.conf |
テキストエディタに切り替わるので、以下の記述を追記しIPアドレスの固定を行います。
ブリッジ接続を行うネットワークデバイス(今回だと「eth0」)で既にIP固定を行っている場合は、コメントアウトするか削除しておきます。
「Ctrl+O」で保存し、「Ctrl+X」でエディタを終了します。
1 2 3 4 | interface br0 static ip_address=192.168.0.70 static routers=192.168.0.1 static domain_name_servers=192.168.0.1 |
ブリッジデバイスの接続確認
一度 RaspberryPi の再起動を行い、ブリッジデバイス「br0」に設定したIPアドレス(今回だと192.168.0.70)で接続できるようになっているかを確認します。
念のため「ifconfig」コマンドでネットワークデバイスを確認しておきましょう。
ブリッジデバイス「br0」が表示され、設定したIPアドレスが表示れさていることを確認します。
tap デバイスの追加と設定
ローカルブリッジ設定
ローカルブリッジ設定の変更を行います。
管理画面から[ローカルブリッジ設定]ボタンをクリックします。
簡易セットアップで追加したローカルブリッジを[ローカルブリッジの削除]ボタンより削除します。
[仮想HUB]で「VPN」を選択します。
[新しい tap デバイスとのブリッジ接続]を選択し、[新しい tap デバイス名]には「vlan」を入力します。(名前は何でもよいです)
[ローカルブリッジを追加]ボタンをクリックし、ローカルブリッジを追加します。
追加したローカルブリッジが表示され、状態が「動作中」になっていれば完了です。[閉じる]ボタンより設定を終了します。
tap デバイスの確認
「ifconfig」コマンドで作成した tapデバイス「tap_vlan」が追加されていることを確認します。
起動スクリプトの修正
SoftEhterVPN の自動起動スクリプトを修正します。
以下のコマンドを実行し、サービスを一度削除します。
1 | sudo chkconfig --del vpnserver |
以下のコマンドを実行し、起動スクリプトを修正します。
1 | sudo nano /etc/init.d/vpnserver |
テキストエディタに切り替わるので、以下の記述に置き換えます。
「Ctrl+O」で保存し、「Ctrl+X」でエディタを終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/bin/sh ### BEGIN INIT INFO # Provides: vpnserver # Required-Start: $local_fs $network # Required-Stop: $local_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: SoftEther VPN Server ### END INIT INFO DAEMON=/usr/local/vpnserver/vpnserver LOCK=/var/lock/vpnserver vpn_start() { ${DAEMON} start sleep 2 tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'` tap=`/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}'` brctl addif br0 ${tap} } vpn_stop() { ${DAEMON} stop } test -x ${DAEMON} || exit 0 case "$1" in start) vpn_start touch ${LOCK} ;; stop) vpn_stop rm ${LOCK} ;; restart) vpn_stop sleep 3 vpn_start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0 |
以下のコマンドを実行し、サービスの再登録を行います。
1 2 | sudo chkconfig --add vpnserver sudo chkconfig vpnserver on |
一度「reboot」コマンドを実行し再起動を行います。
再度、自宅内でVPN接続ができることを確認する
再度、自宅内からVPN接続ができるかを確認します。iPhone のVPN設定はそのままで繋がります。
現在のネットワーク構成は以下のようになります。RaspberryPi 内部のネットワーク構成が変わっただけです。
自宅外からVPN接続できるようにする
この工程がVPN環境の構築で一番の難所です。
ルータのポートの開放
自宅外からVPN接続にするのに必要なポートの開放を行います。
ルータでの設定が必要になります。使用しているルータによって設定方法が異なるため、ルータのマニュアル等を参照ください。
開放するポートは以下になります。RaspberryPi のIPアドレスに転送するように設定を行います。
ポート番号 | プロトコル | ポート概要 |
500 | UDP | IKE (Internet Key Exchange) |
4500 | UDP | IPsec NAT-T |
使用しているルータの設定例です。
iPhoneのVPN構成を変更
iPhone のVPN構成の編集を行います。
VPN構成の右側のアイコンをタップします。
右上の[編集]をタップします。
「サーバ」をDDNSで設定したホスト名(xxxx.softether.net)に変更します。
自宅外からVPN接続できることを確認する
自宅外からVPN接続ができるかを確認します。一発で繋がれば大成功です。
繋がらない場合の確認点
RaspberryPi までパケットが届いているかを確認します。SoftEhterVPN のログファイルで確認できます。
以下のコマンドを実行し、ログが保存されているディレクトリに移動します。
1 2 | sudo su cd /usr/local/vpnserver/server_log/ |
以下のコマンドでログの内容を表示します。
ファイル名は自身の環境に置き換えてください。日付が新しいものを表示します。
1 | tail -f vpn_20181111.log |
「tail」コマンドでファイルの内容を常時監視できるので、この状態で iPhone からVPN接続してみてください。
接続と同時にファイルの表示が更新されれば、とりあえずポート開放はできており、パケットは届いています。
下記のような表示が出るはずです。これで500番ポートが開放できていることが確認できます。
1 | IPsec Client 2 (192.168.0.10:500 -> 192.168.0.70:500): A new IPsec client is created. |
何も表示されない場合はポート開放ができていないと思われます。設定を見直しましょう。
メモ
私の環境ではポート開放を行った後すぐには接続できませんでした。パケットが届くことは確認できましたが、接続が確立しませんでした。なぜか1時間ほど放置した後に接続できるようになっていました。繋がらない場合は、一度ルータを再起動したり、時間をおいてから再度接続してみてください。
セキュリティ設定を行う
認証方式をパスワード方式に変更する
現在の設定では認証方式が「匿名認証」のため、だれでもアクセスが可能です。
そのため、VPNユーザにパスワードを設定します。
管理画面から[仮想 HUB の管理]ボタンをクリックします。
[ユーザーの管理]ボタンをクリックします。
ユーザを選択し[編集]ボタンをクリックします。
認証方法を「パスワード認証」に変更し、パスワードを設定します。
忘れずに iPhone 側のVPN設定も変更しておきます。
念のため、接続できるか確認しておきましょう。
以上で Raspberry Pi を使用した自宅VPNサーバの構築はおしまいです。