GL.iNet GL-MV1000 の Dynamic DNS で DuckDNS.org を使う

OpenWrt を内部で利用している GL.iNet GL-MV1000 (Brume) で、DuckDNS.org を使った Dynamic DNS (DDNS)の設定を行ったので、記録を残しておく。IPv4 のみを使っている。

GL.iNet のミニルータを使って同一セグメントのLAN内の独立した複数地点を SoftEther で Layer 2 Bridge するための準備である。複数地点のIPアドレスはDHCPで割り当てる必要があり、変化することがあるので、DDNSでそのIPアドレスをDNSに登録し、SoftEther で参照できるようにする。

以下のような構成のうちの破線部分の設定を示す。

OpenWrt の設定をしてから、GL.iNetのAdmin Panelでの設定をすると 、Admin Panelの設定が優先されることが当然のようにあり、OpenWrtと GL.iNet Admin Panelを併用するのには注意を要する気がする。GL.iNet のAdmin Panel で提供されていない OpenWrt の機能を利用するなら、GL.iNet ではなく、Raspberry Pi や FriendlyElec のNanoPi などでよりオリジナルに近いOpenWrt を使った方が設定が簡単な気がする。もっとも、GL.iNetのミニルータはコストパフォーマンスが高いと思う。

使用機材

GL.iNet GL-MV1000 (Brume)

ファームウェアのバージョンは、3.212 であった。

内部的には、以下のバージョンを利用している。

  • OpenWrt 19.07.8 r11364-ef56c85848
  • LuCI openwrt-19.07 branch (git-21.189.23240-7b931da)

luci-app-ddnsのインストール

OpenWrt で DDNSの設定をWeb画面から行うために、luci-app-ddnsをインストールする。

GL.iNet Admin Panel の APPLICATIONS の Plug-ins から luci-app-ddns をインストールすることができる。

また、GL.iNet Admin Panel の MORE SETTINGS の Advanced からOpenWrt の Web インタフェースである LuCI にログインし、System の Software から luci-app-ddns をインストールすることもできる。

使用した luci-app-ddns のバージョンは、2.4.9-7であった。

これ以降は、LuCI もしくは ssh を利用する。

DNSの設定

LuCI を使って DNS の設定を行う。

DNSでのプライベートIPアドレス使用

想定している環境では、DDNS で登録するIPアドレスがプライベートIPアドレスである。設定によってはこの情報がDNSで得られないので、プライベートアドレスでも得られるように、設定の確認を行う。
LuCI の Network/DHCP and DNS/Server Settings の General Settingsタブの Discard upstream RFC1918 responses) のチェックを外した状態にすることでDDNS で登録したプライベートIPアドレスもDNSから得られるようになる。
これ以降では煩雑になるので書かないが、変更したら Save & Apply ボタンを押す必要がある。

DNSの resolver の設定

GL-MV1000が DHCPで得たネームサーバーが使われるように設定を確認する。

LuCI の Network/DHCP and DNS/Server Settings の Resolv and Hosts Files タブの

Dynamic DNS

LuCI の Services メニューから Dynamic DNS ページを開いて設定していく。

  

non-public IP の許可の確認

想定している環境では、DDNSに登録する IPアドレスは LAN内のプライベートアドレスであり、GL-MV1000の場合には、そのままではプライベートアドレスを DDNS に登録しなかった。調べたところ、private ip address をアップデートするためには、/etc/config/ddns の upd_privateip を '0' から '1' に変更する必要があることがわかった。

LuCI では、Dynamic DNS のページ中のOverviewの下の To change global settings click here をクリックして次のページを開く。

Allow non-public IP's にチェックが入っているようにする。

DDNSの設定

IPv4 アドレスの場合には、Dynamic DNS のページ中の Overview に示されている。 my_ddns_ipv4 を利用するので、その Edit ボタンを押して設定の編集を行う。

まず、Basic Settings タブに必要な情報を設定する。

ここでは、DDNS にduckdns.org を利用している。

先に provider を選択して、Change providerボタンを押す。

DuckDNS に登録するための情報を入力する。このDDNSを利用するので Enabled にチェックを入れる。

Advanced Settings タブは以下のようになっていた。

Dynamic DNS のページ中の Overviewの myddns_ipv4 の Start ボタンを押すことで DDNS を起動して試すことができる。しかし、このままではリブートすると DDNS が起動されない。

ブート時に DDNS が起動されるようにする

ブート時や起動時に利用されるスクリプト /etc/init.d/ddns が、 GL.iNetのDDNS用になっていて、そのままでは、LuCIの Dynamic DNS ページで設定した DDNSがうまく起動されない。このため、/etc/init.d/ddns を変更する必要がある。

ssh で GL-MV1000 に接続する。以下では ssh 接続に PuTTY を使った例を示す。ここでは、特に認証のキーなどを設定しないで進めている。

修正点は、boot() で何もしないことになっていたものを /usr/lib/ddns/dynamic_dns_updater.sh — start で起動する行を追加。

restart() や start() の中で OpenWrt の uci (Unified Configuration Interface) コマンドで DDNS が enabled になっているかを取り出しているが、元は GL.iNet の DDNS用になっていたので、ここでは DuckDNS用の my_ddns_ipv4 から enabled の値を取り出すように修正した。


ちなみに、/etc/init.d/ddns は、/etc/rc.d/K10.ddns、/etc/rc.d/S95.ddns からリンクされていた。起動時には、/etc/rc.d/S95.ddns (つまり /etc/init.d/ddns )が使われる。

動作確認

DDNSがブート時に起動されることを確認するために、GL-MV1000 を再起動する。起動して少し時間が経過後に、DDNSが更新されていることを確認する。

DDNSとDNSが適切に動作していることを確認するために、ssh で GL-MV1000 に接続して、DuckDNS に登録したGL-MV1000のWAN側のIPアドレスが DNS によって得られることを確認する。

ここでは、XXXXXX-ivy2.duckdns.org とすると ssh で接続後に次のコマンドを実行する。

また、念のために GL-MV1000のLAN側につないだ端末でも nslookup でIPアドレスが得られることを確認しておく。次は、Windows PCの PowerShell で nslookup を実行した例である。

トラブルシューティング

DDNS に登録するアドレスがプライベートアドレスのために、うまくDNSで IPアドレスが得られないことがあった。上記の設定がわかるまでに時間を費やした。

nslookup などでFQDNから IPアドレスを得ようとした場合に、

SSH の console では、「*** Can't find XXXXX.duckdns.org: No answer」

Windows のPowerShell では、「*** XXXXX..duckdns.org には利用できる internal type for both IPv4 and IPv6 Addresses (A+AAAA) レコードがありません」

まず、DDNSにアドレスが登録されているか確認する。最新のIPアドレスが登録されていない場合には、DDNSがブート時に起動されていることを確認し、起動されているのであればDDNSの「non-public IP の許可の確認」の項の設定を確認する。

DDNSにアドレスが登録されているのに、IPアドレスを取得できない場合には、DNSの「DNSの resolver の設定」の項を確認する。