Ubuntu

v6プラスでデュアルスタック

Ubuntu

そもそも、v6プラスを契約すればIPv4とIPv6のデュアルスタックになる、というのが前提。一般には安心して契約できてとても利便性が高まるサービスである。ちょっと変わったことをやろうとすると大変なだけ。

広告


前々回の記事で Windows10 October 2018 Update (1809) を適用したところ、IPv6のチェックを入れておかないと Edge や Microsoft Store 等が使えなくなる問題が発生したこと、そして、IPv6を有効にするとChromeで自宅のサービスにアクセスできないことを書いた。

なんでかなと思って調べてみたら、IPv6をオンにした場合とオフにした場合で、DNSへの問い合わせ結果が異なることがわかった。

IPv6をオン(有効)にするとグローバルなIPv4アドレスが返ってくる。
IPv6をオフ(無効)にするとローカルなIPv4アドレスが返ってくる。

IPv6オフの場合にローカルなIPv4アドレスが返ってくるのは、宅内で内向きDNSサービスを実行しているからなので正しい動作。IPv6オンの場合にグローバルIPv4アドレスが返ってくるのはなぜ?どこに問い合わせに行っているのか?

※この記事はv6プラス契約前に書き始めている。

IPv6接続オプションの巻 ※未解決

契約に際し色々と確認してみると、IPv6接続オプションの契約が有効になっていることがわかった。
プロバイダーに聞いてみると、「契約内容確認ページではIPv6接続オプションが「解除済み」になっているけれども、実態としてはIPv6接続オプションが使える状態になっていた」ということだった。

当時のネットワーク構成は以下。

     [ Internet ] 物理構成図
          │
      ┌─┴─┐
      │ ONU  │
      └─┬─┘
┌────┴────┐
│Router(1)旧機種   │
│IP: 172.16.1.1/16 │
└────┬────┘
      ┌─┴─┐                                                ┌──────┐
      │ HUB  ├──────────────────────┬─┤ WiFi Bridge├─┬─── ・・・
      └─┬─┘                                            │  └──────┘  │
┌────┼──────────────────┐┌────┴────┐┌────┴────┐
│        │                         VMware ESXi││Main PC           ││Android Phone     │
│     (Bridge)                                 ││IP: 172.16.1.2/16 ││IP: 172.16.1.3/16 │
│        ├───────────┐            ││GW: 172.16.1.1    ││GW: 172.16.1.1    │
│┌───┴─────┐┌────┴─────┐││NS: 172.16.1.100  ││NS: 172.16.1.100  │
││Router(2)         ││Server              ││└─────────┘└─────────┘
││IP: 172.16.2.1/16 ││IP: 172.16.1.100/16 ││
││GW: 172.16.2.1    ││GW: 172.16.1.1      ││
││PPPoE Connection  ││NS: 172.16.1.1      ││
│└─────────┘└──────────┘│
└───────────────────────┘

 

Router(1)は旧機種でv6接続オプションには対応していたが、v6プラスには対応していなかった。
また、Router(2)構築前だったからServerのデフォルトゲートウェイはRouter(1)になっている。

Router(1)はv6接続オプションが有効になっていたから、DHCP機能はないもののRA(Router Advertisement)はブリッジしてくれていて、SLAAC(Stateless Address Auto Configuration)はできてインターネットアクセスができるIPv6のIPアドレスを自動構成していた。

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether nn:nn:nn:nn:nn:nn brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.100/16 brd 172.16.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.16.1.101/16 brd 172.16.255.255 scope global secondary eth0:1
       valid_lft forever preferred_lft forever
    inet6 24xx:xx:xxxx:xxx:xxx:xxxx:xxxx:xxxx/64 scope global mngtmpaddr dynamic
       valid_lft 2591644sec preferred_lft 604444sec

 

と、こんな感じ。なので、IPv6接続オプションでもIPv6アドレスが生成されている。

ping6で google.co.jp との疎通確認をしてみたら、IPv4より早いような気はしていた。

$ ping6 google.co.jp
PING google.co.jp(aaaaaaaaaaa.net) 56 data bytes
64 bytes from aaaaaaaaaaa.net: icmp_seq=1 ttl=54 time=7.86 ms
64 bytes from aaaaaaaaaaa.net: icmp_seq=2 ttl=54 time=9.19 ms
・・・
$ ping google.co.jp
PING google.co.jp (nnn.nnn.nn.nn) 56(84) bytes of data.
64 bytes from aaaaaaaaaaa.net (nnn.nnn.nn.nn): icmp_seq=1 ttl=56 time=13.1 ms
64 bytes from aaaaaaaaaaa.net (nnn.nnn.nn.nn): icmp_seq=2 ttl=56 time=13.4 ms

 

ただ、実際にネットワークを使っていて「早い」という感じはなかった。
光回線ナビ / v6プラスと「IPv6接続オプション」や「フレッツ光 IPv6接続」の違い リンク切れ
ここに書かれていることと体感は一致。だけどpingだけを見ていると違うような気も…読み間違いかな。

どんなRAを受け取っているのかは以下で確認。

$ sudo apt install radvdump
$ sudo radvdump
このときの記録はとっておかなかった~

 

このとき、Windows10でipconfig -all してみると、DNSとしてNTT東日本の用意したものも表示されていた。Windows10は、IPv6を有効にしているとIPv4よりもIPv6が優先されるため、問い合わせするとNTT東日本の用意したDNSを先に参照することになる。故に、ローカルにいるのにグローバルなIPv4アドレスが戻ってきていたのだった。

IPv6をオフにしても、覚えたIPアドレスを忘れない場合も。WindowsでDNSキャッシュをクリアするコマンドは以下。

>ipconfig /flushdns

 

 

v6プラスの巻

このあたりまで調べたところでv6プラス対応のRouter(1)が送られてきて設置したため、IPv6接続オプションの検証はやめてv6プラスの設定を始めた。前回記事のRouter(2)構築がそれ。

先に結論。

  • Ubuntuが提供しているisc-dhcp-serverはデュアルスタック非対応。
    ソースからインストールして4.4.xにする必要がある。
  • v6プラス環境ではULAのみ自由に振り出してLAN内のアクセスに利用し、GUAとLLAはRAに従って自動構成させてインターネットアクセスする。
  • Windows10ではGUA,ULA,LLAの全てが即時に正しく振り出されて動作する。
  • UbuntuではGUA,LLAは正しく振り出されるが、ULAは時間が経たないと正しく振り出されず、DNSへの反映もされない問題あり

やったことは以下。

 

IPv6について

さて…ここまで調べてみたところで、IPv6を各クライアントで使えるようにしたほうが、インターネットを利用する上で有利かもしれないと思い始めた。

IPv6はいずれやらなきゃ、という思いを持っていたので、学習。
MURA's HomePage : IPv6実践導入ガイド

1234:5678:9012:3456:7890:1234:5678:9012

 

前半16桁(緑)がサブネットプレフィックス、後半16桁(赤)がインターフェイスID。
前半16桁のうち、最初の12桁(緑太字)がグローバールルーティングプレフィックス、残りの4桁(緑普通)がサブネットID。

この形式で必要なだけIPv6のアドレスを作って持たせる=複数持たせる。

この理解で、宅内のIPv6は以下の構成とする。

  • GUA(Global Unicast Address / 2000::/3)
    RAに従ってServerを含む全てのホストが自動構成する。
    加えて、サブネットプレフィックスはv6プラス契約では固定になるので、Serverのみ固定のIPアドレスを手で追加してみる(=インターネット上の唯一のGUAになりそう)。
  • ULA(Unique Local Address / fc00::/7 ~ 計算ツールを使ってプレフィックスを生成)
    Ubuntu Server を fdxx:xxxx:xxxx:xxxx::100/64 として、他の機器にはfdxx:xxxx:xxxx:xxxx::1:1~fdxx:xxxx:xxxx:xxxx::1:ffffをDHCPで振り出す。
    LAN内はULAでやり取りする。
  • LLA(Link-local Address / fe80::/10)
    全てのホストが自動構成する。狙っていないのだができてしまうのが実態。

ULAのプレフィックスは以下のツールを使わせていただき計算した。
MAKCRAFT / Ipv6UniqueLocal

今回実現するデュアルスタックな構成について

図にするとこんな感じ。

     [ Internet ] 
          │
      ┌─┴─┐
      │ ONU  │
      └─┬─┘
┌────┴────┐
│Router(1)新機種   │
│IPv6: 自動構成    │
└────┬────┘
      ┌─┴─┐                                                ┌──────┐
      │ HUB  ├──────────────────────┬─┤ WiFi Bridge├─┬─── ・・・
      └─┬─┘                                            │  └──────┘  │
┌────┼──────────────────┐┌────┴────┐┌────┴────┐
│        │                         VMware ESXi││Main PC ※2       ││Android Phone ※2 │
│     (Bridge)                                 ││IP: 自動構成      ││IP: 自動構成      │
│        ├───────────┐            ││GW: 自動構成      ││GW: 自動構成      │
│┌───┴─────┐┌────┴─────┐││NS: fdxx::100     ││NS: fdxx::100     │
││Router(2)         ││Server              │││IP: 24xx~::xxx※1││IP: 24xx~::xxx※1│
││IP: 172.16.2.1/16 ││IP: 172.16.1.100/16 │││IP: fdxx~::1:2   ││IP: fdxx~::1:3   │
││GW: 172.16.2.1    ││GW: 172.16.2.1      │││IP: fe80~::xxx※3││IP: fe80~::xxx※3│
││PPPoE Connection  ││NS: 172.16.2.1      ││└─────────┘└─────────┘
││                  ││IP: 24xx~::xxx     ││ 
││                  ││IP: 24xx~::100 ※1 ││
││                  ││IP: fdxx~::100     ││
││                  ││IP: fe80::xxx ※3   ││ ※1: 24xx~::はRoute(1)が通知するプレフィックス
│└─────────┘└──────────┘│ ※2: Main PC や Android Phone は IPv4も構成
└───────────────────────┘ ※3: インターネットに向けたルーティングで必要

 

Router(1)はNTT東日本から貸与されたルーター機器。v6プラス対応で、宅内の各機器に向けてRAを配信するので、各機器はIPアドレスを自動構成する。PPPoEをブリッジする。

Router(2)はUbuntu18.04で構築。Router(1)を通じてPPPoE接続し、グローバルなIPv4アドレスを取得する。

ServerはRouter(2)を通じIPv4でインターネットに向けてサービスを提供。IPv6はRouter(1)を通じてインターネットと接続しており、かつ、宅内ではDHCPv6サービス(fdxx~::)を提供して宅内のIPv6通信を可能にする。
インターネットに向けたIPv6(24xx~::)によるサービス提供は可能なハズだが、インターネット側からIPv6で接続テストできる環境がないため、今回は開放しない。

Main PCは起動すると、Router(1)から配信されるRAで24xx~::のIPアドレスを自動構成。また、ServerのDHCPサービスでIPv4とIPv6(fdxx~::)のアドレスを受け取る。宅内のサービスはIPv6で受け、インターネットは接続先のサーバーによりIPv4とIPv6を使い分けて接続

そして、IPv4しか使えない機器は、IPv4だけで全ての機器とやりとりができる。

こんなデュアルスタック環境を構築する。

 

ServerのIPv6を有効化

宅内でサービスを提供しているServerは IPv6 を無効化している。Ubuntu 12.04 の時代から。アップグレードを重ね現在は Ubuntu 16.04 になっているがそのままだった。
そこで、IPv6を有効にするために以下を行った。

/etc/sysctl.conf

#net.ipv6.conf.all.disable_ipv6 = 1
#net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.all.forwarding = 1

 

設定を有効化させる。

$ sudo sysctl -p

 

ファイアウォールもIPv6を無効化していた・・・
/etc/default/ufw

IPV6=yes ← 有効化
#IPV6=no ← コメント化

 

一旦、ufwを止めて再開

$ sudo ufw disable
$ sudo ufw enable

 

ServerのIPv6アドレスを構成

IPv6のアドレスを設定しなきゃと探してみると…自動構成されるIPv6アドレスの他に、計画のIPv6アドレスを追加する方法はここにあった。Ubuntuのバージョンとかで違うところはテストして吸収。
How do I add an additional IPv6 address to /etc/network/interfaces?

/etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 172.16.1.100
netmask 255.255.0.0
gateway 172.16.2.1
dns-domain hogeserver.hogeddns.jp
dns-nameservers 127.0.0.1

iface eth0 inet6 auto
 post-up  ip -6 addr add 24xx:xxxx:xxxx:xxxx::100/64 dev $IFACE ← delは書くとエラーがでる(実害なし)
 post-up  ip -6 addr add fdxx:xxxx:xxxx:xxxx::100/64 dev $IFACE
#iface eth0 inet6 static ← この書き方もできるけど、遅いし、エラーがでる(実害なし)
# address 24xx:xxxx:xxxx:xxxx::100/64
#iface eth0 inet6 static
# address fdxx:xxxx:xxxx:xxxx::100/64

# 2つ目
auto eth0:1
iface eth0:1 inet static
address 172.16.1.101
netmask 255.255.0.0
#gateway 172.16.2.1        ← これらも書くとエラーがでる。flushが必要になる。
#dns-nameservers 127.0.0.1

 

設定を反映させる。通常は1行目ので反映できるが、面倒なエラーが出たときとかには2行目でエラーの根源を整理しつつ反映させる。

$ sudo systemctl restart networking
$ sudo ifdown eth0 && sudo ip addr flush eth0 && sudo ifup eth0

 

IPv6アドレスと、ルーティング、DNSについて結果を確認。

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.100/16 brd 172.16.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.16.1.101/16 brd 172.16.255.255 scope global secondary eth0:1
       valid_lft forever preferred_lft forever
    inet6 24xx:xxxx:xxxx:xxxx:nnnn:nnnn:nnnn:nnnn/64 scope global mngtmpaddr dynamic ※自動構成
       valid_lft 13851sec preferred_lft 12051sec
    inet6 fdxx:xxxx:xxxx:xxxx::100/64 scope global ※手動設定
       valid_lft forever preferred_lft forever
    inet6 24xx:xxxx:xxxx:xxxx::100/64 scope global ※手動設定
       valid_lft forever preferred_lft forever
    inet6 fe80::nnnn:nnnn:nnnn:nnnn/64 scope link  ※自動構成
       valid_lft forever preferred_lft forever

$ ip -6 route
24xx:xxxx:xxxx:xxxx::/64 dev eth0  proto kernel  metric 256  pref medium
fdxx:xxxx:xxxx:xxxx::/64 dev eth0  proto kernel  metric 256  pref medium
fe80::/64 dev eth0  proto kernel  metric 256  pref medium
default via fe80::rout:er1x:rout:er1x dev eth0  proto ra  metric 1024  expires 8494sec hoplimit 64 pref medium

$ cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
・・・
nameserver 127.0.0.53
search hogeserver.hogeddns.jp

※自動構成のアドレス部分はxxxxとnnnn、router1xでマスクしている。プレフィックスは固定なので隠したかったから。

SLAACによって?LLAが構成され、デフォルトルートとしてそれが設定されている。ルーターの設定画面では明示されていないが、ルーターのインターフェースアドレスと同一だった。

テスト。Ubuntuから外へ。

$ ping6 google.co.jp -I 24xx:xxxx:xxxx:xxxx::100
PING google.co.jp(aaaaaaaa.net) from 24xx:xxxx:xxxx:xxxx::100 : 56 data bytes
64 bytes from aaaaaaaa.net: icmp_seq=1 ttl=52 time=7.13 ms
…

 

Main PC(Windows10)からUbuntuへ。

>ping -6 24xx:xxxx:xxxx:xxxx::100

24xx:xxxx:xxxx:xxxx::100 に ping を送信しています 32 バイトのデータ:
24xx:xxxx:xxxx:xxxx::100 からの応答: 時間 <1ms
24xx:xxxx:xxxx:xxxx::100 からの応答: 時間 <1ms
24xx:xxxx:xxxx:xxxx::100 からの応答: 時間 =1ms
24xx:xxxx:xxxx:xxxx::100 からの応答: 時間 <1ms

24xx:xxxx:xxxx:xxxx::100 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms

 

設定完了。

 

ServerのIPv6ポートを開放

TeraTermを利用してIPv6で接続してみる。ufwでポート開放。

ufwはここに使い方が詳しく書かれている。今回はIPv6関連でヒットしたけど、行選択して削除する方法が具体的に書かれていたりしてとっても良かった。
DigitalOcean / How To Set Up a Firewall with UFW on Ubuntu 18.04

$ sudo ufw allow from any to 24xx:xxxx:xxxx:xxxx::100 port 22 proto tcp
$ sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
…
24xx:xxxx:xxxx:xxxx::100 22/tcp ALLOW       Anywhere (v6)

 

以下を見ながら、接続先として [24xx:xxxx:xxxx:xxxx::100] を入力して接続する。大括弧で囲むのが味噌。OK!
OSDN / Tera Term チケット #16003

気を良くしてWebサービスを開放してみる。

$ sudo ufw allow from any to 24xx:xxxx:xxxx:xxxx::100 port 443 proto tcp

 

以下を見ながら、接続先として https://[24xx:xxxx:xxxx:xxxx::100] を入力して接続する。どうやら、大括弧で囲むのがベーシックなやり方なんだなと理解。
iPentec / URLで IPv6 のIPアドレスを指定して接続する (Windows Tips)

まず、アクセスはできた。できたがWordpressでエラーが発生…でも、これはIPv4アドレスでアクセスしても同じ。ホスト名の設定ファイルしか作っていないのだ。

Neither /etc/wordpress/config-24xx.php nor /etc/wordpress/config-24xx.php could be found. 
Ensure one of them exists, is readable by the webserver and contains the right password/username.

 

一時的に /etc/wordpress/config-hogeserver.hogeddns.jp.php のシンボリックリンクとして /etc/wordpress/config-24xx.php を作ってアクセスしてみたらWordpressは動作するようになった。

根本解決には、DNSサーバーでIPv6な名前解決ができればOKと見た。

 

ServerのDNSでIPv6アドレスを返す

いままで、Serverで稼働している BIND9 はIPv6を気にしていなかった。実際にゾーンファイルを見ても、IPv6のエントリーはない。

BIND9のファイル構成はこんな感じ。

named.conf
  ├ named.conf.options
  ├ named.conf.default-zones ※基本設定で触る必要なしと見た。
  │  ├ db.root          ← zone "." root name server。ココの情報そのまま。ftp://ftp.rs.internic.net/domain/named.root
  │  ├ db.local         ← zone "localhost"        ローカルゾーン。
  │  ├ db.127           ← zone "127.in-addr.arpa" ループバックゾーン。
  │  ├ db.0             ← zone "0.in-addr.arpa"   ループバックゾーン。
  │  └ db.255           ← zone "255.in-addr.arpa" ループバックゾーン。
  └ named.conf.local
      ├ zones.hogeserver ← ゾーンファイルを設定
      └ zones.rfc1918    ← named.conf.localでinclude文がコメント化されている

 

このあたりの情報を参考にしながら再学習。
@IT / 名前解決の仕組みとゾーンファイルの設定

/etc/bind/named.conf.options に以下を追記。これでIPv6の要求を受け付ける。

options {
    directory "/var/cache/bind";

    // あなたと話したいネームサーバーの間にファイアウォールがある場合は、
    // 複数のポートが通信できるようにファイアウォールを修正する必要があります。
    // http://www.kb.cert.org/vuls/id/800113 を参照してください。

    // あなたのISPが安定したネームサーバのために1つ以上のIPアドレスを提供しているなら、
    // あなたはおそらくそれらをフォワーダとして使いたいと思うでしょう。
    // 次のブロックのコメントを外し、all-0のプレースホルダーを置き換えるアドレスを挿入します。

    forwarders {
        172.16.1.1;   # to Router
    };

    //========================================================================
    // BINDが期限切れのルート・キーに関するエラー・メッセージを記録した場合、
    // 鍵を更新する必要があります。 https://www.isc.org/bind-keysを参照してください。
    //========================================================================
    dnssec-validation auto;

    listen-on {
        127.0.0.1;
        172.16.1.100;
    };

    listen-on-v6 {
        ::1;
        fdxx:xxxx:xxxx:xxxx::100;
    };

    auth-nxdomain no;    # conform to RFC1035
};

※追加したのは fdxx~:: だけで、この当時はうまく動いていたが、24~:: も設定しておくべきな気がする。2019/09/01 追記

逆引きゾーンを設定。

/etc/bind/zones.hogeserver に以下を追記。

//DynamicDNS対応
include "/etc/bind/rndc.key";

//正引き
zone "hogeserver.hogeddns.jp" {
    type master;
    file "/var/cache/bind/db.hogeserver.zone";
    allow-update {
        key "rndc-key";
    };
};

//逆引き
zone "16.172.in-addr.arpa" {
    type master;
    file "/var/cache/bind/db.hogeserver.revz";
    allow-update {
        key "rndc-key";
    };
};

//逆引きIPv6
zone "x.x.x.x.x.x.x.x.x.x.x.x.x.x.d.f.ip6.arpa" {
    type master;
    file "/var/cache/bind/db.hogeserver.revz.v6";
    allow-update {
        key "rndc-key";
    };
};

※名前の付け方は以下を参照。
@it / IPv6対応DNSサーバの実現 (1/2)
作業日記 / jail マシンを IPv4 と IPv6 のデュアルスタックにする
UnixPower on Networking / https://www.unix-power.net/networking/centos6-bind-ipv6

/var/cache/bind/db.hogeserver.zone に以下を追記。

$ORIGIN .
$TTL 86400  ; 1 day
hogeserver.hogeddns.jp  IN SOA  dns.hogeserver.hogeddns.jp. (
                 2013183788 ; serial
                 3600       ; refresh (1 hour)
                 600        ; retry (10 minutes)
                 259200     ; expire (3 days)
                 86400      ; minimum (1 day)
                 )
            NS   172.16.1.1.
            NS   172.16.1.100.
            A    172.16.1.100
            AAAA 24xx:xxxx:xxxx:xxxx::100
            MX   10 smtp.hogeserver.hogeddns.jp.
$ORIGIN hogeserver.hogeddns.jp.
hogeserver  A    172.16.1.100
            AAAA 24xx:xxxx:xxxx:xxxx::100
・・・

 

/var/cache/bind/db.hogeserver.revz.v6 を新規作成。

$TTL 86400  ; 1 day
@           IN SOA  dns.hogeserver.hogeddns.jp. (
                2018111111 ; serial
                3600       ; refresh (1 hour)
                600        ; retry (10 minutes)
                259200     ; expire (3 days)
                86400      ; minimum (1 day)
                )
)

            IN NS   router.hogeserver.hogeddns.jp.
0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0 IN  PTR     hogeserver.hogeddns.jp.
0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0 IN  PTR     hogeserver.hogeserver.hogeddns.jp.

 

パーミッションを変更。

$ sudo chown bind:bind /var/cache/bind/db.hogeserver.revz.v6

 

設定を反映させる。

$ sudo systemctl reload bind9

 

Serverの53ポートを開ける。これで各ホストやRouter(1)からの名前解決の問い合わせに答えられる。

$ sudo ufw allow to any port 53 from any

 

正引きの確認。

$ dig -6 hogeserver.hogeddns.jp aaaa

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -6 hogeserver.hogeddns.jp aaaa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7047
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;hogeserver.hogeddns.jp.            IN      AAAA

;; ANSWER SECTION:
hogeserver.hogeddns.jp.     86400   IN      AAAA    xxxx:xxxx:xxxx:xxxx::100

;; AUTHORITY SECTION:
hogeserver.hogeddns.jp.     86400   IN      NS      172.16.1.100.

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sun Nov 18 22:40:47 JST 2018
;; MSG SIZE  rcvd: 124

 

逆引きは以下で確認。

$ dig -x 24xx:xxxx:xxxx:xxxx::100

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -x 24xx:xxxx:xxxx:xxxx::100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18436
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.x.x.x.x.x.x.x.x.x.x.x.x.x.x.4.2.ip6.arpa. IN PTR

;; ANSWER SECTION:
0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.x.x.x.x.x.x.x.x.x.x.x.x.x.x.4.2.ip6.arpa. 86400 IN PTR hogeserver.hogeddns.jp.

;; AUTHORITY SECTION:
x.x.x.x.x.x.x.x.x.x.x.x.x.x.4.2.ip6.arpa. 86400 IN NS router.hogeserver.hogeddns.jp.

;; ADDITIONAL SECTION:
router.hogeserver.hogeddns.jp.   86400   IN      A       172.16.1.100

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 22:26:40 JST 2018
;; MSG SIZE  rcvd: 165

 

ここまで設定ができると、他のホストでIPv6を優先するものは、Serverにアクセスする際にIPv6を利用するようになる。名前解決させるとIPv6のアドレスが返ってくるようになったから。Windows10からpingするだけでも結果がわかる。

ただし、これが成立するのはIPv6アドレスよりもIPv4アドレスのほうが先にLink upした場合だけだった。稀に逆になる場合もあって、この場合には外にあるDNSへ問い合わせに行ってしまう。※再起動してみたら、そんな事になったからわかった。

対策は、Router(1)の設定。
RT-500KI → 詳細設定 → DNS設定 → ローカルドメイン問合せテーブル に以下の情報を入力。

ドメイン名: hogeserver.hogeddns.jp
プライマリDNSサーバアドレス: 24xx:xxxx:xxxx:xxxx::100
セカンダリDNSサーバアドレス: 無指定

 

これでIPv6のDNSが優先されても、IPv6しかない端末からでもRouter(1)がServerにアドレスを聞いてくれるようになり、内向きDNSで名前解決ができるようになった。

 

ServerのDHCPをIPv6対応させる

ここまでの作業でだいぶデュアルスタック感はあるものの、Server以外のホストはDNSにIPv6アドレス登録されていないから、名前解決してもIPv4アドレスしか返ってこない。

逆になぜIPv4のアドレスが返ってくるかというと、ServerがDynamicDNSサービスを提供しているから。DHCPv4がアドレスを振り出すと、それをDNSに登録してくれている。

これと同じことをIPv6についても行えばいい…と思ったが、これが大ごとだった。

まず、現在Ubuntu16.04でインストールされる DHCP Server は4.3.3。このバージョンはデュアルスタックにおけるDDNSの動作に対応していない。4.4からこの機能が実装されている。
そこで、このバージョンをアンインストールして、最新バージョンをソースからコンパイルしてインストールする。こんなところからやるのか…。

ISC DHCP Server 4.4 のインストール

念の為 /etc/dhcp のディレクトリまるごと、及び、/etc/init.d/isc-dhcp-server 、/etc/default/isc-dhcp-server をバックアップする。
※実際には使わずに済んだ。

その上で、以下を実行。

$ wget https://www.isc.org/downloads/file/dhcp-4-4-1/ ← この日のバージョンは4.4.1。ダウンロード。ファイル名がindex.htmlになるからリネームする。
$ sudo apt remove isc-dhcp-server
$ sudo apt autoremove ← 付随するライブラリが不要扱いに…
・・・
以下のパッケージは「削除」されます:
  libirs-export141 libisccfg-export140
・・・

 

インストールは以下を参考に実行。
FreeBSD - System Administration / ISC DHCP IPv4 & IPv6 Server on a Dual-Stack Network

$ mv index.html dhcp-4.4.1.tar.gz
$ tar zxvf dhcp-4.4.1.tar.gz
$ cd dhcp-4.4.1/
$ ./configure
$ make
$ sudo make install

 

IPv4の設定

/etc/default/isc-dhcp-server のパラメータ変更。OPTIONSの設定値が-6になっていて動作しなかったため。

OPTIONS="-4"
INTERFACES="eth0"

 

DHCPv4動作にちょっと変更を加える。ざっくり全部を載せた上で、ポイントになりそうなところだけコメント。結果から見れば変更点は3行だけ。

/etc/dhcp/dhcpd.conf

ddns-update-style interim;
ddns-domainname "hogeserver.hogeddns.jp.";
ddns-rev-domainname "ip6.arpa.";
ddns-dual-stack-mixed-mode true; ← これがデュアルスタック利用フラグ。trueで。
update-conflict-detection false; ← IPv6との競合が必ず発生するからfalseで。
update-static-leases on;
option domain-name "hogeserver.hogeddns.jp";
option domain-name-servers 172.16.1.100;

default-lease-time 86400;
max-lease-time 604800;

lease-file-name "/var/lib/dhcp/dhcpd.leases"; ← ソースからコンパイルしたらデフォルトのディレクトリがない。既存ディレクトリを明示した。

authoritative;

log-facility local7;

#-----------------------------------------
# This is a my network subnet declaration.
#-----------------------------------------
subnet 172.16.0.0 netmask 255.255.0.0 {

    # --- default gateway
    option routers 172.16.1.1;

    # --- WINS server
    option netbios-name-servers 172.16.1.100;

    # --- NTP server
    option ntp-servers 172.16.1.100;

    # --- Lease range setting
    range 172.16.1.40 172.16.1.80;
}

#-----------------------------------------
# Fixed address
#-----------------------------------------
host MainPC {
    hardware ethernet nn:nn:nn:nn:nn:nn;
    fixed-address 172.16.1.2;
}

#-----------------------------------------
# Dynamic DNS settings.
#-----------------------------------------
include "/etc/dhcp/ddns-keys/rndc.key";

zone hogeserver.hogeddns.jp. { ← 最後のドットを忘れない。
    primary localhost;
    key "rndc-key";
}

zone 16.172.in-addr.arpa. {
    primary localhost;
    key "rndc-key";
}

 

DHCPv4サービスを実行。

$ sudo systemctl start isc-dhcp-server
Failed to start isc-dhcp-server.service: Unit isc-dhcp-server.service is masked. ← おっと、マスク…
$ sudo systemctl unmask isc-dhcp-server
$ sudo systemctl start isc-dhcp-server ← 改めて実行
・・・
$ sudo ln -s /usr/local/sbin/dhcpd /usr/sbin/dhcpd ← シンボリックリンクを作成

 

IPv6の設定

DHCPv6のためにサービス実行のためのファイルを作成。

$ sudo cp /etc/init.d/isc-dhcp-server /etc/init.d/isc-dhcp-server6
$ sudo cp /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server6

 

編集。

/etc/init.d/isc-dhcp-server6 は以下の3行に赤文字を追加。

DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp-server6}"
DHCPD_CONF=${DHCPD_CONF:-/etc/dhcp/dhcpd6.conf}
DHCPD_PID="${DHCPD_PID:-/var/run/dhcpdi6.pid}"

 

/etc/default/isc-dhcp-server6 は以下を4から6に変更。

OPTIONS="-6"

 

動作設定。
/etc/dhcp/dhcpd6.conf

ddns-update-style interim;
ddns-domainname "hogeserver.hogeddns.jp.";
ddns-rev-domainname "ip6.arpa.";
ddns-dual-stack-mixed-mode true; ← これがデュアルスタック利用フラグ。trueで。
update-conflict-detection false; ← IPv4との競合が必ず発生するからfalseで。 
update-static-leases on; 
allow client-updates;    ← 意味ないかも。色々いじった最後に残ってた…
do-forward-updates true; ← 同上

option domain-name "hogeserver.hogeddns.jp"; 
option dhcp6.name-servers fdxx:xxxx:xxxx:xxxx::100;

default-lease-time 86400;
max-lease-time 604800;

lease-file-name "/var/lib/dhcp/dhcpd6.leases"; ← ソースからコンパイルしたらデフォルトのディレクトリがない。既存ディレクトリを明示した。 

authoritative;
log-facility local6; ← 動作確認のために分けた。困っていない人は7のままでも大丈夫。

#-----------------------------------------
# This is a my network subnet declaration.
#-----------------------------------------
subnet6 fdxx:xxxx:xxxx:xxxx::/64 {
    range6 fdxx:xxxx:xxxx:xxxx::1:1 fdxx:xxxx:xxxx:xxxx::1:1000;

    option dhcp6.domain-search "hogeserver.hogeddns.jp";
}

#-----------------------------------------
# Fixed address
#-----------------------------------------
host MainPC {
#   hardware ethernet xx:xx:xx:xx:xx:xx;
    host-identifier option dhcp6.client-id xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx; ← IPv6の場合はDUIDの値を使う 2022/04/10追記
fixed-address6 fdxx:xxxx:xxxx:xxxx::2; } #----------------------------------------- # Dynamic DNS Settings. #----------------------------------------- include "/etc/dhcp/ddns-keys/rndc.key"; zone hogeserver.hogeddns.jp. { primary6 ::1; key "rndc-key"; } zone x.x.x.x.x.x.x.x.x.x.x.x.x.x.d.f.ip6.arpa. { ← 名前の付け方はDNSのところで書いた primary6 ::1; key "rndc-key"; }

 

IPv6の場合、IPアドレスの払い出しにはDUIDが使われるので、固定アドレスを割り当てたい場合にはdhcp6.client-idでそれを指定する。
WindowsではIPCONFIG /ALLで取り出せる。2022/04/10追記

v4とv6でログの出力先を分け、ちゃんと動作するまで見守りたい。
/etc/rsyslog.d/isc-dhcp-server.conf をGithub / DHCP Server Configuration を参考にして作成。

# Logging for DHCP server
local7.*       /var/log/dhcpdv4.log
local6.*       /var/log/dhcpdv6.log ← こなれてくるまで…とログを分けた。

 

rsyslogサービスを再起動。

$ sudo systemctl restart rsyslog

 

DHCPv6サービスを登録し、leasesファイルを作ってサービスを開始。

$ sudo systemctl daemon-reload
$ sudo touch dhcpd6.leases
$ sudo systemctl start isc-dhcp-server6

 

さて、DHCPv6はポート547で動作する。そこで、以下の通りポートを開放する。

$ sudo ufw allow to any proto udp port 547 from any
ルールを追加しました
ルールを追加しました (v6)

 

見ての通り、v6だけでなくv4も開放してしまったので、v4部分を削除する。

$ sudo ufw status    ← 一覧を表示させる
$ sudo ufw delete 18 ← v4部分が何番目か…でその数字を入れる。今回は18だった。

 

ufwでv6だけを操作するためには、proto ipv6 と書くか、from または to にIPv6のアドレスを書けばよいのだけれど、このルールはどのアドレスに対しても実行していいと思ったので、上記の通り足してからIPv4だけを削除することにした。

 

ということで完了。あれ?こうやって書いて整理してみると全然大ごとじゃなくてサクサク感があるな…。

 

ServerでRAを返す

現在、Serverを含めたLAN内のIPv6を有効にしたホストは、RAの情報に基づいてIPv6アドレスを自動構成している。しかし、RouterのDHCPv4を無効にしているからか(?)、RouterはDHCPv6アドレスを振り出していない。

このIPv6アドレスを自動構成するもととなったRAが何なのかを確認するため、テスト用にUbuntu18.04デスクトップ版をVMware Playerで立ち上げてみた。

付けたコメントは以下のサイトから転載している。
ITmedia エンタープライズ / SolarisからIPv6ルーターのようにRAを配信する
UnixPower on Networking / CentOS6 ISC-DHCP ( DHCPv6 )
ネットワークエンジニアとして / IPv6 addressing - Stateless / Statefull / DHCPv6

$ sudo apt install radvdump
$ sudo radvdump ens33
#
# radvd configuration generated by radvdump 2.16
# based on Router Advertisement from fe80::rout:er1x:rout:er1x ← Router(1)のLLAから送出
# received by interface ens33
#

interface ens33
{
	AdvSendAdvert on;            ← 周期的にルーター広告を送信し、ルーター要請にも応じる
	# Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump
	AdvManagedFlag off;          ← Mフラグ: RAを受信したホストが、RA以外の方法(DHCPv6など)によって自動的にアドレスを設定されることを許可するかどうか。許可しない。
	AdvOtherConfigFlag on;       ← Oフラグ: RAを受信したホストが、RA以外の方法によってアドレス以外の情報を自動的に設定されることを許可するかどうか。許可する。
	AdvReachableTime 0;          ← RAを受信したホストが持つ、隣接するIPv6ノードへの到達性の有効期間(ミリ秒)。無指定。
	AdvRetransTimer 0;           ← RAを受信したホストがリンク層アドレス(MACアドレス)の問い合わせを行うメッセージを送信する時間。未指定。
	AdvCurHopLimit 64;           ← RAを受信したホストのHop Limit値を指定する設定値。64。
	AdvDefaultLifetime 9000;     ← RAを受信したホストがRAの送信元をデフォルトゲートウェイとして使用可能な有効期間。2時間半。
	AdvHomeAgentFlag off;        ← RAを送信するルーターがIPv6ホームエージェントかどうか示す。機能しない。
	AdvDefaultPreference medium; ← RAを送信するルーターの優先度。中。
	AdvSourceLLAddress on;       ← RAを送信するときにローカルリンクアドレスを含める

	prefix 24xx:xxxx:xxxx:xxxx::/64     ← サブネットプレフィックス(先頭64ビット)を表しているらしい
	{
		AdvValidLifetime 14400;     ← RAを受信したホストが、配信されたプレフィックスをIPv6アドレスの自動生成に使用できる期間。4時間。
		AdvPreferredLifetime 12600; ← RAを受信したホストが、配信されたプレフィックスをIPv6アドレスの自動生成に使用することが推奨される期間。3時間半。
		AdvOnLink on;               ← RAで配信されるプレフィックスが同一リンク上に存在するかどうか。存在する。
		AdvAutonomous on;           ← RAを受信したホストが、IPv6アドレスを自動生成するために配信されたプレフィックス情報を使用できるかどうか。使用できる。
		AdvRouterAddr off;          ← プレフィックスの代わりにインターフェースアドレスを送る指示(モバイルIPv6で利用)。しない。
	}; # End of prefix definition

}; # End of interface definition
^C

※テスト用のUbuntu18.04で実行。

このRAだと、IPv6アドレスとゲートウェイはRAに基づいて自動構成し、DNS等の他の情報はDHCPv6から受け取る事になっている。

これを参考にしつつ Server で DHCPv6 を参照するようなRAを返すようにする。
いますぐ実践! Linux システム管理 / Vol.194

$ sudo apt install radvd

 

このサービスを動かすために設定ファイルを作成。インストール時に作られないため、自分で作る。

/etc/radvd.conf

#
# myhome settings
#

interface eth0
{
    AdvSendAdvert           on;

    AdvManagedFlag          on;
    AdvOtherConfigFlag      on;

    AdvDefaultPreference    low;

    prefix prefix fdxx:xxxx:xxxx:xxxx::/64
    {
        AdvAutonomous       off;
    };

};

 

RS(Router Solicitation/ルーター要請)とRA(Router Advertisement/ルーター広告)はICMPv6で送受信される。
ネットワークエンジニアとして / IPv6 - ICMPv6

ufwでポート開放の設定しなきゃ…と思ったけど、pingが飛んでるし、RSも受け取っている風に見えた。後からenableにしたりdisableにしたりして試したけど、動作に変わりなし。よって、ブロックはしていないと判断(これでいいのか?)。閉じている場合は、以下を参考にしながら開ける感じかな。
ubuntu forums / syslog full of UFW BLOCK PROTO=ICMPv6

ということで、サービス開始。

$ sudo systemctl start radvd ← 動いていないなら start 。動いていたら restart で。

 

テスト環境から配布内容を確認。

 

配布する情報の内容はこれで確認できる。
配布されているパケットを解析するらしく、表示されるまで時間がかかることも。

$ sudo radvdump ens33
#
# radvd configuration generated by radvdump 2.11
# based on Router Advertisement from fe80::serv:erse:rver:serv
# received by interface ens33
#

interface eth0
{
        AdvSendAdvert on;
        # Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump
        AdvManagedFlag on;     ← Mフラグ : アドレスを管理プロトコルで構成
        AdvOtherConfigFlag on; ← Oフラグ : 他の情報を管理プロトコルで構成
        AdvReachableTime 0;    ← 隣接ノードに可能な時間(ms)
        AdvRetransTimer 0;     ← 再送されたルーター要請が到達する時間(ms)
        AdvCurHopLimit 64;
        AdvDefaultLifetime 1800;
        AdvHomeAgentFlag off;
        AdvDefaultPreference medium;
        AdvSourceLLAddress on;

        prefix fdxx:xxxx:xxxx:xxxx::/64
        {
                AdvValidLifetime 86400;
                AdvPreferredLifetime 14400;
                AdvOnLink on;
                AdvAutonomous off; ← このプレフィックスは自動構成に利用できない
                AdvRouterAddr off;
        }; # End of prefix definition

}; # End of interface definition

 

狙い通りのRAが飛んでる。

2019/09/01 追記
サーバーが再起動すると radvd が起動してこない。どうやらサービスの有効化ができていない模様。

$ sudo systemctl enable radvd
Synchronizing state of radvd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable radvd
↑ 有効化に失敗、こうやってね!と書かれているので、そのまま実行。
$ sudo /lib/systemd/systemd-sysv-install enable radvd
$ sudo reboot

$ systemctl status radvd
● radvd.service - Router advertisement daemon for IPv6
Loaded: loaded (/lib/systemd/system/radvd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-09-01 08:22:36 JST; 53s ago
Docs: man:radvd(8)
Process: 1149 ExecStart=/usr/sbin/radvd --logmethod stderr_clean (code=exited, status=0/SUCCESS)
Process: 947 ExecStartPre=/usr/sbin/radvd --logmethod stderr_clean --configtest (code=exited, status=0/SUCCESS)
Main PID: 1170 (radvd)
Tasks: 2 (limit: 505)
CGroup: /system.slice/radvd.service
tq1170 /usr/sbin/radvd --logmethod stderr_clean
mq1171 /usr/sbin/radvd --logmethod stderr_clean

 

再起動後も起動するようになった。

 

 

使ってみる

Windows、UbuntuからネットワークをON/OFFしたりなんかしてリース状況を確認しようと思ったが、isc-dhcp-serverがDNSを更新に行くタイミングがわからない。端末を再起動しても全然更新に行かない。変だなーと思ったら、renewの仕方が違った。

WIndowsでは以下。
VAIO / [Windows 10] IPアドレスを解放/再取得する方法

> ipconfig /renew  ← IPv4のアドレス再取得
> ipconfig /renew6 ← IPv6のアドレス再取得
> ipconfig /all
イーサネット アダプター ローカル エリア接続:

   接続固有の DNS サフィックス . . . . .: hogeserver.hogeddns.jp
   説明. . . . . . . . . . . . . . . . .: Realtek PCIe GbE Family Controller
   物理アドレス. . . . . . . . . . . . .: xx-xx-xx-xx-xx-xx
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   IPv6 アドレス . . . . . . . . . . . .: 24xx:xxxx:xxxx:xxxx:nnnn:nnnn:nnnn:nnnn(優先)
   IPv6 アドレス . . . . . . . . . . . .: fdxx:xxxx:xxxx:xxxx::2(優先)
・・・
   DNS サーバー. . . . . . . . . . . . .: fdxx:xxxx:xxxx:xxxx::100
                                          172.16.1.100
・・・ 

 

Ubuntuでは以下。
LinuxQuestions.org / commands to request and release of an IPv6 address from a dhcp server
Linux Fan / Ubuntuで「ネームサーバー」の設定を確認する方法

$ sudo dhclient -4 -r ens33 ; sudo dhclient -4 ens33
$ sudo dhclient -6 -r ens33 ; sudo dhclient -6 ens33
$ systemd-resolve --status
Global
          DNSSEC NTA: 10.in-addr.arpa
・・・
Link 2 (ens33)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 172.16.1.100
                      fdxx:xxxx:xxxx:xxxx::100
          DNS Domain: hogeserver.hogeddns.jp

※表示順序にかかわらず、先にリンクアップした方のDNSを先に参照する模様。
※いつの間にかDNS「flets-east.jp / iptvf.jp」が出なくなった。コンパイル後のインストールでなにか失敗しているのかもしれない。

リース状況を確認。
/var/lib/dhcp/dhcpd6.leases

・・・
ia-na "\xxxxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxxxx\xxx\xxx\xxx\xxx" {
  cltt 0 2018/11/25 03:14:57;
  iaaddr fdxx:xxxx:xxxx:xxxx::1:d00 {
    binding state active;
    preferred-life 54000;
    max-life 86400;
    ends 1 2018/11/26 03:14:57;
    set ddns-fwd-name = "MainPC.hogeserver.hogeddns.jp.";
    set ddns-txt = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    set ddns-rev-name = "0.0.d.0.1.0.0.0.0.0.0.0.0.0.0.0.x.x.x.x.x.x.x.x.x.x.x.x.x.x.d.f.ip6.arpa.";
  }
}

ia-na "\xxx\xxx\xxxx\xxx\xxx\xxx\xxxx\xxx\xxx\xxx\xxx\xxxx\xxx\xxx\xxx" {
  cltt 0 2018/11/25 03:24:02;
  iaaddr fdxx:xxxx:xxxx:xxxx::1:947 {
    binding state active;
    preferred-life 7200;
    max-life 86400;
    ends 1 2018/11/26 03:24:02;
  }
}
・・・

 

ちゃんとホスト名が書き出されているのがWindows10の方で、ホスト名が書き出されていないのがUbuntuの方。

で、DNSへの反映状況を確認。

$ sudo rndc sync

 

/var/cache/bind/db.hogeserver.zone

・・・
MainPC                  A       172.16.1.2
                        TXT     "02b5xxxxxxxxxxxxxxxxxxxxxxxxxxxx07"
                        AAAA    fdxx:xxxx:xxxx:xxxx::2
temp                    A       172.16.1.11
                        TXT     "02e7xxxxxxxxxxxxxxxxxxxxxxxxxxxx47"
                        AAAA    fdxx:xxxx:xxxx:xxxx::1:947
・・・

 

しっかりと反映してる。

ただ、テストの最中、Ubuntuの側は何度やってもDNSに反映されなかった。
時間をおいてから再起動してIPアドレスを取ってみたら反映されているという…

ただね、もう調査に疲れたよパトラッシュ。もう動いてるからカンベンしてちょ!

 

若干気になる部分はあるものの、完成。

 

2022/04/10追記
デュアルブート環境で、WindowsとUbuntuを動かしているのだが、Ubuntuでも同じIPアドレスが使いたい。
この場合、Windowsで取り出したDUIDの値をNetworkManagerの設定ファイルに書き込めば良かった。

/etc/NetworkManager/system-connections/有線接続\ 1.nmconnection

<省略>
[ipv6]addr-gen-mode=stable-privacy
dns-search=
method=auto
dhcp-duid=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
<省略>

 

このあと、PCを再起動したところ、無事に固定IPアドレスが払い出された。

 

やったこと

色々とやったのでメモ。

IPv6のルーティングテーブルを確認

IPv6のルーティングテーブル確認方法。
いつか、そのとき、あの場所で。 / [Linux][IPv6] IPv6でのルーティングテーブルの確認コマンド。
Linux IPv6 HOWTO (en) / 7.1. Displaying existing IPv6 routes

$ route -n6
$ ip -6 route

 

IPv6でルーティングされない

IPv6でインターネットに向けてサービスを提供しようと考えた時、IPv6の固定IPアドレスを振りたいと考えた。だけど、IPアドレスの自動構成を止め、手動で扱いやすい番号を振ってみたものの、インターネット側にpingが通らない。

$ ping6 google.co.jp
connect: Network is unreachable

 

で、ルーティングテーブルを調べてみた。IPv6アドレスを自動構成させると以下の通りとなる。
完全手動で設定したときには黄色の行がない。

$ ip -6 route
24xx:xxxx:xxxx:xxxx::100 dev eth0  proto kernel  metric 256  pref medium
24xx:xxxx:xxxx:xxxx::/64 dev eth0  proto kernel  metric 256  expires 14328sec pref medium
fc00::/64 dev eth0  proto kernel  metric 256  pref medium
fe80::/64 dev eth0  proto kernel  metric 256  pref medium
default via fe80::xxxx:xxxx:xxxx:xxxx dev eth0  proto ra  metric 1024  expires 8928sec hoplimit 64 pref medium

 

fe80::xxxx:xxxx:xxxx:xxxx は、Router(1)に払い出されているIPv6アドレスの下64ビットが書かれている。Router(1)を再起動したら変わってしまうかもしれない番号だ(と思われる)。

ということから、IPv6アドレスは自動構成のものも作ることとした。
そもそもIPv6は1つのNICが複数のIPアドレスを持つ前提(グローバルアドレスとローカルリンクアドレスとか)だから、大した問題にはならない想定。

実際に手動設定したIPv6アドレスからpingが飛ぶのか確認した。

$ ping6 google.co.jp -I 24xx:xxxx:xxxx:xxxx::100
PING google.co.jp(aaaaaaaa.net) from 24xx:xxxx:xxxx:xxxx::100 : 56 data bytes
64 bytes from aaaaaaaa.net: icmp_seq=1 ttl=52 time=7.13 ms
…

 

よし、飛んでる、大丈夫!

ちなみにルートを追加する場合は以下。サーバーのmetricは256が基本になっているようだったから、ルートを追加するときにも256を指定してみた(未指定だと1000になる)。ま、これだけじゃインターネットには出られないが、将来完全にmanualな設定をする場合に備えてメモメモ。

$ sudo ip -6 route add 24xx:xxxx:xxxx:xxxx::/64 dev eth0 metric 256

 

NICの再起動

/etc/network/interface をいじってもうまく反映されないことがあって、(2)から継続して検索してみたところ、以下を発見した。
SERVER FAULT / “RTNETLINK answers: File exists” /etc/network/interfaces Does'nt contain 2 gateways, so what's wrong?

$ sudo ifdown eth0 && sudo ifup eth0

 

IPアドレスがうまく変わらないといった問題はこれで回避できた。

NICの再起動で発生するエラーへの対処

/etc/network/interface に以下のように固定IPを入れたところ、ifdownコマンドで怒られる。

auto eth0
・・・
iface eth0 inet6 auto
 post-up  ip -6 addr add 24xx:xxxx:xxxx:xxxx::100/128 dev $IFACE
 pre-down ip -6 addr del 24xx:xxxx:xxxx:xxxx::100/128 dev $IFACE
 post-up  ip -6 addr add fc00::100/64 dev $IFACE
 pre-down ip -6 addr del fc00::100/64 dev $IFACE
 post-up  ip -6 addr add fe80::100/64 dev $IFACE
 pre-down ip -6 addr del fe80::100/64 dev $IFACE

 

実行結果はこれ。

$ sudo ifdown eth0 && sudo ifup eth0
RTNETLINK answers: Cannot assign requested address
RTNETLINK answers: Cannot assign requested address
RTNETLINK answers: Cannot assign requested address

 

ifdown時にIPv6アドレスを削除しなきゃいけないと思っていたが、削除しなくても結果は同じだったので消しちゃった。

auto eth0
・・・
iface eth0 inet6 auto
 post-up  ip -6 addr add 24xx:xxxx:xxxx:xxxx::100/128 dev $IFACE
#pre-down ip -6 addr del 24xx:xxxx:xxxx:xxxx::100/128 dev $IFACE
 post-up  ip -6 addr add fc00::100/64 dev $IFACE
#pre-down ip -6 addr del fc00::100/64 dev $IFACE
 post-up  ip -6 addr add fe80::100/64 dev $IFACE
#pre-down ip -6 addr del fe80::100/64 dev $IFACE

 

RTNETLINK answers: File exists の解消

/etc/network/interface のファイルをいじってIPアドレスを変えたりしたとき以下のエラーが発生する。

11月 17 17:40:03 hogeserver ifup[6796]: RTNETLINK answers: File exists
11月 17 17:40:03 hogeserver ifup[6796]: Failed to bring up eth0:1.

 

こちらの情報で対策。
R42日記 / "RTNETLINK answers: File exists"を解消する

$ sudo ip addr flush dev eth0

 

で、根本原因はこれ。コメント化して解消。まぁ、いらない設定ではあった。
/etc/network/interface

auto eth0:1
iface eth0:1 inet static
address 172.16.1.100
netmask 255.255.0.0
#gateway 172.16.2.1
#dns-nameservers 127.0.0.1

 

Ubuntu18.04でロックしない・省電力しない設定

テスト用にVMware PlayerでUbuntu18.04デスクトップを構築した。で、ちょっと放って置くとすぐに画面がロックされてしまう。

設定は2箇所。

設定 → プライバシー → 画面ロック でロックしないようにする。
設定 → 電源 → 省電力 → ブランクスクリーン で「しない」を選択。New!

どこに行っても1つ目は書かれているんだけど、2つ目もやっておかないと画面が暗くなってしまう。復帰時には画面を上にスライドする必要があり(エンターキーでも行けるけど)、いちいち面倒くさいので設定した。

インストール済みのコマンドが含まれるパッケージを調べる

記事を書いている上で、radvdumpコマンドがどのパッケージに含まれているのかを確認したくなった。既にインストールされちゃってたりするので、インストール済みのパッケージから調べたかった。
それマグで! / あるコマンドが含まれるパッケージを探す。apt-file/dpkg

$ dpkg -S $(which radvdump)
radvd: /usr/sbin/radvdump

 

apt-fileをよく見かけるが、既にインストールされているパッケージを探すならこの方がいいように思った。apt-fileパッケージを入れなくて済むし。

ゾーンファイルの凍結・融解(freeze/thaw)

良い機会なので、ゾーンファイルを整理した。
基本的にはDHCPでIPアドレスを振り出しているのだから、固定なIPのものだけを書き出しておけば、いずれ(具体的には1日)で整理されるはずだ。

チェック方法はココで教えてくれた。
お便利サーバー.com / 設定ファイルの書式チェックコマンドについて

$ named-checkzone hogeserver.hogeddns.jp /var/cache/bind/db.hogeserver.zone

※ゾーン名とゾーンファイルを指定して実行。

そして、DDNS環境において、直接ゾーンファイルを編集するためにはBINDを止めなければならない。止めないで作業するにはコマンドを用いる(DHCPがやっていることと同じようにkeyを使って更新)。
Qoosky / BIND 9 ゾーンファイル Dynamic Update の設定方法
人力検索はてな / bindのjnlファイル(Journalファイル)をゾーンファイルに反映させて、クリア(削除)する方法を探しています。

$ nsupdate -k /etc/dhcp/ddns-keys/rndc.key
> update add temp.hogeserver.hogeddns.jp 3600 A 172.16.1.11
> ← これで更新がかかる(sendの省略形?)
> update delete temp.hogeserver.hogeddns.jp A
>
> update delete temp.hogeserver.hogeddns.jp AAAA
>
> update delete temp.hogeserver.hogeddns.jp txt
>

※keyファイルにアクセスできる権限が必要。

だが、利用者も少ない中、コマンドによる更新は手間がかかるばっかりで面倒と思った。
色々とやっている中で更新時に発生するエラーがあって、それを検索したら自分の過去記事が出てきた。
Ubuntu 14.04 ログに出ているエラーへの対処メモ

$ sudo rndc sync; sudo rndc freeze ← キャッシュをファイルに吐き出して更新を止める
この間にファイルを更新。

$ sudo rndc thaw ← 更新を再開

 

LLMNR ※未解決

Windows10で ipconfig /renew6 をすると、ものずごく時間がかかる。
しかし、サーバーで見ているとWindows10へのアドレスの振り出しはさっさと終わっていて、DNSにも反映されてる…。

>ipconfig /renew6

Windows IP 構成

インターフェイス VMware Network Adapter VMnet1 の更新中にエラーが発生しました:  セマフォがタイムアウトしました。

インターフェイス VMware Network Adapter VMnet8 の更新中にエラーが発生しました:  セマフォがタイムアウトしました。

 

サーバーを見たらこんなログが出ていた。

Nov 25 15:48:41 hogeserver kernel: [14539.006818] [UFW BLOCK] IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=fe80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx DST=ff02:0000:0000:0000:0000:0000:0001:0003 LEN=81 TC=0 HOPLIMIT=1 FLOWLBL=1017758 PROTO=UDP SPT=60594 DPT=5355 LEN=41

 

これは、LLMNR(Link-Local Multicast Name Resolution)という名前解決の方法らしい。
@IT / 第6回 LLMNRを使ったローカル・セグメント上での名前解決

ウチの中にはこんなIPアドレスの解決方法は用意していない。DNSがあるからいらないっしょ。VMware Player をバージョンアップしないで使い続けているからこんなことになるのかな、と調べることも諦めた。

DHCPv6設定 ※未解決

設定で試行錯誤しているとき、DHCPv6からどうしてもIPアドレスが振り出されずに困った。
いつか、そのとき、あの場所で。 / [Windows10][ #ipv6 ][ #ipv6study] やっぱりDHCPv6ステートレスモードでDNSサーバ情報が受け取れなくなったけど解決した
※リンク切れ…残念 2019/09/01 追記
※移転先を発見!再度リンク 2020/10/04 追記

もう、この問題発生から1週間以上が経過…これで問題が解決したのか、設定を修正したら解決したのかが思い出せないけれど、転ばぬ先の杖としてメモ。

 

さいごに

長かった~。UbuntuでもまだデュアルスタックでDDNSな環境を作るのにはこんなに時間がかかるのね。知識が足りないのは否定しないが、問題にぶち当たってからしか情報が得られないのはもしかしたら自宅サーバー運営開始以来はじめてのことだったかもしれない。

で、IPv6について色々と調べて思ったことは、IPv6でアクセスできるサイトはまだまだ少ないんだなーということ。ほとんどIPv6対応していないといっても過言ではない感じ。

実は当初、インターネットに向けてIPv6でサービス公開することを目指していた。しかし、いざ、テストしてみようと思ったら「IPv6でインターネットから自宅に向けてアクセスする」方法がなかったのて諦めるしかなかった。

こう書きながら思ったことは「IPv6化はなかなか進まないだろうな」ということ。苦労しても実りが少なすぎる…。その点でv6プラスサービスはIPv4でのアクセスが飛躍的に早くなる上に、意識しなくてもIPv6対応機器を持っていればIPv6アクセスもできるから、IPv6の普及を促進するんだろうなと思った。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他