Raspberry Pi 3 Model B+の無線LANでルータを構成する

作成:2018年9月22日  最終更新:2019年8月19日

(注:Raspbian Stretchの2018年6月版を使う話です)

実は、作者宅には、Raspbery Pi(ラズベリー・パイ、以後RasPi)シリーズの機種がいくつかあります(初代 Model B、RasPi2 Model B、Zero W)。

Raspberry Pi — Teach, Learn, and Make with Raspberry Pi
https://www.raspberrypi.org/

安価で供給が潤沢、電子的インタフェースが多数あり、LANも有線・無線とりまぜて色々搭載されており、GPUは値段にあわない高性能。プログラミング教育やセンサなどとの連動など、応用も幅広い名作です。

そして先日、現在の最新版である「3B+」(Raspberry Pi 3 Model B+)を入手しました。

Raspberry Pi 3 Model B+ - Raspberry Pi
https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/

目的は「コンポジット(RCA)映像を出力できる可搬型の無線ルータ」を試すためです。3B+には、必要なハードウェア全てが搭載されています(コンポジットだけは映像と音声が1本に統合されているので、変換ケーブルが必要です)。

ただ、ルータ化には思ったより苦戦しました。

RasPiを無線ルータ化する、という記事がネット上にいくつもあるのですが、実は古いものが多いのです。一方で、現在のRasPiで標準的なOSバージョン「Raspbian Stretch」(*)を使ったものは少ないのです。

(*) RaspbianがOS(正しくはディストリビューション)の名前、Stretchがバージョンの名前。

しかも記述が記事ごとに少しずつ違います。実際、私も1回目は次の記事を見て設定したものの、失敗しました。

How to use your Raspberry Pi as a wireless access point - The Pi
https://thepi.io/how-to-use-your-raspberry-pi-as-a-wireless-access-point/

2回目は、もう少しステップが少ない記事を参考にしました。今度は一応成功しました。

How to build a Raspberry Pi wireless access point | PC Gamer
https://www.pcgamer.com/how-to-build-a-raspberry-pi-wireless-access-point/

一応、実際の手順を明記します。なお、作業はSSH経由ではなく本体で行いました(なぜなら、最終的な利用形態が本体からの画面出力を含むものだからです)。SSHでも大して変わらないとは思いますが。

なお、多数のコマンドを入力する都合があるため、可能なら作業端末(RasPi本体なりSSHで接続するPCなり)でこのページを開いておくと、コマンドがコピーできて便利です。

(1) Raspbian Stretchを準備する

イメージファイルのzipファイルを公式(*1)からダウンロードし、Windows用のイメージ作成ツールEtcher(*2)で空のmicroSDカードに書き込みます。なお、今回使ったイメージのファイル名は「2018-06-27-raspbian-stretch.zip」でした。

(*1) Raspbian公式ダウンロードページ
https://www.raspberrypi.org/downloads/raspbian/

(*2) Etcher
https://etcher.io/

RasPi3B+にmicroSDを挿して、USBキーボードとUSBマウスとLANケーブルとHDMIケーブルを接続してから、電源を入れます。

現在のRaspbianは、いきなりGUIが表示されます。以前はコンソール画面(Windowsのコマンドコンソールの親玉みたいなもの)で初期設定していましたが、ずいぶん進歩してますね。SSHやGPIOの有効化もGUIでできてしまいます。

なお、初期設定で重視するのは、地域をJapanにすること(無線の国設定に影響するようです)と、無線LANへの接続をSkipすることです。後者は、他のPCなどから接続を受けるためです。なお、初回はここで無線を接続していました。ただし、そのせいで失敗したのかは未確認です。

この後、システムの更新があります。最初に更新OKした後は完全自動で進み、再起動は最後に1回だけですが、やや時間はかかります。

(2) 無線ルータ化のための追加ソフトを導入する

無線ルータ化については、いくつかやり方があるようですが、先述のものを含む多数の記事では、「hostapd」と「dnsmasq」を使っています。ここでも同様とします。

まずはシステムを最新にして(前の作業の直後の場合、既に最新なので何も更新されませんが)、その後、hostapdとdnsmasqをインストールします。

なお、ここからの手順はコンソールで行います。コンソールはGUI画面左上の黒い「LXterminal」アイコンをクリックするか、キーボードでCTRL+ALT+Tを押します。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install dnsmasq hostapd


インストールが終わったら、入れたばかりのhostapdとdnsmasqをいったん停止させます。これは設定ファイルをいじるので、下手に動いているのはよくないためです。

sudo systemctl stop dnsmasq
sudo systemctl stop hostapd


ちなみに、これらが動いているかは、次のコマンドで調べられます。

systemctl status dnsmasq
systemctl status hostapd


(3) 設定1 : DHCP

(注意)元記事では、ここで有線や無線LANの名前が「wlan0」などの一般的な名前ではなくMACアドレスになる可能性を述べています。しかし幸いにして、今回使ったRaspbianでは修正されていました。ですので以後の説明ではwlan0などの名前をそのまま使います。

まずは、DHCP設定を変更します。

sudo nano /etc/dhcpcd.conf


上記コマンドを実行すると、設定ファイルがテキストエディタで開きます。末尾に次の2行を追加します。

interface wlan0
static ip_address=192.168.123.1/24


(2019-08-19追記)追加する中身の1行目が「nterface wlan0」になっていました。お詫びして訂正します。ぼへみあ様、指摘ありがとうございました。

入力したら、上書き保存して終了します(CTRL+Xを押して、Y、Enterと押すだけ)。

なんとなく読めると思いますが「無線LANのゼロ番(wlan0)に、静的IPアドレスとして192.168.123.1/24を設定する」という意味です。

IPアドレスは好きなものに変更していいと思いますが、今回は急ぎだったので、あえてサンプルの通りにしました(最終的には10.……にするつもりです)。

なお、元記事では次にDHCPを再起動しています(sudo service dhcpcd)が、今回は忘れてました。どちらにせよ、最終的には設定後に再起動するので、あまり問題はないと思います。

(4) 設定2 : dnsmasq

dnsmasqは、インストール時点で設定ファイルが配置されます。しかし、今回やりたいことは単純なので、あえて設定ファイルをいちから作ります。なお、初期配置されているファイルは別名に変えて退避します。

sudo mv /etc/dnsmasq.conf /etc/dsnmasq.conf.old
sudo nano /etc/dnsmasq.conf


設定ファイルの中は、たった2行です。

interface=wlan0
dhcp-range=192.168.123.2,192.168.123.40,255.255.255.0,24h


入力したら、CTRL+X,Y,Enterで上書き保存しつつエディタを終了します。

なお、元記事のスクリーンショットでは、2行目が字下げされてますが、自分はしませんでした。

中身は、これも読めば想像できると思いますが「無線LANゼロ番のIPアドレス貸出範囲は192.168.123.2~192.168.123.40、マスクは255.255.255.0、IPアドレス貸出期間は24時間」という意味です。

(5) 設定3 : hostapd

例によって、設定ファイルを編集します。

sudo nano /etc/hostapd/hostapd.conf


中身は、やや長くなります。WPA2で接続するアクセスポイントを構成するための設定です。

interface=wlan0
driver=nl80211
ssid=MY-SSID
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=MY-PASSWORD


入力したら、CTRL+X,Y,Enterで上書き保存しつつエディタを終了します。

「ssid」と「wpa_ passphrase」は、上記のままではなく、適切なものを自分で設定してください。ただし「wpa_ passphrase」は8~64文字です。

また、channelは、周囲の無線混雑状況次第では変更するとつながりやすくなるかもしれません。

なお、元記事のスクリーンショットには、「ignore_broadcast_ssid=0」とありますが、これは不要です(そもそも初期値がゼロ、つまりSSIDを発信する設定です)。

次に、上記の設定を有効化するために、hostapdのデフォルト動作ファイルを編集します。

sudo nano /etc/default/hostapd


「#DAEMON_CONF=""」という行があるはずなので、そこを「DAEMON_CONF="/etc/hostapd/hostapd.conf"」と書き換えます。冒頭の「#」を削除して有効化し、daemonの設定ファイルとして先ほど編集したものを指定しているわけです。

(2019-08-19追記)DAEMON_CONFの指定が"/etc/hostapd.conf"になっていました。お詫びして訂正します。ぼへみあ様、指摘ありがとうございました。

なお、元記事ではここで、hostapdとdnsmasqを起動しています(「sudo systemctl start hostapd」「sudo systemctl start dnsmasq」)が、最終的に再起動する以上、あまり大事ではないと思います。

(6) 設定4 : 無線LANと有線LANのポートフォワード

ここまでで無線LANのアクセスポイントが設定されましたが、ついでに、無線LANに接続したPCなどから、有線LAN側につながるよう設定します。そのために、まずはシステム設定ファイルを編集し、ポートフォワード機能を有効化します。

sudo nano /etc/sysctl.conf


ファイルの途中に、「#net.ipv4.ip_forward=1」という行があるので、先頭の「#」(コメント化)を消します。もちろん、そのまま上書き保存してエディタは終了。これでコメント化が解除され、(次の起動時からは)ポートフォワードが有効になります。

(7) 設定5 : IPマスカレード

IPマスカレードも有効化します。今回は、ファイルを編集するのではなく、直接コマンドを実行します。下記は、とりあえず今、IPマスカレードを有効にするコマンドです。

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


大文字/小文字の違いも意味があるので注意してください。

続いて、いま入力したコマンドの設定を、ファイルに書き出して、それを「起動時に実行する内容」に追記します。これにより、再起動してもIPマスカレードが毎回有効になります。

sudo sh -c “iptables-save > /etc/iptables.ipv4.nat"


設定をファイルに書き出しました。

sudo nano /etc/rc.local


上記は起動時に実行する内容の編集コマンドです。テキストエディタが開いたら、ファイルの末尾まで進みます。最後に「exit 0」という行がありますが、その「手前」に、次の行を加えます。

iptables-restore < /etc/iptables.ipv4.nat



これで設定は終わりです。再起動すると、先ほど設定したSSIDの無線LANアクセスポイントができているはずです。他のPCなどで確認してみてください。また、RasPiの有線LANを、インターネットにつながるよう接続した状態なら(ここまでの作業をしていれば、そうなっているはずです)、RasPiに接続したPCなどからもインターネットにつながります。

個人的にはRasPiを本式の家庭用ルータの代用にしようとは思いませんが、来客向けの臨時ルータとか、モバイルバッテリと組み合わせて外で使うとかは、ありだと思います。

【おまけ1】ルータにPCを接続してみた結果

・Windows 10は素直につながる
・Windows 7は接続に時間がかかったり、接続できなくなったりする

という結果が出ています。Windows 7については、全てで問題が発生するかは分かりません。

【おまけ2】RasPiから無線ネットワークの中身が見える

RasPiに接続するWindows PCでmekikuを実行し、1台で簡易Webサーバ機能を動かします。そのIPアドレスを、RasPiのブラウザ「Chromium」のアドレス欄に入力したところ、普通に字幕画面が表示されました。

ちなみに、Firefoxでも表示できたものの、画面更新のたびに左下にアクセスする旨のメッセージが表示され、ちらつくので、情報保障には不向きです。なお、RaspbianでFirefoxをインストールするコマンドは「sudo apt-get install iceweasel」です。


◀(前記事)PowerPointの「ノート」をLibreOfficeで抽出する
▶(次記事)Thunderbird 115でメールリストやフォルダリストのフォントサイズを直す

(一覧)[2.技術情報 (tech)]