DHCPリレーを使って、OpenWrtから離れたセグメントにIPアドレスを割り当てるのに苦労したときのメモです。

環境
  • OpenWrt 22.03.0-rc4

    • Dnsmasq 2.86-13

  • VyOS 1.3.0-rc6 (equuleus)

  • Debian GNU/Linux 11 (bullseye)

OpenWrtでは、DnsmasqというDNS兼DHCPサーバーが動作しており、私の環境では 10.1.2.0/24 のネットワークでIPアドレスを配布しています。 現在の設定から、10.1.130.0/24 のネットワークでもDHCPによるIPアドレス他を自動設定できるようにします。

GxC1ZP0

設定

以下の作業を行います。

VyOS
  • DHCPリレーの設定

OpenWrt
  • Dnsmasqの設定ファイルに、配布するIPアドレスの範囲やDHCPオプションを記述

  • UCIで、Dnsmasqの設定内容を関連付ける

VyOS DHCPリレー設定

10.1.130.0/24 で流れるDHCPパケットをセグメント外部のDHCPサーバーに転送するため、DHCPリレーエージェントとして構成します。 インターフェイスは、DHCPリレーで使う全てのインターフェイスを指定する必要があります。

コマンドの詳細は以下リンクを参照してください。
DHCP Relay — VyOS 1.3.x (equuleus) documentation

DHCPリレーインターフェイスの指定
set service dhcp-relay interface <interface>
DHCPサーバーの指定
set service dhcp-relay server <server>
設定確認 show config
service {
    dhcp-relay {
        interface eth3
        interface eth0
        server 10.1.2.1
    }
}

OpenWrt DHCPサーバー設定

OpenWrtでは、Dnsmasqの設定ファイル /etc/dnsmasq.conf を編集し、uci コマンドで設定内容を連携させます。

Dnsmasqの設定

/etc/dnsmasq.confdhcp-rangedhcp-options を追加します。

設定項目の詳細はマニュアルを参照してください。
Man page of DNSMASQ

設定ファイル /etc/dnsmasq.conf
dhcp-range=set:cf,10.1.130.100,10.1.130.249,255.255.255.0,12h
dhcp-option=tag:cf,3,10.1.130.1
dhcp-option=tag:cf,6,10.1.130.1
dhcp-range

開始アドレス、終了アドレス、ネットマスク、貸出期間などを設定します。DHCPリレーを使う場合、ネットマスクの設定は必須です。
set:<tag> は、タグ名が一致する dhcp-option を適用するためのラベルです。(ちなみにcfはcloudflareの略)

開始アドレス

10.1.130.100

終了アドレス

10.1.130.249

ネットマスク

255.255.255.0

貸出期間

12時間

dhcp-option
名前 意味

3

Router

デフォルトゲートウェイ

6

Domain Server

DNSサーバー

UCI でDHCP設定に追加

  1. dhcpコンフィグに新たに ex という名前のセクションを追加します。

  2. dhcp.ex.tag リストに /etc/dnsmasq.conf で追加したタグを追加します。

DHCP設定に関する公式マニュアル
[OpenWrt Wiki] DNS and DHCP configuration /etc/config/dhcp

uci コマンドについては、以下のリンクが参考になります。
OpenWrt   UCIコマンドの使い方

設定確認 uci show dhcp
dhcp.ex=dhcp
dhcp.ex.tag='cf'
Caution
既存の dhcp.<section>.tag に追加すると、そのセグメントでIPアドレスが配布されなくなってしまったので、新たにセクションを追加しています。

動作確認

dhclient コマンドを使ってDHCPによるIPアドレスの設定や開放を行います。

root@dhcp-test:~# dhclient -r
Killed old client process
root@dhcp-test:~#
root@dhcp-test:~#
root@dhcp-test:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:6f:7f:74:a2:1d brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet6 fe80::646f:7fff:fe74:a21d/64 scope link
       valid_lft forever preferred_lft forever
root@dhcp-test:~#
root@dhcp-test:~#
root@dhcp-test:~# dhclient
root@dhcp-test:~#
root@dhcp-test:~#
root@dhcp-test:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:6f:7f:74:a2:1d brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 10.1.130.155/24 brd 10.1.130.255 scope global dynamic ens18
       valid_lft 43197sec preferred_lft 43197sec
    inet6 fe80::646f:7fff:fe74:a21d/64 scope link
       valid_lft forever preferred_lft forever
dhclientログ journalctl
Mar 12 08:22:39 dhcp-test dhclient[578]: Killed old client process
Mar 12 08:22:40 dhcp-test dhclient[578]: DHCPRELEASE of 10.1.130.155 on ens18 to 10.1.2.1 port 67
Mar 12 08:22:49 dhcp-test dhclient[588]: DHCPDISCOVER on ens18 to 255.255.255.255 port 67 interval 7
Mar 12 08:22:52 dhcp-test dhclient[588]: DHCPOFFER of 10.1.130.155 from 10.1.130.1
Mar 12 08:22:52 dhcp-test dhclient[588]: DHCPREQUEST for 10.1.130.155 on ens18 to 255.255.255.255 port 67
Mar 12 08:22:52 dhcp-test dhclient[588]: DHCPACK of 10.1.130.155 from 10.1.130.1
Mar 12 08:22:52 dhcp-test dhclient[588]: bound to 10.1.130.155 -- renewal in 18984 seconds.