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

DHCPv6-PD サブルータの構成 その1: 子ルータが /60の委譲を受け、孫ルータに/64を委譲する場合

前回は、ONU直下に/60のPREFIXをサブルータに委譲するMAP-Eルータを構成しましたが、今回はMAP-Eルータ以下に/64のプレフィックスをさらに孫ルータへと委譲する子ルータを構成してみました。
親・子・孫ルータともにPDでき、かつ、サブルータへの経路を設定できる構成は見かけないので、本稿をアップしてみました。通信環境はOCNバーチャルコネクトで、OSはDebianです。
構成図は以下の通りですが、今回は子ルータgw2の設定です。

それでは早速設定していきます。
## 0-1a. /etc/network/interfaces.d/eth0
auto eth0

iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1

iface eth0 inet6 dhcp
  accept_ra 2
  request_prefix 1
## 0-1b. /etc/network/interfaces.d/eth1
auto eth1

iface eth1 inet static
  address 172.16.2.1
  netmask 255.255.255.0

iface eth1 inet6 manual
## 0-2. /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
## 0-3. /etc/rc.local (chmod+x)
#!/bin/bash
sysctl -p

ifup eth1

sleep 10

/etc/init.d/isc-dhcp-server restart

ip -4 route add 172.16.3.0/24 via 172.16.2.2 dev eth1
ip -4 route add 172.16.4.0/24 via 172.16.2.2 dev eth1

## 0-4. /etc/radvd.conf (apt-get install radvd)
interface eth1 {
  AdvManagedFlag on;
  AdvOtherConfigFlag on;
  AdvSendAdvert on;
  AdvLinkMTU 1500;
  MaxRtrAdvInterval 180;

  RDNSS 2606:4700:4700::1111 2606:4700:4700::1001 {
  };

  AdvRASrcAddress {
    fe80::1;
  };
};
## 0-5. /etc/keepalived/keepalived.conf (apt-get install keepalived)
global_defs {
  vrrp_version 3
}

vrrp_sync_group G2 {
  group {
    ipv6_vgw02
  }
}

vrrp_instance ipv6_vgw02 {
  state BACKUP
  interface eth1
  virtual_router_id 62
  priority 100
  advert_int 1.0
  virtual_ipaddress {
    fe80::1/10
  }
  garp_master_delay 1
}
## 0-6. /etc/default/isc-dhcp-server (apt-get install isc-dhcp-server)
INTERFACESv4="eth1"
INTERFACESv6="eth1"
注釈1:Debian 10/Debian 11のネットインストイメージで最小インストールをした場合、/etc/resolv.confは自動で設定されませんので手動/自動のいずれかを選択してください。
## 0-7a. /sbin/dhclient-scriptの変更(403行目)
/etc/resolv.confを自動で変更する場合(IPv6のREBIND6時)
#変更前
if [ "${reason}" = BOUND6 ] ||
#変更後
if [ "${reason}" = BOUND6 ] || [ "${reason}" = REBIND6 ] ||
## 0-7b. /etc/resolv.conf
/etc/resolv.confを手動で設定する場合
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
## 1. /etc/dhcp/dhclient-exit-hooks.d/prefix-delegation ( chmod +x )
#!/bin/bash
if [ -n "$new_ip6_prefix" ];then
  ia_pd_interface=eth1
  # check current inet6 addr and run the script unless proper prefix is given.
  bounded=false
  for addr in `ip -6 a show dev $ia_pd_interface | grep inet6 | awk '{print $2}'`;do
    if [ "$addr" = "$new_ip6_prefix" ];then bounded=true;fi
  done

  if ! "$bounded"; then
    ip -6 addr add $new_ip6_prefix dev $ia_pd_interface
    /usr/local/sbin/subnet-dhcpd4.sh 172.16.2.0 255.255.255.0 172.168.2.200 172.16.2.254 172.16.2.1
    /usr/local/sbin/subnet-dhcpd6.sh $new_ip6_prefix
  fi
fi

## Uncomment blow for debug
#echo ====================== >> /tmp/pd.log
#printenv >> /tmp/pd.log
追記1:プレフィックスとアドレスを固定で割り当てる設定を追加しました。gw3のDUIDは、gw2の/var/log/syslogを参照してください。
## 2-1a./usr/local/sbin/subnet-dhcpd6.sh ( chmod +x )
#!/bin/bash

PFX_W_LEN=$1

SUBNET_LEN=4

PFX=`echo $PFX_W_LEN | awk -F'::' '{print $1}'`
PFX_WO_LEN=`echo $PFX_W_LEN | awk -F'/' '{print $1}'`
PFX_LEN=`echo $PFX_W_LEN  | awk -F'/' '{print $2}'`
PFX1=`echo $PFX | awk -F':' '{print $1}'`
PFX2=`echo $PFX | awk -F':' '{print $2}'`
PFX3=`echo $PFX | awk -F':' '{print $3}'`
PFX4=`echo $PFX | awk -F':' '{print $4}'`

if [ -z "$PFX3" ]; then PFX3=0; fi
if [ -z "$PFX4" ]; then PFX4=0; fi

PFX3=`printf %04x 0x$PFX3`
PFX4=`printf %04x 0x$PFX4`

#echo DEBUG: PFX1:PFX2:PFX3:PFX4::/PFX_LEN $PFX1\:$PFX2\:$PFX3\:$PFX4\::/$PFX_LEN
#echo DEBUG: PFX_LEN: $PFX_LEN

PD6_F1=`printf %x $(( 0x$PFX4 + 0x01 ))`
PD6_F2=`printf %x $(( 0x$PFX4 + 0x02 ))`
PD6_S=`printf %x $(( 0x$PFX4 + 0x03 ))`
PD6_E=`printf %x $(( 0x$PFX4 + 0x0f ))`

#echo DEBUG: $PD6_S $PD6_E

if [ ! -d /etc/dhcp/conf.d ]; then
  mkdir -p /etc/dhcp/conf.d
fi

#echo DEBUG: PFX_WO_LEN: $PFX_WO_LEN

cat > /etc/dhcp/conf.d/$PFX_WO_LEN.conf << EOF
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

subnet6 $PFX_W_LEN {
    range6 $PFX1:$PFX2:$PFX3:$PFX4:: $PFX1:$PFX2:$PFX3:$PFX4:ffff:ffff:ffff:ffff;
    range6 $PFX1:$PFX2:$PFX3:$PFX4::/$(( $PFX_LEN + $SUBNET_LEN )) temporary;
    option dhcp6.name-servers 2606:4700:4700::1111, 2606:4700:4700::1001;
    prefix6 $PFX1:$PFX2:$PFX3:$PD6_S:: $PFX1:$PFX2:$PFX3:$PD6_E:: /$(( $PFX_LEN + $SUBNET_LEN ));
}

host gw3 {
  host-identifier option dhcp6.client-id 00:01:00:01:22:33:44:55:00:66:77:88:99:03;
  fixed-address6 $PFX1:$PFX2:$PFX3:$PFX4::3;
  fixed-prefix6  $PFX1:$PFX2:$PFX3:$PD6_F1::/$(( $PFX_LEN + $SUBNET_LEN ));
  on commit {
    execute("/usr/local/sbin/pdr.sh",
      "$PFX1:$PFX2:$PFX3:$PD6_F1::",
      "$(( $PFX_LEN + $SUBNET_LEN ))",
      "$PFX1:$PFX2:$PFX3:$PFX4::3"
    );
  }
}

on commit {
  if exists dhcp6.ia-pd {
    set pdaddr=binary-to-ascii(16, 16, ":", substring(option dhcp6.ia-pd,25,16));
    set pdlen=binary-to-ascii(10, 8, "", substring(option dhcp6.ia-pd,24,1));
    set nh=binary-to-ascii(16, 16, ":", substring(option dhcp6.ia-na,16,16));
    execute("/usr/local/sbin/pdr.sh", pdaddr, pdlen, nh);
  }
}

EOF

if [ ! -e /etc/dhcp/dhcpd6.config.bkup -a /etc/dhcp/dhcpd6.conf ];then
 mv /etc/dhcp/dhcpd6.conf /etc/dhcp/dhcpd6.config.bkup
fi
cat > /etc/dhcp/dhcpd6.conf << EOF
include "/etc/dhcp/conf.d/$PFX_WO_LEN.conf";
EOF

#/etc/init.d/isc-dhcp-server restart
## 2-1b. /usr/local/sbin/pdr.sh ( chmod +x )
#!/bin/bash
rt1=`ip -6 route show $1/$2 via $3`
rt2=`ip -6 route show $1/$2`
if [ -z "$rt1" ];then
  if [ -n "$rt2" ]; then
    ip -6 route delete $1/$2
  fi
  ip -6 route add $1/$2 via $3
fi
## 2-2./usr/local/sbin/subnet-dhcpd4.sh ( chmod +x )
#!/bin/bash

SUBNET=$1
MASK=$2

RANGE_S=$3
RANGE_E=$4

RT=$5

if [ ! -d /etc/dhcp/conf.d ]; then
 mkdir -p /etc/dhcp/conf.d
fi

cat > /etc/dhcp/conf.d/$SUBNET.conf << EOF
subnet $SUBNET netmask $MASK {
    range $RANGE_S $RANGE_E;
    option domain-name-servers 1.1.1.1, 1.0.0.1;
    option routers $5;
}

EOF

if [ ! -e /etc/dhcp/dhcpd.conf.bkup ] && [ -e /etc/dhcp/dhcpd.conf ];then
 mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bkup
fi
cat > /etc/dhcp/dhcpd.conf << EOF
include "/etc/dhcp/conf.d/$SUBNET.conf";
EOF

#/etc/init.d/isc-dhcp-server restart
/64の委譲は/60の委譲と同様に/64を配布する孫ルータではない(つまり、/64での接続は直接はない)ので、/etc/radvd.confはDHCPを使う設定になっています。 今回の設定は以上です。それでは。

コメント

このブログの人気の投稿

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

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-