みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Raspberry Pi WiFiアクセスポイント&ルーター化

前回の記事でRaspberry Piの内蔵WiFiのアクセスポイント機能クライアント機能を同時に動かしました。

www.mikan-tech.net

そこでは家のWiFiとRaspberry PiのWiFiアクセスポイントはそれぞれ独立していて、それぞれの間では通信できませんでした。

Raspberry Piだけは両方のネットワークに属しているので、どちらとも通信できます。 しかし、Raspberry Piのアクセスポイントにつないだスマホから家のネットワークやインターネットにアクセスできません。

「家のWiFiは家族以外アクセスされたくないがRaspberry Piは不特定多数にアクセスさせたい」場合など セキュリティ的に独立していた方が良い場合はこれでOKです。

一方で、2つのネットワークがお互いつながっていた方がいい場合もあります。 例えばどうせ自分しか使わないからインターネットにも出られるようにしたい場合がそうですね。

今回は2つのネットワークを繋げる方法について説明します。

設定

設定方法はRaspberry Pi公式ドキュメントの"Setting up a Routed Wireless Access Point"から少し変更したものになります。

www.raspberrypi.com

公式ドキュメントは有線LANとWiFiのルーティングですが、ここでは有線LANに加え、WiFi同士のルーティングにも対応しています。

手順としてはIPv4パケットのルーティング機能の有効化IPマスカレード(NAPT)の設定の2つです。

前提条件

Raspberry Pi OS Lite (CUI版) Bullseyeに、前回記事の設定を完了してWiFiクライアントとアクセスポイント両方が使える状態になっていることを前提とします。 まだの方は↓の手順を先に済ませてください。

www.mikan-tech.net

IPv4フォワーディングの有効化

まずはIPv4フォワーディングを有効にします。次のコマンドを実行します。

$ sudo sysctl -w net.ipv4.ip_forward=1

これだけで有効になります。えらく簡単ですね。

sysctlコマンドはLinuxカーネルの各種パラメータを確認・変更できるコマンドです。 LinuxカーネルはIPフォワーディングの機能を持っていてカーネルパラメータで有効化・無効化できます。

この設定で、あるネットワークから別のネットワークへパケットがルーティングされます。 つまり、Raspberry Piのアクセスポイントにつないだスマホからの通信が家のネットワークにも到達できます。

この設定は一時的なもので再起動すると元に戻るため、起動時に自動パラメータ設定するようにしましょう。 /etc/sysctl.d/routed-ap.confというファイルを作成します。vimを使う場合は次のようにします。

$ sudo vim /etc/sysctl.d/routed-ap.conf

中身は次の1行です。

net.ipv4.ip_forward=1

これで再起動してもIPフォワーディングが有効になります。

IPマスカレード(NAPT)の有効化

スマホからのパケットが家のネットワークに流れれば通信できるわけではありません。 通信を可能にするため、IPマスカレード機能を使ってNAPTを使うのが便利です。

IPマスカレード機能はどんなものか、ざっくりと説明すると次のようなものです。

例えばスマホのアドレスが192.168.249.72で、家のNAS192.168.1.11にアクセスするとします。 家のNASからスマホに応答を返そうとしても、家のNASやルーターは192.168.1.xxのネットワークに所属しているので、どこに192.168.249.72があるのかわかりません。 Raspberry Piに応答を送ればRaspberry Piが192.168.249.72に送ってくれるわけですが、WiFiにルーターに静的経路を設定するなどする必要があるでしょう。

Raspberry PiでIPマスカレード機能を有効にすると、スマホが家のネットワークと通信するときに、送信元アドレスをスマホ192.168.249.72からRaspberry PiのIPアドレス192.168.1.12に変換してくれます。スマホからでなく、あたかもRaspberry Piから通信しているように見せるわけです。そうするとNASはRaspberry Piに応答を返します。Raspberry Piは応答を受信すると、元のスマホのアドレスに応答を転送します。

インターネットと通信するときも同じく、Raspberry Pi発の通信として発信元を置き換え、インターネットからの応答はRaspberry Piが受信してスマホに転送します。

市販のWiFiルーターにも入っている機能です。

※実際はアドレスだけ単純に置き換えるようなものではありません。詳しくは別途お調べください。

前置きが長くなりましたが、設定は簡単です。次のコマンドを実行すると、IPマスカレードが有効になります。

$ sudo iptables -t nat -A POSTROUTING -s 192.168.249.0/24 ! -d 192.168.249.0/24 -j MASQUERADE

簡単ですね。iptablesはLinuxのファイアウォール機能やNAT機能を設定するツールです。

このコマンドも一時的に変更するだけで再起動すると消えます。netfilter-persistentを使って保存できます。まずはパッケージをインストールします。

$ sudo apt install netfilter-persistent iptables-persistent

インストール時に現在設定を保存しておくか聞かれますので、YESを選択しましょう。

次のコマンドで保存できます。

$ sudo netfilter-persistent save

これで、/etc/iptables/以下に設定が保存され、起動時に自動的に読み込まれます。

動作確認

動作確認は前回と同じくスマホをRaspberry Piのアクセスポイントにつないで行えます。

ブラウザで https://www.yahoo.co.jp/ でも開いてみましょう。インターネットにアクセスできれば成功です。

これで2つのネットワーク間でルーティングができるようになりました!