ラズパイゼロをUSBドングルにしてインターネット接続

前回セットアップしたラズパイゼロ (Raspberry Pi Zero WH) をUSBドングル替わりにしてパソコンをインターネットに接続する方法です。 今回は、以下のような感じでインターネットへ出ることを想定しています:

[PC] <==USBケーブル==> [ラズパイ] <--Wi-Fi--> [ルーター] --- インターネット
PCラズパイルーター (SSID: MyRouter)
IP192.168.2.2usb0: 192.168.2.1 / wlan0: 192.168.179.x192.168.179.1 / グローバルIP

目次

前提

  • セットアップ対象のラズパイは Raspberry Pi Zero WH (OSは Raspbian Stretch Lite版)
  • 今回もラズパイのモニター無しキーボード無し、そして LANケーブルも無し でセットアップ (ただしOTG接続のためにUSBケーブルは使います)
  • ラズパイは既にインターネットには接続できている状態
  • ラズパイに接続する外部パソコンはLinux

では、はじめましょう。 まずはパソコンとラズパイをUSB OTG接続し、SSHログインしてください:

$ ssh -i .ssh/rpi/id_rsa pi@raspberrypi.local

ラズパイ・ルーター間のIPアドレスを動的割当に変更 (オプション)

前回ラズパイのルーター側のIPアドレスを固定しましたが、今回はそれをコメントアウトします。これはWi-FiルーターからIPアドレスを動的にもらうためです。(これは特に必須というわけではありません。)

ラズパイのDHCPクライアントデーモンの設定をコメントアウト:

/etc/dhcpcd.conf

...

## コメントアウト!
#interface wlan0
#static ip_address=192.168.179.10/24
#static routers=192.168.179.1
#static domain_name_servers=192.168.179.1

ラズパイ側のネットワーク設定

インターフェース設定を変更

interfacesファイルに wlan0 (Wi-Fi側) と usb0 (パソコン側) のインターフェースをそれぞれ設定します。

/etc/network/interfaces

...

# ルーター側IF(Wi-Fi):
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

# パソコン側IF(USB):
allow-hotplug usb0
iface usb0 inet static
  address 192.168.2.1
  netmask 255.255.255.0
  dns-nameservers 192.168.2.1 8.8.8.8

Wi-Fiルーターからインターネットへの接続情報が書かれているwpa_supplicant.conf前回のままでOKです。(ラズパイがちゃんとインターネットに繋がっているか予め確認しておいてください)

ルーティングとマスカレードの設定

sysctl.confnet.ipv4.ip_forwardを有効化:

/etc/sysctl.conf

...

# コメントを外す!
net.ipv4.ip_forward=1

...

iptablesルールを設定&保存:

pi@raspberrypi:~ $ sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j MASQUERADE
pi@raspberrypi:~ $ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

rc.localexit 0の直前に先ほど保存したiptablesルールの読込処理を追加:

/etc/rc.local

...

# 追加!
iptables-restore < /etc/iptables.ipv4.nat

exit0

ラズパイを再起動:

pi@raspberrypi:~ $ sudo reboot

パソコン側のネットワーク設定

ラズパイがUSBでPCと接続されていることを確認後、パソコン上でifconfigを実行し、ラズパイがUSB接続されているインターフェース名を探します。このインターフェース名は大概enから始まります:

$ ifconfig
...

## 発見!
enp0s20f0u1 Link encap:イーサネット  ハードウェアアドレス 62:2b:ed:4f:40:df  
...

TIP: USBインターフェースがifconfigに現れない?
USBを接続してもインターフェース名が見つからない場合、ラズパイを$ sudo reboot とかせずにUSBケーブルを抜き差しで強制的に電源を落としてから起動すると、どういうわけか出現することがあります。

インターフェース名が見つかったらNetworkManagerで以下のように接続設定し、接続してください:

  • 接続名: rpi0-usb (ここは各自ご自由に)
  • デバイス: enp0s20f0u1 (見つけたインターフェース名)
  • IPv4設定
    • 方式: 手動
    • アドレス: 192.168.2.2 (このパソコンに割り振るIPアドレス)
    • ネットマスク: 24 (255.255.255.0)
    • ゲートウェイ: 192.168.2.1 (ラズパイ)
    • DNS サーバー: 8.8.8.8 (Googleの無料パブリックDNS)

上記をコマンドラインで設定するなら以下を実行するだけでOK:

# 接続設定を新規作成:
$ nmcli con add type ethernet con-name "rpi0-usb" ifname "enp0s20f0u1"
# 接続設定を編集:
$ nmcli con modify rpi0-usb ipv4.addresses "192.168.2.2/24" ipv4.method "manual" ipv4.gateway "192.168.2.1" ipv4.dns "8.8.8.8"
# 再接続:
$ nmcli con down "rpi0-usb"; nmcli con up "rpi0-usb"

設定は以上です!

これで、パソコンからラズパイをUSBドングルとして経由し、インターネットへ接続できるようになります。(もちろんラズパイ自身がちゃんとインターネットに繋がっている必要があります)

実際にUSB以外の全てのネットワークを切断した上で、パソコンから外へpingを打ってみましょう:

$ ping www.google.com
PING www.google.com (216.58.197.4) 56(84) bytes of data.
64 bytes from kix06s02-in-f4.1e100.net (216.58.197.4): icmp_seq=1 ttl=51 time=71.4 ms
...

大成功!

ひとこと

今どきWi-Fi受信デバイスの付いていないPCを使っている人はなかなかいないと思いますので、今回の事例はあまり利用価値はないかもしれませんが、今回の設定例を応用すればラズパイのWi-Fi中継アクセスポイント化も可能かと思います。 そんなわけで、前回からワンクッション置いてしまいましたが、次回こそラズパイのWi-Fi中継アクセスポイント化に挑戦したいと思います。

品薄の Raspberry Pi Zero W を楽天で探してみる

芽萌丸IOT研究会 @iot
芽萌丸のIOT関連アカウント。ラズパイとか色々。