💨

Raspberry Piでイーサネットコンバータ

2023/02/27に公開

はじめに

Raspberry pi を使ってイーサネットコンバータを作る手順を説明します。イーサネットコンバータとはwifiから有線Lanへのブリッジで、wifi access pointの逆ともいえます。LANケーブルで配線できないところをwifiでつなぎ、その先を有線LANで拡張する場合に使えます。同様にwifiを受けて有線に変換するのにルーターを使う場合がありますが、その場合はwifi部分と有線部分は別のネットワークということになります。
イーサネットコンバータを使ったときのイメージを図1に示します。ここで、wifi対応機器とwifi非対応機器は同一のネットワークにつながっていることになります。ですから、wifi対応機器からwifi非対応機器も見えますし、その逆も見えます。この図のイーサネットコンバータをルーターにすると、wifi対応機器とwifi非対応機器は別のネットワークになり、非対応機器から対応機器は見えてますが、その逆は見えなくなります。
私のオフィスはwifiでネットワークが構成されていてwifi対応機器であるならわざわざ有線lanを使う必要はないのですが、なんとwifiにつながらないFax/printer を購入してしまった人がいるのですよ。ですからその fax/printerを使うときはわざわざPCとUSB接続して使っていました。それでは不便なのでこのイーサネットコンバータを余っているRaspberry Piで作ることにしたわけです。
参考にしたサイトは ここ(以後記事Aと呼ぶ)こちら(以後記事Bと呼ぶ)
です。

OSの選択

ラズパイといえば通常OSはRasbianですが、当初Rasbianでゴニョニョやってみたのですがうまくいきません。どこかでミスをしていたのかもしれませんが、とにかくうまくいかないのでUbuntu22.10 Serverにしました。記事BでもUbuntuを選択していますし、記事AではRasbianですが、Rasbianにdefaultで使われているdhcpcdやavahi-daemonをわざわざ削除してsystemd-networkdとsystemd-resolvedを使ってやっているのでもとからこれらを採用しているUbuntuを使った方がやりやすいだろうと考えたわけです。OSのインストールは Raspberry pi Imager を使います。以前は unixの ddコマンドなどを使ってSDカードに書き込みをしていましたが、便利になったものですね。Imager は こちら からダウンロードします。 
ダウンロードしてインストールして走らせると次のような画面になります。


ここで、「OSを選ぶ」をクリック。


ここで、 Other general-purpose OS を選択し、

さらに、Ubuntuを選択。

そして、Ubuntu Server 22.10(64-bit) を選びます。
その後「ストレージを選ぶ」をクリックしSDカードを選択したあと、書き込むをクリックすればSDカードにOSがインストールされます。
私は Raspberry pi 4 を使いましたが、 3でも問題ないと思います。sdカードは16Gを使いました。
私がやったときはどういうわけか書き込みでエラーが出てしまいました。仕方がないのでその状態でSDカードをラズパイに挿してラズパイをパワーオンしたらなんと驚いたことにラズパイの画面(htmiで接続しているテレビ画面ですが)にImagerと同じ画面がでてきてその後OSを選んで書き込みすることができました。その時は自宅で有線lanがある環境だったのでラズパイは有線でlanにつないでいました。

使用するソフト

使用するソフトは記事Bにもありますが、parprouted です。これが無線から有線にブリッジしてくれるデーモンです。記事Bにはオプションとして dhcp-helperを使うと書かれていますが、
私の場合は有線LANで使う機器は固定IPにしてしまえばいいものばかりなので dhcp-helperは使っていません。
parprouted は、 aptで簡単にインストールできます。

user@host:/home/user $ sudo apt install parprouted

ネットワークの設定

parprouted の設定に入る前にネットワークの設定をしておきます。
注意すべきは有線部分をサブネットにするということです。これは記事Aにも詳しく書かれています。
記事Bでは有線部分をサブネットにするとは書かれていませんが、同じネットワークにするとどういうわけか有線部分の機器で名前解決ができなくなりました。それで、記事Aに書かれているようにサブネットでやってみるとみごとに成功しました。サブネットの幅は自由ですが、例えば有線部分の機器の数が14個未満であれば28bitをマスクビットにします。14個以上30個未満ならマスクビットを一つ減らして27bitにします。このあたりも記事Aに詳しく書かれています。例えば元のネットワークが 192.168.10.1/24 でサブネットのマスクが28であれば、下の図のようになります。

有線部分のipアドレスは 192.168.10.242 ~ 192.168.10.254 の13個になるのでこの部分には機器は13個までしかつなげません。サブネットの先頭の192.168.10.240は使用できないことになっています。196.168.10.241はイーサネットコンバータであるラズパイのeth0に割り当てるのでこれも使えません。最後の196.168.10.255はブロードキャストで使えませんので16-3の13個だけです。
wifi機器部分から見るとネットワークは 192.168.10.1/24 に見えていますが、この部分の機器には 192.168.10.239までしか割り当てないようにしておきます。たぶん、間違って 241~ 254に割り当てても問題ないとは思いますが、有線部分と重複しないようにしないといけません。なので絶対重複しないよう239以下に割り当てます。ですからdhcpサーバー(通常は左側にあるwifiルーターの中にある)の設定で239までしか割り当てないようにしておきます。例えば、 2から100個とかにしておきます。
ネットワークの設定はubuntu22.10では /etc/netplan にあるファイルで行います。
そのディレクトリーには 00-installer-config.yaml といった二桁の数字で始まり .yaml 終わるファイルが入っています。それらを後ろの.bkなどを付けて名前を変えておき、新たに 99-manual-conf.yaml といった名前で次の内容を書きます。

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
      addresses:
        - 192.168.10.241/28
      routes:
        - to: default
          via: 192.168.10.1
      nameservers:
        addresses: [84.200.69.80,1.1.1.1]
  wifis:
    wlan0:
      dhcp4: false
      addresses:
        - 192.168.10.119/24
      routes:
        - to: default
          via: 192.168.10.1
      nameservers:
        addresses: [192.168.10.1,8.8.8.8]
      access-points:
        "ssid":
          password: "パスフレーズ"

eth0のnameserverを 84.200.69.80,1.1.1.1 にしていますが、これは記事Aでそのように書かれていたのでそのままにしてあります。通常自分のLANのルーターのアドレス(192.168.10.1等)で問題ないはずです。wlan0のaccess-pointsのところで "ssid" のところは自ネットのssidを書きます。"パスフレーズ"のところも同様です。/etc/wpa_supplicant/wpa_supplicant.confに ssidとパスフレーズを入れているのになおかつここにも入れるのはどうしてかわかりません。というかまぁいれとけばいいかという感じです。ひょっとしてここにはなくてもいいのかもしれませんが試していません。(この記事を書いた後調べてみたのですが、netplanを使う場合はwpa_supplicantは使わないようです。wpa_supplicant.confの方を削除してやってみてませんが。)

ipforward

parproutedの設定に入る前にipforwardの設定が必要です。通常二つのネットワークインターフェース間の転送はデフォルトでは無効になっているのですが、これを有効にします。その設定は /etc/sysctl.conf というファイルをエディットします。このファイルを開くと28行目あたりに

#net.ipv4.ip_forward=1

とコメントアウトされているので先頭の「#」を削除します。

parproutedの設定

parprouted は systemctl edit を使って設定ファイルを作ります。systemctlについてはこちらを参照ください。まずコマンドラインから次のようにタイプします。

user@host:~$ sudo systemctl edit --full --force parprouted

エディター画面がでてくるので以下を書き込みます。コピペして自分の環境にあわせて修正するのがいいでしょう。

[Unit]
Description=proxy arp service

[Service]
Type=oneshot
RemainAfterExit=yes
PIDFile=/run/parprouted.pid
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
#wlanが利用可能になるまで待つ
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --time=60
ExecStartPre=/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
ExecStartPre=/sbin/ip link set dev eth0 up
ExecStartPre=/sbin/ip link set wlan0 promisc on
#dhcpリレーの起動
#ExecStart=/usr/sbin/dhcp-helper  -b wlan0 -s 192.168.0.1#配下の機器でDHCPを使わない場合消去
#arpプロキシ
ExecStart=/usr/sbin/parprouted eth0 wlan0
#停止時
#ExecStopPost=/usr/bin/killall dhcp-helper#配下の機器でDHCPを使わない場合消去
[Install]
WantedBy=wpa_supplicant.service

これは記事Bのパクリです。ちがうところは、dhcp-helper部分をコメントアウトしたところと、最終行のWantedBy=を変更したところです。環境によってはipが /sbin にない可能性があります。私の環境では /usr/sbin にも /sbin にもどちらにもありました。/sbin にない場合は当然ipのある場所をfull pathで指定する必要があります。
ところで私はeditorはvimを使っているのですが、 systemctl edit とやるとdefaultのeditorが立ち上がり、ちょっとパニックに陥ります。systemctlは EDITOR という環境変数に設定されているeditorを使うのですが、この EDITORが空だとdefaultのeditorが立ち上がります。自分好みのeditorを使う場合は、次の様にします。

user@host:~$ sudo EDITOR=vim systemctl edit --full --force parprouted

以上で設定は終了です。parprouted を有効化してリブートすればうまくいくはずです。

user@host:~$ sudo systemctl enable parprouted
user@host:~$ sudo reboot

まとめ

Raspberry pi をイーサネットコンバータにする手順を説明しました。ポイントは以下の通りです。

  • OSはRaspbianではなく Ubuntu Serverが良い。
  • 有線部分のネットワークは無線部分のサブネットにする必要がある。そうでないと名前解決ができない。
  • BridgeするDaemonには parprouted を使う。
  • ipv4-forwardはデフォルトで無効なのでこれを有効にする必要がある。
  • サブネット側(つまり有線部分)は固定ipがよいというか、dhcp-helperは使わないやり方でしか試してない。

Discussion