※ 当ページには【広告/PR】を含む場合があります。
2022/04/21
インターネットで「ラズパイ ルーター化」や「ラズパイ スイッチング化」検索すると、様々関連でやられている方々の技術記事を拝見できます。ご家庭でのネットワーク事情も様々あり、ラズパイの使い方は似ているようで何処か違うので、一概に同じとは言えませんが、今回のこの記事でやりたいものは以下の模式図のような「有線LANしかないデスクトップパソコンを、ラズパイに有線接続させて、そのラズパイがWiFi接続でインターネットへ中継してくれる」ような使い方を目指します。
ラズベリーパイ4B 4GB 技適対応品 LABISTS Raspberry4 4B-32GB オールインワンセット TP-Link WiFi 無線LAN 中継器 11ac AC750 433+300Mbps ラズパイのインターネット中継機かの種類
目標に応じては、ネットワーク構築用のソフトウェアの補助が必要になってくるかも知れません。ラズパイを「WiFiルーター」「WiFiアクセスポイント」化したい場合には、hostapdというパッケージが利用されることが多いようです。ラズパイをアクセスポイント化することで、WiFi無線接続の出来る子機を複数台接続して、ラズパイを経由して外部のネットワークにアクセスすることが出来るようになります。もう一つの方式はネットワークブリッジを構築するやり方です。ラズパイのネットワークと、他のインターネットに接続させたいネットワーク同士をブリッジさせれば、比較的簡単にインターネットを共有できます。つまりラズパイを「スイッチングハブ」化したいときに利用できるのが、ブリッジ方式の良いところですが、ラズパイには基本有線LANポートが1つしか無いので、物理的に複数台の有線LAN機を接続しようと思うと、USB-LAN変換デバイスや、スイッチングハブのようなハードを増設する必要もあるのが難点です。簡単にネットワークブリッジを設定するためのツールとして有名なのが、bridge-utilsというパッケージソフトというものがあります。巷にはとても便利なネットワーキングツールが存在しているとはいえ、よりネットワークなどを理解するためには、今回のお題はとても良い課題といえます。ということでラズパイに接続するデスクトップを1台に絞って、手動でiptablesコマンドからNATコンバータとしてカスタマイズしてみます。参考サイト
ラズパイをWifiルーター化した話Raspberry piでbridgeを作成
ラズベリーパイ4B 4GB 技適対応品 LABISTS Raspberry4 4B-32GB オールインワンセット TP-Link WiFi 無線LAN 中継器 11ac AC750 433+300Mbps ラズパイをルーター化する
では冒頭で挙げていた今回目指す自宅のネットワーク構成の模式図を再喝します。ここでは自宅に元からあるブロードバンドルーター機器から構築されたネットワークを、例として192.168.0.0/24
ネットワークとします。普段はこのネットワークを使って複数のパソコンやスマホなどをWiFiや有線LAN接続で利用しています。一般的に、任意のネットワークから、そことは別のネットワークにポートフォワードによってネットワーク間共有を行うことを考慮すると、別のネットワークの構築用にも別のルーター機器を用意する必要があります。ということで今回は手持ちのラズパイをルーター化して、新規に192.168.21.0/24
ネットワークを構築するところから作業を始めます。さらに192.168.21.0/24
ネットワークを構築した上で、このラズパイの「NATコンバータ」化の手順を考えます。この「NATコンバータ」という意味は、上の模式図の示す通り、「192.168.0.0/24
ネットワークと192.168.21.0/24
ネットワークのパケットを交換できる」ような機能をもったルーターを指しています。重要なことは、以下のようにこのラズパイ存在する2つのインターフェイス(wlan0とeth0
)が、それぞれ別のネットワークに所属するという構成になっているということです。ということで以降では、先にwlan0
側は既にインターネットへ接続できるようにしておいて、eth0
側に192.168.21.0/24
ネットワークを構築する流れで説明していきます。ラズパイのwlan0(WiFi)をIP固定する
ラズパイでインターネットに繋げる側のネットワークの設定を行っていきます。ここらへんの作業は以前のブログの回で初期設定として取り上げていましたので詳細は省きます。
【Raspberry Piセットアップ方法(旧式)】ラズパイ & Remmina on LinuxでRDP接続してリモートデスクトップさせてみるラズパイにリモートデスクトップを導入するまでの手順をまとめます。
ではwlan0
のIP値を192.168.0.2
で固定するために/etc/dhcpcd.conf
に以下の内容を追記します。編集後にこの設定を反映させます。これでインターネットに繋がるかを確認しておきましょう。ラズパイのeth0をIP固定する
続いてラズパイをルーター化する前に、有線LANのインターフェイスであるeth0
も、以下の諸元でIP固定しておきましょう。このeth0には192.168.21.0
ネットワークのデフォルトゲートウェイの役割を与えるために192.168.21.1
を割り当てに使います。再度/etc/dhcpcd.conf
の末尾へ追記します。ラズパイにDHCP・DNSサーバーを導入する
次にラズパイをルーター化するため、DHCPサーバおよびDNSサーバーを導入します。今回はラズパイのDHCPサーバーでよく目にするisc-dhcp-server
と、軽量なDNSサーバーdnsmasq
をインストールして使います。本記事の内容ではラズパイに直接デスクトップを1台しか繋ぎませんが、今後の拡張を考えてDHCPで192.168.21.2 ~ 192.168.21.99
までのアドレスを付与するようにしてみます。以下のように/etc/dhcp/dhcpd.conf
にDHCPサーバーの設定を編集していきましょう。このDHCPサーバーの設定をeth0へ紐付けします。次にDNSサーバーも設定確認していきます。/etc/dnsmasq.conf
というファイルの末尾に以下を追記してみます。以上、DHCP・DNSサーバーの設定を終えたら、isc-dhcp-serverとdnsmasqのサービスを常駐化させます。ここで一度ラズパイを再起動して、DCHPサーバーおよびDNSサーバーが立ち上がるかを確認しておきましょう。後はポートフォワーディングの設定を適切に行うことでラズパイがルーター化します。このポートフォワーディングを行うためのツールこそ、今回の記事の主題でもあるiptables
コマンドと呼ばれるものです。かなり奥深いソフトウェアですので、使い方を軽くまとめながら次の節で設定手順を説明します。ここまでの参考サイト
RASPI で WiFi to 有線 イーサネットコンバータ を作ってみました。Raspberry Piで無線LANイーサネットコンバータ兼簡易ルータを作る
ラズベリーパイ4B 4GB 技適対応品 LABISTS Raspberry4 4B-32GB オールインワンセット TP-Link WiFi 無線LAN 中継器 11ac AC750 433+300Mbps iptablesコマンドでwlan0とeth0を正しくポートフォワードさせる
今回の話の肝として、iptablesの使い方を理解することにあります。この節で基本的なiptablesコマンドの概要・用法を先に説明していきます。なおiptablesコマンドを十分理解していらっしゃる方であれば、基礎的な内容をスキップしてもらって、ラズパイルーター化の作業の続きからお読みください。iptablesコマンドのインストール
デフォルトではiptablesはインストールされていないので、Raspberry Pi OSに導入する場合、から使えるようになります。iptablesのテーブルモデル
iptablesのルーティングモデルで最小構造の模式図を以下に示します。今回の内容ではローカルプロセスでのパケット介入処理(INPUT
/OUTPUT
の各チェイン)は行わないので説明はしませんが、パケットでログを取ったり、不正なパケットを棄却したりするファイヤーウォールを独自に作成したときに使うようです。今回はFORWARD
/PREROUTING
/POSTROUTING
チェインの概要を主として簡単な用途の説明をしていきます。FORWARDチェイン
まず最も理解のしやすいFORWARD
チェインから説明します。このルールは発信元・-i <インターフェイスやIPアドレス>
から送信先・-o <インターフェイスやIPアドレス>
へのパケットを転送する・しない(ACCEPT/DROP
)を決めるルールです。FORWARDチェインを追加すると、LAN内でパケットがどのようにルーティングされるかを細かく制御することが可能です。例えば、ネットワークのルーターのデフォルトゲートウェイをもつインターフェイスがeth0
にある場合、このeth0から全てのパケットを出入りを許可したいなら、次のようなFORWARDチェインを設定することになります。このルールで、デフォルトゲートウェイの所属する内部ネットワークへのアクセスが許可されます。FORWARDの用法として良く見かけるのは、LANネットワーク内部で使用しているファイル共有などのローカルなサービスが誤って、外部に漏洩しないように-j DROP
で棄却するような使い方もあります。なお、たまに使う-m state --state
オプションを指定すると、パケットの状態でさらに細かくルールを適用させたい条件を指定できます。POSTROUTING(SNAT)の設定作法
SNATは送信元(Source)のアドレスを変換するNATであり、POSTROUTINGチェインでルール付します。POSTROUTINGチェインとはインターフェイスからパケットが送信される際の変換ルール決める、送信側デバイスの設定を記述します。例えば、送信元のアドレスが192.168.1.123
というパケットを受けとったルーター(eth0
)が、そのパケットを転送するときに、その送信元のアドレスを書き換えるルールを作成できます。この書き換えに使われるオプションとして、-j MASQUERADE
(マスカレード変換: 内部から外部へのパケットのアドレス変換)を指定すると殆どの場合上手くいきます。MASQUERADEでは、例えばパケットがブロードバンドルーターから外部へ出る際に、送信アドレスがグローバルIPアドレスに自動で変換されます。ということで、管理者がどのアドレスやポート番号に置き換えればよいのかを逐一判断する必要がなくなります。マスカレードを使わないで、明示に発信元アドレスの書き換えを行う場合に-j SNAT
(SNAT変換)を使うことになります。POSTROUTINGでつかうパラメータとして、をそれぞれ指定しています。変更後の内容が反映されているか、natテーブルのChain POSTROUTING
の項目を確認しておきます。ここでMASQUERADEよって192.168.1.0/24
ネットワークが自動で判別されて追加されていることが確認できます。PREROUTING(DNAT)の設定作法
SNATの対になる変換にDNATが存在します。DNATは送信先(Destination)のアドレスを変換するNATで、PREROUTING
チェインから設定することができます。このPREROUTINGチェインによって、パケットの受信時にそのパケットを何処に転送すると良いのかがNATテーブルのルールによって変換されることになります。例えば、wlan0インターフェイス入力されるパケットに対して、宛先が192.168.1.2
だったものを、192.168.1.123
に変換するルールを作りたいとなると以下のようにできます。ここでもitablesに色々とパラメータが付いています。DNATを作成したら、NATテーブルを確認してみます。これでDNATがPREROUTINGテーブルに作成されていることが分かります。iptablesコマンドからポートフォワーディング
では話を「ラズパイのルーター化」に戻しましょう。前節ではネットワークインターフェイスのIP固定、DHCP/DNSサーバーの設定まで終わりました。続きとして、ポートフォワードの設定からやっていきます。ラズパイのeth0
側に接続されたパソコンからのパケットは全て一旦eth0
へ送られることになります。ということで、eth0に割り振られていた192.168.21.1
が192.168.21.0
ネットワークのデフォルトゲートウェイになります。このデフォルトゲートウェイを基点に、別のネットワーク(192.168.0.0
ネットワーク)にあるwlan0(192.168.0.2
)へ転送されることで初めて、192.168.21.0
ネットワークも外部のインターネットに接続できるようにできます。その「転送」のことをポートフォワード
と呼んでいます。ポートフォワード機能をラズパイ側に設定していない状態のままであれば、接続されたPCからのリクエストを何処に転送していいのか分からないままなので、192.168.21.0
ネットワークの外部へのアクセスが開始されることはありません。ということでこのポートフォワードを有効化してみます。/etc/sysctl.conf
の中身を編集し、コメントアウトされているnet.ipv4.ip_forward=1
を有効(#を削除)にします。この/etc/sysctl.conf
を書き換えた後で、以下のコマンドを叩くと設定を反映させることができます。これでラズパイのポートフォワード機能が開始されます。rc.localにiptablesコマンドを書き込む
では今回の話で最も重要な設定を行います。/etc/rc.local
ファイルに以下のようなルーティングチェインを仕込んでみます。ここで最初2つのFORWARD
チェインでは、「eth0から入ってきたパケットをwlan0へ転送する」
ルールと「wlan0から入ってきたパケットをeth0へ転送する」
ルールの合わせ技になっています。これでwlan0とeth0が相互に通信されるようになります。最後の3つめのPOSTROUTING
チェインで、「ラズパイから送られる全てのパケットの送信元をwlan0として扱う」
ルールになります。このルールが無いと、外部に繋がっている192.168.0.0
ネットワークに所属していないeth0
が送信元になってしまい、192.168.0.0
ネットワークのルーター(192.168.0.1
)は、何処に応答を返せば良いか分からずに、無効のパケットとして棄却(DROP)されてしまいます。よって、SNATとしてラズパイから出ていく全てのパケットの送信元をwlan0(192.168.0.2
)として変換することで通信が受領(ACCEPT)されるようにすることが出来きます。これでrc.local
を書き換えて、ラズパイを再起動させると、ラズパイのeth0側に接続した192.168.21.0
ネットワークも外部のインターネットに繋がるようになります。余談〜rc.localにiptablesコマンドを書き込まないNAT設定の保存方法
では、iptablesコマンドからSNAT/DNATを手動で設定した場合、基本的にはそのセッションだけのルーティングテーブルが構築できるだけですので、ラズパイを再起動するとこの設定はリセットされてしまいます。このため、先程説明したようにテーブルの設定を永続化するためには、/etc/rc.local
から起動のたびにこのコマンドを実行させる必要がありました。中には/etc/rc.local
の中身をあまり汚染したくないかたもいると思います。代替手段として、iptables-save
とiptables-restore
コマンドから起動時に、記録済みのiptablesの設定を読み出す方法もあります。まずは手動で設定したルーティングテーブルの内容を下記のコマンドで保存しておきます。