Raspberry-PiでVPNサーバーを作る【Buster対応】

スポンサーリンク

公共の無線LANなどを使用するときに、セキュリティの問題とかいろいろありますよね。そんなときには、VPN(Virtual Private Network)というものを使います。仮想的な通信トンネルを構成したプライベートネットワークのことで、一言で言うと、通信内容を暗号化できる技術です。VPNを使えば通信の安全性が高まります。

もう一つ、VPNの大きな利点があります。自宅にVPNサーバーを設置することで、外にいるのに家のネットワークにつながることができることです。これは何を意味するかというと、外にいながら家のPC等を操作することができるということです。

この記事はRaspbian 10 Busterに対応しています。

スポンサーリンク

VPNのしくみ

真面目にVPNのしくみを解説すると長くなるので、概要イメージを簡単に示すことにします。

・VPNを使用しないとき(普通の通信)
[PCやスマホ]–非暗号化通信–[公共ルーター]–非暗号化通信–[インターネット]
・VPNを使用するとき
[PCやスマホ]–暗号化通信–[公共ルーター]–暗号化通信–[インターネット]–[自宅ルーター]–非暗号化通信–[インターネット]

公共のルーターを通るときの通信内容が暗号化できるんですね。なのでその際の盗聴とかのリスクも減らせます。DNS偽装とかのリスクも減ります。
※ここでいう暗号化はHTTPS通信の話ではないです

このようなVPNを構築するために、Raspberry Piを買ってそれをサーバーにします。VPNサーバーのソフトウェアは、SoftEther VPNを使用することにします。

Raspbianのインストールと設定

Raspberry Piの初期設定をしていない方は、こちらを参考に初期設定をすすめてください。

Softether VPNの導入

それでは、最強のVPNソフトウェア「Softether VPN」をRaspberry Piに導入しましょう。

仮想ブリッジのネットワーク設定

Linuxにはネットワーク仕様の問題(欠陥!)があるそうです

VPN オンラインマニュアル - 3.6 ローカルブリッジ

Linux オペレーティングシステム内部での制限事項により、VPN 側 (仮想 HUB 側) からローカルブリッジしている LAN カードに割り当てられる IP アドレスに対して通信を行うことはできません。この制限は PacketiX VPN が原因ではなく、Linux の内部構造に原因があります。もし VPN 側 (仮想 HUB 側) から Linux でローカルブリッジに使用しているコンピュータ本体と、何らかの通信を行いたい場合 (たとえば VPN Server / VPN Bridge サービスと HTTP サーバーサービスを両方動作させており、VPN 側からもサーバーサービスにアクセスさせたい場合) は、ローカルブリッジ用の LAN カードを用意して接続し、その LAN カードと既存の LAN カードの両方を物理的に同じセグメントに接続してください

要約すると、

VPNサーバーにしたRaspberry Piに直接接続することが出来なくなってしまうので、仮想のブリッジデバイスをかませる必要がある

ということです。Raspberry PiのIPアドレスを、物理インターフェイス(eth0)ではなく、仮想ブリッジ(br0)に割り当て、br0にeth0とVPN仮想HUBをブリッジさせることでこの問題を解決します。何を言っているのかわからなくても問題ありません。とにかく、仮想ブリッジを作成します。

仮想ブリッジに必要なパッケージ bridge-utils をインストールします。

sudo su -

で、rootになります。sudoでも問題ないと思います。

apt-get -y install bridge-utils

で、ブリッジに必要なパッケージをインストールします。次に、ネットワーク設定をいじります。Raspbianのネットワーク設定はややこしく、/etc/network/interfacesと、/etc/dhcpcd.confがあり、ネットワークデバイスの設定は前者を、IPアドレスの設定は後者を編集するようです?よくわかりません。

まず、 /etc/network/interfaces を編集し、eth0をbr0(仮想ブリッジ)に追加します。

vi /etc/network/interfaces

と入力し、次を追記します。シャープ#の部分はコメントなので無視してください。

auto br0
iface br0 inet manual
bridge_ports eth0
bridge_maxwait 10

bridge_ports eth0の行で、br0とeth0をブリッジしたことになります。USB-LANコネクタとかでLANを増設している場合は、そちらのデバイスに設定してください。

次に、 /etc/dhcpcd.conf にIPアドレスの設定を書き込みます。

vi /etc/dhcpcd.conf

今後IPアドレスはbr0に与えられることになるため、 denyinterfaces eth0 文によって、eth0のDHCPが機能しないようにします。さらに、br0に対してIPアドレスの設定を記述します。

ちなみに、以前にeth0に対してIPアドレス設定を/etc/dhcpcd.confに書き込んでいれば、その部分はコメントアウトするか削除しておいてください。

#eth0を無効に
denyinterfaces eth0
#br0の設定
interface br0
static ip_address=192.168.0.5/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8

以前は『/etc/network/interface』に設定していましたが、いつからか最近バージョン『/etc/dhcpcd.conf』へ設定が変わったようです。

・Setting a static IP on Raspberry Pi on Raspbian 20150505
http://sizious.com/2015/08/28/setting-a-static-ip-on-raspberry-pi-on-raspbian-20150505/

一旦Raspberry PiをRebootします。

shutdown -r now

これで、仮想ブリッジデバイスbr0の設定が完了しました。今後は、ネットワークデバイスとしてbr0を使用していくことになります。

参考サイト
https://blog.ymyzk.com/2018/05/raspbian-9-stretch-bridge-interface/
https://qiita.com/manabuishiirb/items/6fb8ff796d8e016f40c6
https://www.feelsogood.life/raspberrypi/raspberry-pi%E3%81%A7vpn%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%EF%BC%88%E3%81%9D%E3%81%AE%EF%BC%91-bridge%E4%BD%9C%E6%88%90%EF%BC%89
http://xn--u9j0md1592aqmt715c.net/raspberry-pi2-vpnserver-part1/

Softether VPNのダウンロードとコンパイル

Softether VPNのダウンロードページに移動し、
ダウンロードするソフトウェアを選択→SoftEther VPN (Freeware)
コンポーネントを選択→SoftEther VPN Server
プラットフォームを選択→Linux
CPUを選択→ARM EABI (32bit)
の順で選択していき、パッケージをダウンロードします。

SoftEther ダウンロード センター

ちなみに、執筆当時最新RTM版のVer 4.29のリンクをここに貼っておきます。

https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.29-9680-rtm/softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-arm_eabi-32bit.tar.gz

もしくは、リンクURLからwgetでRaspberry Piから直接ダウンロードしましょう。

ここから、Raspberry Piの操作になります。インストール作業は、sudoで行うのではなく、rootユーザーにて作業したほうがいいらしいです。(作者が推奨しているらしい?)

sudo su -
cd /root

パッケージを直接ダウンロードして、解凍します。

wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.29-9680-rtm/softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-arm_eabi-32bit.tar.gz

tar xzvf softether-vpnserver-*.tar.gz

ビルドします。

cd vpnserver && make

利用条件に同意するか?といったことを聞かれるので、すべて1で答えていくと、makeが始まります。

Do you want to read the License Agreement for this software ?
1
Did you read and understand the License Agreement ?
1
Did you agree the License Agreement ?
1
~makeが始まる~

すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。と出れば成功しています。

出来上がったバイナリを/usr/localに移し、パーミッションを設定します。

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

注意:Softether公式の方法では、chkconfigという自動起動システムをインストールし、init.dに initスクリプトを仕込む方法をとっていましたが、2019年8月現在の最新のRaspbian Busterでは、initスクリプトのやり方はうまく行かないようです。これからの時代は、systemdを使ったサービスとして自動起動させるのが筋な様子です。

7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

参考サイト
https://seasky.blue/weblog/index.php?e=2268
https://qiita.com/t-ken/items/c43865973dc3dd5d047c
https://qiita.com/kumasun/items/6fd9ddafc8ea6278f088
https://cpoint-lab.co.jp/article/201809/5207/
https://rin-ka.net/softether-install/
https://knowhow.hirohiro716.com/?p=922

自動起動設定

自動起動用のスタートアップスクリプトを作成します。下記のような「スタートアップスクリプト」を /etc/systemd/system/vpnserver.service という名前で作成してください。

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

[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
WorkingDirectory=/usr/local/vpnserver/
ExecStartPost=/bin/sleep 10 ; brctl addif br0 tap_vlan
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target

ここで、tap_vlanとある部分は、このあとに作成するTAPデバイスの名前です。tap_***のような名前になります。

その後、 /etc/systemd/system/vpnserver.service のパーミッションを変更します。

chmod 755 /etc/systemd/system/vpnserver.service

作成したサービスを読み込みます。

systemctl daemon-reload

最後に、上記のスタートアップスクリプトが Linux カーネル起動時に、自動的にバックグラウンドで起動するようにします。

systemctl enable vpnserver.service
systemctl start vpnserver.service

これでデーモンとしてvpnserverが起動することになります。

3.2 動作モード - SoftEther VPN プロジェクト

初期設定

次に、vpncmdを使って初期設定をします。Windows版のGUIソフトもあるので、日常的にはそっちを使ったほうがわかりやすくて良いです。初期設定だけvpncmdを使うことにしましょう。

./vpncmd

1 - 3 を選択:1
接続先のホスト名または IP アドレス:(何も入力せずEnter)
接続先の仮想 HUB 名を入力:(何も入力せずEnter)
VPN Server>

VPN Server には、初期状態で “DEFAULT” という名前の「仮想 HUB」が 1 つだけ登録されています。この “DEFAULT” という名前の仮想 HUB を、そのまま使用することもできます。また、この仮想 HUB を削除して別の名前の仮想 HUB を作成し、それを使用することもできます。

とのことですが、新たに仮想HUBを作成します。

VPN Server>HubCreate
作成する仮想 HUB の名前: VPN(何でも良いです)
パスワード: (何も入力せずEnter)
確認入力  : (何も入力せずEnter)

次に、「ローカルブリッジ」の設定を行います。「ローカルブリッジ」の意味と意義は公式マニュアルに書いてありますが、意味がわからなくてもとりあえず設定しておきましょう。(正直なところ私も完全には理解していません)

3.6 ローカルブリッジ - SoftEther VPN プロジェクト
VPN Server>BridgeCreate VPN /DEVICE:vlan /TAP:yes
(VPNは先程作成した仮想HUBの名前です)
(vlanは新たに作成するtapデバイスの名前です。)

デフォルトの仮想HUB DEFAULTを削除します。

VPN Server>HubDelete DEFAULT

vpncmdはCtrl+Cで終了させてください。

さて!VPNサーバーの準備ができました。とりあえずRaspberry Piを再起動しましょう。

shutdown -r now

参考サイト
techblog.clara.jp/2016/04/raspberry-pi-3-model-b_install_and_ssh_connect/
usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi_SSH.html
qiita.com/Cinosura/items/6ab435331ea2b3671a1d
xn--u9j0md1592aqmt715c.net/raspberry-pi2-vpnserver-part1/
www.majishini.net/wp/?p=833
usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi3.htmlhttps://peraichi.com/landing_pages/view/xo6jf
https://blog.ymyzk.com/2018/05/raspbian-9-stretch-bridge-interface/
http://workspacememory.hatenablog.com/entry/2017/11/14/221909
http://nibral.github.io/posts/2016-04-11-vpnserver_on_raspi2/

Windowsから管理する

今後はWindowsから管理マネージャーを通して管理することになります。

SoftEther ダウンロード センター

Softether VPNのダウンロードページに移動し、
ダウンロードするソフトウェアを選択→SoftEther VPN (Freeware)
コンポーネントを選択→SoftEther VPN Server Manager for Windows
プラットフォームを選択→Windows
CPUを選択→Intel (x86 and x64)
のようにして管理マネージャをダウンロードして、起動してください。
インストーラなしバージョンのURLリンクを張っておきます。

https://www.softether-download.com/files/softether/v4.29-9680-rtm-2019.02.28-tree/Windows/Admin_Tools/VPN_Server_Manager_and_Command-line_Utility_Package/softether-vpn_admin_tools-v4.29-9680-rtm-2019.02.28-win32.zip

「新しい接続設定」からRaspberry Piへの接続設定(IPアドレス)を作成し、「接続」をクリックしてください。

管理者パスワードを変更させられるので、適切に設定します。

以下、おまけです。

Raspberry PiでNTFSファイルサーバー

NTFS形式のHDDをマウントしてファイルサーバーにするという話も興味深いので、一部紹介しておきます

NTFS形式のHDDをマウントするためにntfs-3gをインストールします

sudo apt install ntfs-3g

リブートします。実際にマウントする前に一旦システムを再起動しないと、エラーが出るらしいです。

参考

peraichi.com/landing_pages/view/xo6jf
qiita.com/Cinosura/items/6ab435331ea2b3671a1d

Raspberry Piで他のPCをWake On Lanする

SENGOKU氏のwol.cを使用します。 wol.c:http://www.gcd.org/sengoku/docs/wol.c

ダウンロードしてコンパイル

cd
mkdir wol
cd wol
wget http://www.gcd.org/sengoku/docs/wol.c
gcc wol.c -o wol

./wol 192.168.100.1 **-**-**-**-**-**

こんな感じで実行します。

#!/bin/sh
./wol 192.168.100.1 **:**:**:**:**:**

こういうシェルスクリプトを書いたらいいです。

参考

www.gcd.org/sengoku/docs/wol.c
zipsan.hatenablog.jp/entry/20140117/1389952909
qiita.com/kaishero/items/5e48f952c36dcaef27fb
dadasan.blogspot.jp/2013/10/raspberry-piwol.html

インターネットとの間の通信が VPN を優先的に流れないようにする方法

外出先のPC(例えば社内PCや学内PC)から,自宅のコンピュータにアクセスするためにVPNを繋いだとします.
すると,ローカルネットワークのみならず,インターネットへのアクセスにもVPNのネットワークが使われることになります.
公共無線LANとかのセキュリティ向上の目的でVPNを使うならそれでいいのですが,安全なネットワークにいるPCから,自宅のPCにつなぎたいという目的でVPNを使うときは,インターネットへのアクセスは普通に物理LANからアクセスしたほうが早くていいです.
その方法があったのでメモ.「インターフェイスメトリック」というものがキーワードです.

質問

オフィスに VPN Server を設置し、自宅の PC に VPN Client をインストールしました。自宅の PC からオフィスに VPN 接続すると、オフィスの PC にアクセスすることができるようになりました。しかし、同時にすべての通信がオフィスに設置されている NAT を経由してインターネットに出るようになりました。これにより通信速度が若干低下してしまいます。また、オフィスのファイアウォールのセキュリティポリシーが強要されてしまいます。VPN に接続中に、オフィスのコンピュータとの間の通信だけ VPN を経由するようにして、インターネット上のホストとの間の通信は自宅の NAT を経由するようにすることは可能でしょうか ?

回答

とても簡単です。
VPN Client の仮想 LAN カードに関する Windows のネットワーク接続設定の TCP/IP (IPv4) の設定を開いてください。
「インターフェイスメトリック」がデフォルトで「1」に設定されています。これを「1000」などの大きな値に変更すれば、物理的な LAN カードのほうの優先順位が高くなります。こうすれば、オフィスのプライベート IP アドレス宛のパケットだけが VPN 経由で流れるようになり、インターネットへのアクセスは自宅の物理的なネットワークを経由して行なわれるようになります。
なお、この問題を解決するために、VPN Client の接続設定における、「ルーティングテーブルの調整処理を行なわない」を有効にしてはいけません。これは効果がないばかりでなく、VPN 通信が大変不安定になる原因になります。この項目の意味がわからない方は、決して有効にしないでください。

引用元:https://ja.softether.org/4-docs/3-kb/VPNFAQ020

ということなので,コントロール パネル\ネットワークとインターネット\ネットワーク接続の中の,自分で設定したVPN用の仮想LANカードのアイコンを選択してプロパティを押します.

network

表示されるプロパティウィンドウの中の,「インターネット プロトコル バージョン4(TCP/IPv4)」を選択し,下の「プロパティ」を押します.

network2

表示されるウィンドウの下辺りの「詳細設定」を押します.

network3

その中の,「インターフェイスメトリック」の値が,デフォルトでは1になっているので,1000くらいの大きな数字に変更します.このインターフェイスメトリックは,簡単に言うとネットワークカードの優先順位のことで,数字が小さいものから優先されます.つまり,この数字を1000にすることによって既存の物理LANカードの順位のほうが高くなり,物理LANのデフォルトゲートウェイが使用されることになります.

network4

戻したいときは同じ手順で行えばOK.一旦VPNをつなぎ直すと効果が現れます.

参考

d.hatena.ne.jp/tatakauashi/20100226/1267191692
support.microsoft.com/ja-jp/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes
blog.ecworks.jp/archives/299

コメント

  1. かめお@さえきなおたか より:

    SoftEtherの解説が適切で分かりやすかったです。他の記事は古かったり間違っていたり… とても参考になりました。ありがとうございました。

タイトルとURLをコピーしました