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アドレス使用
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 の値を取り出すように修正した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/sh /etc/rc.common START=95 STOP=10 boot() { # add /usr/lib/ddns/dynamic_dns_updater.sh -- start return 0 } reload() { /usr/lib/ddns/dynamic_dns_updater.sh -- reload return 0 } restart() { /usr/lib/ddns/dynamic_dns_updater.sh -- stop sleep 1 enable=`uci -q get ddns.myddns_ipv4.enabled` #enable=`uci -q get ddns.glddns.enabled` if [ "$enable" = 1 ];then /usr/lib/ddns/dynamic_dns_updater.sh -- start fi } start() { enable=`uci -q get ddns.myddns_ipv4.enabled` #enable=`uci -q get ddns.glddns.enabled` if [ "$enable" = 1 ];then /usr/lib/ddns/dynamic_dns_updater.sh -- start fi } stop() { /usr/lib/ddns/dynamic_dns_updater.sh -- stop return 0 } |
ちなみに、/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 で接続後に次のコマンドを実行する。
1 |
nslookup XXXXXX-ivy2.duckdns.org |
また、念のために 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 の設定」の項を確認する。