スキップしてメイン コンテンツに移動

tagged vlan を設定し dhcpv6 クライアントを特定せずに kea dhcpv6 でvlan毎に固定のdhcpv6 pd を行う

フレッツ光の場合、宅内のルータが何であれ、半固定のプレフィックスが降りてきます。一見なんの変哲もないように思えますが、よく考えてみるとDHCPv6クライアントとしてのルータのhw-addressやduidが異なっても同じプレフィックスが降りてくるのは不思議だなと思いました。
フレッツ光(クロス含む)で使われている光回線では、局側に10G-EPONという装置が導入されており、1PON(Passive Optical Network)あたり最大(おそらく4x8=)32分岐で各加入者宅ONUと通信します。つまり、1PONあたり32ユーザで回線を共有しているわけですが、10G-EPON <--> ONU ではONUに半固定のプレフィックスが降りてきます。回線共有しているのにセグメントの異なる半固定のプレフックスが降りてくるというのは、やはり不思議です(そう思うのは筆者だけかもしれませんが。)おそらくは、回線は共有していても、PON<-->ONU間は専用線のイメージに近いのだろうと思います。そこでしらべたところ、以下の資料が見つかりました。
EPONおよび10G-EPONの概要
(引用以下)
EPONダウンストリーム通信の原理
EPONはダウンストリーム方向にブロードキャストモードを採用しています。 すべてのONUは同じデータを受信できます。異なるONUデータはLLID(論理リンク識別子)によって区別され、ONUはブロードキャストメッセージをフィルタリングして独自のデータを受信します。
異なるONUデータはLLID(論理リンク識別子)によって区別され、ONUはブロードキャストメッセージをフィルタリングして独自のデータを受信します。

EPONアップストリーム通信の原理
ONUからOLTへのアップストリーム方向では、時分割多元接続技術(TDMA)を適用して、タイムスロットでアップストリームトラフィックを送信します。
(引用以上)
凡そですが、ビンゴです。イメージとしては1PONあたり最大32セグメントを下りではLLIDを使って"マルチプレクス”して、ONUで"デマルチプレクス"するという感じだと思います。つまり、回線は共有しているがPON仮想1ポート<-->1ONU間は専用線のイメージに近く、PON側では1ポートを1ネットワークインターフェースとしてみなしているはずだということは分かりました。
前置きが長くなりましたが、なぜこのような話を前振りしたのかというと、以下の様に親ルータから子ルータに子ルータのHW/DUIDを問わずにkea-dhcp6-serverで固定のプレフィックスを割り当てたかったからです。
テストはHyper-vで行っているのですが、(仮想)物理配線としては、親ルータR20から子ルータ群21-24へはハブを介して共有接続しています。このため、このままだと子ルータにそれぞれ固定のプレフィックスを割り当てたい場合はduidなりhw-addressなりで割り当て予約をする必要がありますが、表題の意図には沿いません。また、実機で構成する場合を考慮し、親ルータにNICを増設して専用線の状態にするのはコスト的に問題があります。そこで表題の通り、R20-R21, R20-R22, R20-R23, R20-R24 間でそれぞれtagged vlanを設定して、セグメントを分けることにしました。これでようやくわかっていただけたと思いますが、前振りとおなじく、親ルータ子ルータ間は共有ネットワークを使うがtagged vlanをつかっているので専用線のイメージに近いということです。(なお、後述しますが仮想物理ポートを増設し専用線として構成する方法でも行けました。)
仮想物理配線とセグメント分けはこれでOKなんですが、問題が残っています。それが表題の様に”dhcpv6 クライアントを特定せずに kea dhcpv6 でvlan毎に固定のdhcpv6 pd を行う”にはどうすればよいかです。
これは、説明するよりも実際の設定を見てもらう方が話が早いので、以下にkea-dhcp6.confの設定を抜粋しておきます。
// 前略
    "interfaces-config": {
        "interfaces": [ "eth1.21", "eth1.22", "eth1.23", "eth1.24" ],
        "service-sockets-max-retries": 5,
        "service-sockets-retry-wait-time": 10
    },
// 中略
      "subnet6": [
        {
            "id": 21,
            "subnet": "2111:2222:3333::21/128",
            "interface": "eth1.21",
            "pools": [ { "pool": "2111:2222:3333::21/128" } ],
            "pd-pools": [ { "prefix": "2111:2222:3333:1000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        },
        {
            "id": 22,
            "subnet": "2111:2222:3333::22/128",
            "interface": "eth1.22",
            "pools": [ { "pool": "2111:2222:3333::22/128" } ],
            "pd-pools": [ { "prefix": "2111:2222:3333:2000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        },
        {
            "id": 23,
            "subnet": "2111:2222:3333::23/128",
            "interface": "eth1.23",
            "pools": [ { "pool": "2111:2222:3333::23/128" } ],
            "pd-pools": [ { "prefix": "2111:2222:3333:3000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        },
        {
            "id": 24,
            "subnet": "2111:2222:3333::24/128",
            "interface": "eth1.24",
            "pools": [ { "pool": "2111:2222:3333::24/128" } ],
            "pd-pools": [ { "prefix": "2111:2222:3333:4000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        }
    ],
// 後略
つまり、subnetもpoolsも/128の"点"でリースし、pd-poolsもprefix-len52かつdelegated-len52の指定で"1PDのみ"リースしているという事です。かなり強引で美しくないのですが、所要の目的は達成できてはいます。なお、親ルータR20の/etc/radvd.confは以下の通りです。
interface eth1.21 {
  AdvSendAdvert on;
  AdvManagedFlag on;
  AdvOtherConfigFlag on;
  AdvReachableTime 300000;
  AdvRetransTimer 10000;
  AdvCurHopLimit 64;
  AdvDefaultLifetime 1800;
  AdvHomeAgentFlag off;
  AdvDefaultPreference medium;
  AdvSourceLLAddress on;
  AdvLinkMTU 1500;
};
# 後略
子ルータR21の/etc/dhcpcd.confは以下の通りです。
duid ll
noipv6rs
noipv4ll

denyinterfaces eth0 eth1

option domain_name_servers, domain_search

interface eth0.21
  static ip_address=10.1.21.2/24
  ipv6rs
  ipv6ra_noautoconf
  ia_pd 0/::/52 eth1/0/52
子ルータR21での $ ip a の結果は以下の通りです。(注:まだeth1以下のIPv4設定などは入れていません。)
1: lo:  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 noprefixroute
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:11:22:33:44:0d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::211:22ff:fe33:440d/64 scope link
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:11:22:33:44:6d brd ff:ff:ff:ff:ff:ff
    inet6 2111:2222:3333:1000::1/52 scope global dynamic noprefixroute
       valid_lft 3340sec preferred_lft 2340sec
    inet6 fe80::211:22ff:fe33:446d/64 scope link
       valid_lft forever preferred_lft forever
4: eth0.21@eth0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:11:22:33:44:0d brd ff:ff:ff:ff:ff:ff
    inet 10.1.21.2/24 brd 10.1.21.255 scope global noprefixroute eth0.21
       valid_lft forever preferred_lft forever
    inet6 fe80::211:22ff:fe33:440d/64 scope link
       valid_lft forever preferred_lft forever
子ルータR21の/etc/network/interfaces.d以下はこのようにしました。
user1000@r21:/root$ cat /etc/network/interfaces.d/eth0
auto eth0
iface eth0 inet manual

user1000@r21:/root$ cat /etc/network/interfaces.d/eth1
auto eth1
iface eth1 inet manual

user1000@r21:/root$ cat /etc/network/interfaces.d/eth0.21
auto eth0.21
iface eth0.21 inet manual
子ルータのkea-dhcp4/6の設定や親・子ルータの/etc/frr/frr.confなどは割愛しますが、tagged vlanを使うと親ルータのNICは、共有ネットワークではあるがvlanを切っているので1ポートで済むという事です。なお、tagged vlanを設定する前に(仮想)物理NICでセグメントを分けた場合も所望の動作を確認はしていますので、お好きなほうでいいとは思います。その場合は、ほぼ同じですが/etc/kea/kea-dhcp6.confは以下の様になります。(抜粋、eth26とeth27が専用インターフェース)
// 前略
"interfaces": [ "eth1", "eth1.21", "eth1.22", "eth1.23", "eth1.24", "eth1.25", "eth26", "eth27" ],
// 中略
        {
            "id": 26,
            "subnet": "2001:470:f104::26/128",
            "interface": "eth26",
            "pools": [ { "pool": "2001:470:f104::26/128" } ],
            "pd-pools": [ { "prefix": "2001:470:f104:6000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        },
        {
            "id": 27,
            "subnet": "2001:470:f104::27/128",
            "interface": "eth27",
            "pools": [ { "pool": "2001:470:f104::27/128" } ],
            "pd-pools": [ { "prefix": "2001:470:f104:6000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        }
なお、子ルータはDebian12ベースのものとOpenWRTでテストし、共にPrefixの取得が出来ました。参考までにOpenWRT(R25vlan接続とR27専用接続)のip aを掲載しておきます。
R25:vlan 接続
BusyBox v1.36.1 (2024-03-22 22:09:42 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 23.05.3, r23809-234f1a2efa
 -----------------------------------------------------
root@R25:~# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 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: eth0:  mtu 1500 qdisc mq master br-lan state UP qlen 1000
    link/ether 00:11:22:33:44:74 brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:11:22:33:44:75 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::211:22ff:fe33:4475/64 scope link
       valid_lft forever preferred_lft forever
4: br-lan:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 00:11:22:33:44:74 brd ff:ff:ff:ff:ff:ff
    inet 10.1.251.1/24 brd 10.1.251.255 scope global br-lan
       valid_lft forever preferred_lft forever
    inet6 2111:2222:3333:5000::1/64 scope global dynamic noprefixroute
       valid_lft 3721sec preferred_lft 2721sec
    inet6 fe80::211:22ff:fe33:4474/64 scope link
       valid_lft forever preferred_lft forever
5: eth1.25@eth1:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 00:11:22:33:44:75 brd ff:ff:ff:ff:ff:ff
    inet 10.1.25.2/24 brd 10.1.25.255 scope global eth1.25
       valid_lft forever preferred_lft forever
    inet6 2111:2222:3333::25/128 scope global dynamic noprefixroute
       valid_lft 3722sec preferred_lft 2722sec
    inet6 fe80::211:22ff:fe33:4475/64 scope link
       valid_lft forever preferred_lft forever
R27:専用接続
BusyBox v1.36.1 (2024-03-22 22:09:42 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 23.05.3, r23809-234f1a2efa
 -----------------------------------------------------
root@R27:~# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 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: eth0:  mtu 1500 qdisc mq master br-lan state UP qlen 1000
    link/ether 00:11:22:33:44:78 brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:11:22:33:44:79 brd ff:ff:ff:ff:ff:ff
    inet 10.1.27.2/24 brd 10.1.27.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 2111:2222:3333::27/128 scope global dynamic noprefixroute
       valid_lft 3980sec preferred_lft 2980sec
    inet6 fe80::211:22ff:fe33:4479/64 scope link
       valid_lft forever preferred_lft forever
4: br-lan:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 00:11:22:33:44:78 brd ff:ff:ff:ff:ff:ff
    inet 10.1.127.1/24 brd 10.1.127.255 scope global br-lan
       valid_lft forever preferred_lft forever
    inet6 2111:2222:3333:7000::1/64 scope global dynamic noprefixroute
       valid_lft 3980sec preferred_lft 2980sec
    inet6 fe80::211:22ff:fe33:4478/64 scope link
       valid_lft forever preferred_lft forever
これで子ルータがHGWっぽく動作するようになったので良しとしています。
今回は以上です。それでは。

追記1:子ルータにはIA_NAではアドレスをWAN側に取得させたくなかったのですが、Debian12/dhcpcdクライアントではIA_NAを行わないのに、OpenWRTではIA_NAでアドレスをWAN側に取得されてしまっていました。ですが、kea-dhcp6.confで "pools"をコメント化したところ、OpenWRTでもIA_NA取得が行われなくなり、IA_PDのみ取得する所望の動作となりましたので追記しておきます。
# R20 /etc/kea/kea-dhcp6.conf (抜粋)

        {
            "id": 27,
            "subnet": "2001:470:f104::27/128",
            "interface": "eth27",
            //"pools": [ { "pool": "2001:470:f104::27/128" } ],
            "pd-pools": [ { "prefix": "2001:470:f104:7000::", "prefix-len": 52, "delegated-len": 52 } ],
            "option-data": [
                { "name": "dns-servers", "data": "fd98:1:1::64, fd98:1:1::65" },
                { "name": "domain-search", "data": "labo.mydomain.local, mydomain.local" }
            ]
        }

# R27 OpenWrt専用接続子ルータ(ip a 抜粋, eth1はwan側デバイス)
3: eth1:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:11:22:33:44:79 brd ff:ff:ff:ff:ff:ff
    inet 10.1.27.2/24 brd 10.1.27.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::211:22ff:fe33:4479/64 scope link
       valid_lft forever preferred_lft forever

コメント

このブログの人気の投稿

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかも...

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-...

IPv6 Linux router with NDP proxy

更新:2024/07/07 Debian 12のオリジナルndppdパッケージで下記設定にてndppdが機能することを確認しました。 ---------------------------------------------------------------- LinuxでIPv6 routerを設定しました。 プロバイダーから提供されたルータ機能付きのONUの配下に、パブリックなIPv6サブネットを構成できるルータを設定した時のメモです。 プロバイダはNuro光 で、G2Vというサービスです。通常、このサービスでは、ルータ付きのONU(図のONU+RT)には、IPv6で接続する場合、クライアントを直接接続する事はできます。しかし、図のように内側にさらにLinux Routerを接続し、eth1以下のClinet側サブネットにPublicなIPv6 addressを付与するには、NDP proxyの設定が必要でした。 構成はおよそ以下の通りです。(図再差し替え:2020/07/04) 1. 問題点と対策方針 今回来たONU+RTはZTE社のF660Aという物でした。このルータには、/56のアドレスが付与され、なおかつ、「プレフィックスデリゲーション」という項目があるのですが、設定しても、RA(ルーターアドバタイズ)は/64しか降りてこず、また、DHCPv6でも/64しか取得できません。つまり、このG2Vというサービスでは、DHCPv6-PDでも、/64 しか すら降りてきません。(なお、このサービスとしては機能的にはこれが正常です。) この制約を説明するとおよそこのような感じです。 26xx:1234:5678:9A00::/56 ← ONU+RTに払い出されたアドレス 26xx:1234:5678:9A00::/64 ← ONU+RTから払い出されるアドレス。 つまり、この設定では、64-56=8bit以下のサブネットを構成できるルータを別途接続することができません。 そこで調べたところ、「スタティックプレフィックス」という項目があり、これだと、(2024/07/06訂正) 26xx:1234:5678:9A00::/56 ← ONU+RTに払い出された(委譲された...