公共の無線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にはネットワーク仕様の問題(欠陥!)があるそうです
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)
の順で選択していき、パッケージをダウンロードします。
ちなみに、執筆当時最新RTM版のVer 4.29のリンクをここに貼っておきます。
もしくは、リンク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を使ったサービスとして自動起動させるのが筋な様子です。
参考サイト
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が起動することになります。
初期設定
次に、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)
次に、「ローカルブリッジ」の設定を行います。「ローカルブリッジ」の意味と意義は公式マニュアルに書いてありますが、意味がわからなくてもとりあえず設定しておきましょう。(正直なところ私も完全には理解していません)
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 VPNのダウンロードページに移動し、
ダウンロードするソフトウェアを選択→SoftEther VPN (Freeware)
コンポーネントを選択→SoftEther VPN Server Manager for Windows
プラットフォームを選択→Windows
CPUを選択→Intel (x86 and x64)
のようにして管理マネージャをダウンロードして、起動してください。
インストーラなしバージョンのURLリンクを張っておきます。
「新しい接続設定」から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カードのアイコンを選択してプロパティを押します.
表示されるプロパティウィンドウの中の,「インターネット プロトコル バージョン4(TCP/IPv4)」を選択し,下の「プロパティ」を押します.
表示されるウィンドウの下辺りの「詳細設定」を押します.
その中の,「インターフェイスメトリック」の値が,デフォルトでは1になっているので,1000くらいの大きな数字に変更します.このインターフェイスメトリックは,簡単に言うとネットワークカードの優先順位のことで,数字が小さいものから優先されます.つまり,この数字を1000にすることによって既存の物理LANカードの順位のほうが高くなり,物理LANのデフォルトゲートウェイが使用されることになります.
戻したいときは同じ手順で行えば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
コメント
SoftEtherの解説が適切で分かりやすかったです。他の記事は古かったり間違っていたり… とても参考になりました。ありがとうございました。
コメントありがとうございます。とても運営の励みになります。