🦾

RaspberryPiとかのシングルボードコンピュータでイーサネットコンバーター

2021/09/17に公開1

初めてのZennです。

LANケーブル敷設するお金がないので仮で手元にあるRaspberry Pi 3B+をイーサネットコンバーターにしてお金が空から降ってくるまで耐える(この記事を書いている時には空からお金が降ってきたために敷設を終えている)

既存の日本語記事もそれなりあって最初は1日で出来てしまうなとか思ってたがネットワーク素人+デーモン素人だったため3ヶ月ぐらいずっと毎日RasPiにSSHしてGNU nanoで手当たり次第にコンフィグファイルをいじってデーモン再起動して手元のPCでarp-scanを回すという大変な苦行を強いられた(Wi-FiのNICとLANポートのNICは規格上ブリッジできないのでこんな遠回りなことをする必要があるらしい。WindowsPCならブリッジできるんだけど、ノートPCを常駐させて置くわけにもいかないので)

この記事もうろ覚えで書いてる節があるのでなんかエラーとか動作しないとかあるかもしれないのでコメント欄でエラーが起きるよ〜とか言ってもらえれば調べて修正します

動作環境

前提条件

  • Wi-Fiへの接続設定が済んでおり、通信が可能である
  • Wi-Fi側のNICがwlan0、有線LAN側のNICをeth1とする
  • wlan0のアドレスを192.168.2.22eth1のアドレスを192.168.2.23とする(サブネットはどちらも/24)
  • ルータのアドレスは192,168.2.1

この記事で完成するネットワーク構成

使用するソフトウェアは

  • parprouted(ARPプロキシをする)
  • dhcrelay(オプション。配下でDHCPでアドレス払い出しを受けたい場合使う)
    • もしdhcpリレーを利用しない場合は###デーモン化にて設定する内容の17行目と21行目を消去してください

ヘルパープログラムのインストールと設定

~$ sudo apt install parprouted dhcp-helper
#一応止めておく
~$ sudo systemctl stop dhcp-helper
#次回起動時に自動起動するように
~$ sudo systemctl enable dhcp-helper

諸々の設定

  • /etc/sysctl.confにて27行目ぐらいのところにあるnet.ipv4.ip_forward=の項目を0から1にする
  • sudo ufw disableでufwを無効化する(許可したもの以外の通信を問答無用でDropするため通信の邪魔)

デーモン化

#新しいデーモンを作る(実行するとエディタが開くので下のテキストをコピペ)
~$ sudo systemctl edit --full --force parprouted.service
[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>
ExecStartPre=/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
ExecStartPre=/sbin/ip link set dev eth1 up
ExecStartPre=/sbin/ip link set wlan0 promisc on
#dhcpリレーの起動
ExecStart=/usr/sbin/dhcrelay -4 -i eth1 -i wlan0 192.168.2.1#配下の機器でDHCPを使わない場合消去
#arpプロキシ
ExecStart=/usr/sbin/parprouted eth1 wlan0
#停止時
ExecStopPost=/usr/bin/killall dhcrelay#配下の機器でDHCPを使わない場合消去
[Install]
WantedBy=NetworkManager.service

有効化

#デーモンの自動起動を有効に
~ $ sudo systemctl enable parprouted.service
#再起動する
~ $ sudo reboot

参考

この質問に対する回答のRecommendedは中継するソフトウェアなんか使わずにサブネットをゴニョゴニョするのが良いらしいが意味が全くわからなかったので正攻法(回答の中ではPROXY ARP WITH HELPER PROGRAMSとなっている)でやりました(それでもコピペでは動かなかった...)

Discussion

charliecharlie

私も何年もraspi をイーサネットコンバータにすることに挑戦してましたがどうやってもできず、あきらめかけていたところこの記事を見つけました。最初はrasbianでやってみましたがうまくいきません。どこかでミスしていたのかもしれませんが、たぶん、rasbianは dhcpcdを使っていてこの記事のやり方はsystemd-networkdでないとうまくいかないのではと思うようになりました。この記事にもリンクがありましたが、parproutedを使わないでやる方法もトライしてみましたがうまくいきません。あのやり方はdhcpcdをやめてsystemd-networkd とsystemd-resolvedを使う方法ですが、その途中でネットにつながらなくなったりして悪戦苦闘してました。で、最後はraspiにubuntu 22.10 serverをinstallしてこの記事のとおりやってみたらうまくいきました。ただ、
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --time>
の部分はtypoでしょうね。 --timeのあとに > が入ってます。これは --time=60 でやってみました。
最後の
WantedBy=NetworkManager.service
ですが、意味がわからないのですが、ubuntuには NetworkManager.service はないみたいなので、どうしていいかわからなかったのですが、
WantedBy=wpa_supplicant.service
にしました。
今のところうまく行ってますが、raspberry pi の配下のmachine ではnameserverにaccessできない(つまり名前解決ができない)ようで、これにはたぶん、dhcrelayを使っていないのが原因かなと推察してます。