はじめに
RaspberryPi Zero WをVPNネットワークを利用した手軽で安全なWi-Fiアクセスポイントにする方法を紹介します。完成するとクラウドもしくはオンプレミスのプライベートなネットワークに対して安全に接続することができます。ルーティングテーブルをいじれば、全ての通信をVPN経由にすることももちろん可能です。
またキットを使えば、冒頭の写真のようにUSBポートに差し込むだけで簡単に使うことが出来ます。非常にかっこいいですね。
セキュリティ警察の方々を初め、USBを接続することにセキュリティ上の不安がある方も多いと思いますが、本システムはPCからは電源供給を受けているだけです。また、Raspberry Pi ZeroとPCの接続はタイトルの通りWi-Fiを経由しています。USB経由でのデータのやり取りは一切ありません。
よって、PCからUSB機器への給電すらも禁止されているような場合でも、USB充電器やモバイルバッテリーを繋げて使うこともできます。
といことで、iPad Proにつなげることも出来ます。
これは強い。可能性は無限大です。
VPNのソフトウェアにはSoftetherVPNを利用します。
そして、SoftetherVPNなどのクラウドサーバー側の諸々の設定には、ROS/IoT向けネットワーク/コンピューティング基盤であるRDBOXを使います。いくつかのスクリプトを実行するだけで非常に簡単にクラウド側のサーバを構築できます。デフォルトでは、VPNサーバー、Kubernetes Master、Kubernetes Nodeの3つのサーバーがクラウド上には構築されます。
Wi-Fiのアクセスポイントとなる、RaspberryPi Zero W用のSDカードへの書き込み及び、各種設定はRDBOXが提供しているSDカードライターrdboxGARIBANを使うことでWindows/Mac等のGUIで簡単に行なえます。設定された内容を受けてRaspberryPi Zero Wは電源を入れるだけで自動的に構築され、一切SSH等でログインすること無く本機能を使い始めることが出来ます。
構成
全般
こんな感じで繋がってます。RaspberryPi Zero WのAPはNATを噛ませているので、それだけでも少し安全性が高まっています。Raspberry Pi Zero Wから先はVPNで保護された通信が使用されますので安心です。
無線LANについて詳細を解説
- RaspberryPi Zero W から インターネットへ
- wpa_supplicantで既存のWi-Fiに接続します。(既存のWi-Fiは、公衆無線LAN、テザリング、モバイルルータなどを想定。(wlan0))
- RaspberryPi Zero W と PC
- hostapdを使ってWi-Fiアクセスポイントを立ち上げます。(awlan1)
- PCは、立ち上げたWi-Fiアクセスポイントに接続します。
RaspberryPi Zero Wは物理的なWi-Fiのネットワークアダプタ(Broadcom BCM43143)は一つしかありません。しかしこのネットワークアダプタはvirtual wireless interface追加することが可能です。それによって、wpa_supplicantとhostapdの同時使用が可能です。なお、追加可能なインターフェースの種類や数は/sbin/iw list
コマンドで確認できます。
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
手順
ハードウェアの組み立て手順
- ケース兼、電源供給を発注。
- このキットを使いました。米アマゾンだけでなく、日本でも買えるんですがよく売り切れてます。
- 開封します。内容物はこんな感じです。(RaspberryPi Zero Wは別売りです。)
- 組み立てます。このキット元々はUSB攻撃も出来るよというちょっと物騒な物で、USB通信にも対応しています。しかし今回はそのような機能は全く必要なく、念には念を入れて物理的に接点を塞いでしまいます。あくまでも電源供給ONLYで使用します。
構築手順
サーバー側
- まず、VPNサーバなどを構築します。私達が公開しているチュートリアルを参考に構築します。RDBOX-HQ 構築編の第4章、各サーバの構築のうち、少なくともVPNサーバの構築を完了して下さい。なお、クラウドサービスのブートストラップはAWS、Azure、GCPのメジャーなものに対応しています。また、VPNに関する各種設定はRaspberryPi Zero Wのセットアップ時に必要になるので忘れないようにしてください。
エッジ端末側
rdboxGARIBAN導入
-
rdboxGARIBANをダウンロードandインストールします。
- Windows版とMac版があります。適切なものを選択して下さい。
- RDBOXエッジ端末用のSDカードイメージを予めダウンロードしておきます。
- ダウンロードリンク
- RaspberryPi版、x86_64レガシーブート版、x86_64uefiブート版がありますが、今回はRaspberryPi Zero W用のSDカードを作るのでRaspberryPi版をダウンロードしてください。
- rdboxGARIBANを起動します。
-
一番左のSelect imageボタンをクリックして、先ほどダウンロードしたRaspberryPi版SDカードイメージファイルを選択します。
-
お使いのPCにSDカードを挿入します。左から2番目のSelect targetボタンをクリックして挿入したSDカードを選択します。なお、この項目はSDカード挿入時に自動的に選択されることもあります。その場合は内容が正しい事を確認して下さい。
Set user-dataについての詳細な解説
Set user-dataボタンをクリックして、ホスト名やユーザー名をはじめ、VPNクライアント設定やWi-Fiの接続設定を行います。
- Create Newをクリックします。
- content: |
--- org.rdbox-boot_sub.bash 2020-07-08 09:45:46.033693833 +0900
+++ rdbox-boot_sub.bash 2020-07-08 09:45:33.773928083 +0900
@@ -136,7 +136,6 @@ check_batman () {
check_device_simple () {
if ! ifconfig eth0 > /dev/null 2>&1; then
echo "Device named 'eth0' not found."
- return 8
fi
if ! iwconfig wlan0 > /dev/null 2>&1; then
echo "Device named 'wlan0' not found. (Error.....)"
path: /home/ubuntu/sample.patch
runcmd:
- '/usr/bin/patch /opt/rdbox/boot/rdbox-boot_sub.bash < /home/ubuntu/sample.patch'
- '/opt/rdbox/boot/rdbox-first_session.bash '
- 上記置き換えに関する補足
- RDBOXは本来、Raspberry Pi Zero Wをサポート対象外としています。それを判定するロジックとして有線LAN(eth0)がない場合に失敗するようにしていますが、今回はパッチファイルで失敗しないように書き換えています。
- 合わせて、Kubernetesクラスタへの参加をサポートするヘルパー関数
to_run_kubeadm_join_after_communicating_with
の呼び出しも削除しています。
書き込み
- メイン画面に戻ります。Flash!ボタンをクリックして、SDカードへの書き込みを実施します。
起動
- SDカードをRaspberryPi Zero Wに挿入します。
- RaspberryPi ZeroをPCのUSBポートに差し込み通電します。
- 5〜10分待っていると、Wi-Fiネットワークの一覧に先程指定したWi-FiアクセスポイントのSSIDが表示されます。クリックして接続して下さい。
使用感
そんなに早くはないです。ただ、デバッグやちょっとしたデモを見せる用途であればなんら問題はないと思います。
応用例
今回セットアップしたRaspberryPi Zero Wのルーティングテーブルは、デフォルトではローカルネットワーク宛のパケット以外は既設のWi-Fiに流すようにしてます(速度対策のためです)。これを、全てVPN経由の信頼できる出口からインターネットに出れるように変更することも可能です。速度はこんな感じ。
(参考までに、計測した場所でルーター直結だと120Mbpsぐらいは出てます。)
- Before
ubuntu@rdbox-master-mobile1:~$ /sbin/route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.16.0.1 0.0.0.0 UG 0 0 0 wlan0
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.252.0 U 0 0 0 vpn_rdbox
192.168.170.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
192.168.179.0 rdbox-master-00 255.255.255.0 UG 0 0 0 vpn_rdbox
- ルーティング変更
$ sudo /sbin/route delete default
$ sudo /sbin/route add default gw 192.168.0.1
- After
ubuntu@rdbox-master-mobile1:~$ /sbin/route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default rdbox-vpnserver 0.0.0.0 UG 0 0 0 vpn_rdbox
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.252.0 U 0 0 0 vpn_rdbox
192.168.170.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
192.168.179.0 rdbox-master-00 255.255.255.0 UG 0 0 0 vpn_rdbox
おわりに
OS標準のVPNクライアントは、IPSecやL2TPには対応していますがそれ以外のVPNソフトを使いたいという場合に、本手法は有効な接続手段の一つかと思います。また、ChromebookやiPadなどそもそもVPNアプリの追加インストールが困難な端末にもおすすめです。
いくつものパソコンを使い分けている場合、他のPCやロボットIoT機器も接続したい場合なども、クライアントソフトをインストールせずとも手軽にVPN接続の恩恵を得ることが出来ます。
あとは、
RaspberryPi Zero Wの次期バージョンでの大幅スペックアップを熱望しつつ、この投稿を締めさせて頂きます。