Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

2018年頃、ラズパイでisc-dhcp-serverとhostapdでアクセスポイント化を試したことがあります。今更ながらisc-dhcp-serverに再トライしてみて、どうも上手く行かない。エラーもよく分かりませんでした。

先人のブログでもisc-dhcp-serverはたくさん扱われていて、簡単にできるだろうと思っていたら見事にハマった。一応は動作したのですけど、なんだか腑に落ちない。

私の理解力不足は否めませんが、あれ?って思うところを列挙してみます。

dhcpcd.confとdhcpd.conf

設定ファイルのdhcpcd.confとdhcpd.confは別物です。

  1. /etc/dhcpcd.conf (DHCPクライアントデーモン)
  2. /etc/dhcpd/dhcpd.conf (DHCPサーバデーモン)

isc-dhcp-serverはサーバですから2です。

これはDHCPに関することですから、今回だけ特別というわけではありません。つい混乱してしまう部分です。

hostapdとのアクセスポイント化は一応できる

結論を先にいうと、isc-dhcp-serverとhostapdでWi-Fiのアクセスポイント化は一応できました。一応というのは、自分自身がよく理解していない点と、インターフェイスwlan0に手動でIPアドレスを指定しないとエラーが消えなかったからです。

調べてみると、no subnet declaration for wlan0のエラーは、どうもisc-固有のエラーらしく、ip rangeを指定するコマンドを実行しないとダメみたいでした。

全て設定した後、このコマンドを実行すればエラーなく動作した。

sudo ip addr add 192.168.2.0/24 dev wlan0

このコマンドでアドレスを追加しないと、どこをどう変更してもエラーが消えずに動作しません。都合3回試しました。

よく見たエラー

トライしていて、よく見たエラーは2つ。

exit-codeのエラーとNo subnet declaration for wlan0のエラー。

exit-codeのエラーが出たら、confファイルを疑ってください。書式が間違っている可能性があります。空白スペースやセミコロンが無いとか諸々です。Syntaxエラーみたいな感じ??

No subnet declaration for wlan0は先程のIPアドレスをwlan0に指定すると消えた。

No subnet declaration for wlan0 (no IPv4 addresses).
 ** Ignoring requests on wlan0.  If this is not what
    you want, please write a subnet declaration
    in your dhcpd.conf file for the network segment
    to which interface wlan0 is attached. **

基本的な設定

/etc/dhcpd/dhcpd.confデフォルトから2箇所、option domain-nameとoption domain-name-serversのグローバル設定をコメントアウトし、最下行に追記していきます。

#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)

ddns-update-style none;

IPアドレス範囲を追記した。

subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.2 192.168.2.99;
    option subnet-mask 255.255.255.0;
    option routers 192.168.2.1;
    option domain-name-servers 192.168.2.1;
    option broadcast-address 192.168.2.255;
}

仮に192.168.2.0のセグメントとした場合、rangeで払い出し範囲を指定、ルーターやブロードキャストアドレスは上記のようにしました。

■Pi 5は8GBモデルがオススメ

authoritative;

ここまでは良いのですが、authoritative;をどうしたのものか。

クライアントがDHCPにIPアドレスを要求してきたとき、アドレスのセグメントが違う場合の返答処理に関することで、syslogではエラーが見受けられた。

この DHCP サーバーがそのサブネットに対して権限がある場合、「authoritative;」と書いてください。 ディレクティブ サブネット宣言またはそれを囲む何らかのスコープ内サブネット宣言 - 例えば、dhcpd.conf ファイルの先頭に記述します。

syslog

#デフォルトでコメントアウトされているauthoritative;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
# authoritative;

authoritative;
# not authoritative;

しかし、authoritative;を有効/無効しても変わらず、not authoritative;で上手く動作したり、ちょっと意味が分からない。

問題は、IPアドレスの範囲だと思う。宣言がされていない点は同感。

空の範囲を指定すると良いとネットで見掛けた。

subnet 192.168.2.0 netmask 255.255.255.0 {
}

これもよく分からない。

これに加えて、rangeなどのオプションの部分も含めた箇所を追加すればいいのか?

subnet 192.168.2.0 netmask 255.255.255.0 {
}

subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.2 192.168.2.254;
    option broadcast-address 192.168.2.255;
}

固定IPアドレス

/etc/dhcpcd.confに設定して固定IPアドレスは効く。ただ、それだとサービスをストップしてもIPアドレスが異なるセグメントのまま固定になり、自宅LAN環境に繋がりません。当たり前といえば当たり前。

どうやら、ハードウェアのMACアドレスを指定するやり方で固定IPアドレスにできるらいい。しかし、これ効いているのか分からない。

MACアドレスは別に調べる。

ip link show wlan0
link/ether xx:xx:xx:xx:xx

設定したけど反映されていない気がする。

host testpi {
    hardware ethernet (MACアドレス);
    fixed-address 192.168.2.21;
}

それに、host «ホスト名»のホスト名は、何に合わせているのかも分からない。(自分がそこまで調べていないとも言う)

IPv4にWi-Fiを設定

Wi-Fiをアクセスポイント化するため、インターフェイスを明示的に指定するとあった。デフォルトでは何も入っていない。

sudo nano /etc/default/isc-dhcp-server

INTERFACESv4="wlan0"
INTERFACESv6=""

しかし、これも効いているのか分からない。実際に動作もしたので、間違いないとは思うが、海外の掲示板では一旦eth0を入れてからwlan0にしろといった理解不能な記述もあったりして、やはりよく分からない。

素人ながら、どうもIPアドレスとサブネット関連のどこかにバグがあるような気がする。

isc-dhcp-serverとhostapdを使ったアクセスポイント化

Raspberry Pi 4とbullseyeの環境下でも、isc-dhcp-serverとhostapdでのアクセスポイント化はできました。冒頭のように、一部だけ手動でコマンドを打ったことで解決しました。

しかし、再起動すると・・・。

エラーメッセージに度々登場するscopが気になる。subnet declarationもよく目にする。

宣言する方法が何だかよく分かりません。

最後に、isc-dhcp-serverは既に開発が止まってサポートも切れています。

**ISCは、2022年末にISC DHCPのメンテナンス終了を発表しました。**ISCは、既存の加入者に専門的なサポートサービスを提供し続けますが、それ以上のメンテナンスリリースを発行するつもりはありません。

ISC DHCPは、DHCPサーバー、リレーエージェント、およびクライアントを実装するための完全なオープンソースソリューションを提供します。ISC DHCPはIPv4とIPv6の両方をサポートしており、大容量および高信頼性のアプリケーションでの使用に適しています。DHCPは、MPL 2.0ライセンスの条件の下で無料でダウンロードできます。ISC DHCPのクライアントとリレー部分はメンテナンスされなくなりました。

ISCは新しいDHCPサーバーKeaを開発し、ほとんどのサーバー実装でISC DHCPを置き換える予定です。

https://www.isc.org/dhcp/

新しいkeaもissuを見る限りバグだらけのようですね。

ラズパイでWi-Fiのアクセスポイント化なら

DHCPサーバは関係なく、単にWi-Fiのアクセスポイント化をするなら他の方法もあります。

どちらも試してみて問題ありませんでした。

Raspberry Pi OSでもオプションでNetworkManagerが使えます。今後のことを考えるとNetworkManagerの方が導入しやすい印象です。ただ、NetworkManagerも高度なのか、複雑でまだよく分かっていません。

ネットワーク周りは難しいけど、上手く行くと楽しいですね。

参考

DHCPv6 and link-local IPv6 interface addresses