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

フレッツ光クロスコラボの固定IPv4接続でIPv6ネットワークプレフィックスが変更された件について

5月2日の朝なんですが、これまで特に通信ができなかったことはないのですが、突然インターネットに接続できないようになりました。
環境はフレッツ光コラボのenひかりクロス固定IP接続(v6プラス)で、ルーターはLinux(debian)で構成した自前ルータだったのですが、こちらの自前のスクリプト(※1)とちがうものをつかっていてIPv6ネットワークプレフィックスを固定にしていた所為もあり、最初は原因がわからないしネットに接続できないのでやむなく一時的にスマホをUSBテザリングしてネットにつなげて情報収集しましたが、原因はわかりませんでした。
そこで、今一度スクリプトを見返したところ、前述のようにIPv6ネットワークプレフィックスを固定にしていたのでもしやと思い、dhclientをデバッグモードで走らせると指定していたプレフィックスとは異なるプレフィックスが割り振られていました。通信できないのは当然です。
今度は割り当てられたプレフィックスを指定し直したところIPv6は接続できるようになりましたが、IPv4で通信できません。これも前述のスクリプトと異なるものを使用していたので、少しづつデバッグしていったところ、curlで認証を受けるところがNGになっていました。ここで前出のスクリプトと見比べるとURLをダブルクォーテーションで囲っていなかったのでこれを修正したところ認証も通り、無事、IPv4も疎通できるようになりました。
これで一件落着と言いたいところなのですが、一部IPv6ネットワークプレフィックスを固定していたのでこれらの変更が必要だったので修正しました。小規模な宅内LANなので良かったのですが、これが大規模なLANでULA(ユニークローカルアドレス,IPv4のプライベートアドレスに相当)で運用されていない環境やIPv6でトンネルを張っていたりすると業務に支障がでるだろうなと思ったのは言うまでもありません。
最後に今後もプレフィックスが変更される可能性は否定できないので、スクリプトを前述のスクリプトに入れ替え(一部修正が必要でしたが)IPv6/IPv4の疎通を確認し、宅内LANのULA化はまだですが、ようやく一件落着となりました。
2024/05/12追記:こちらにULA化(GUA/ULA変換)について投稿しました。
今回は以上です。それでは。

追記1:調べたところ、フレッツ光ネクストのひかり電話無しの場合、wan側のraでprefixのPreferred LifetimeやRouter lifetimeが変化し、新しいprefixに切り替わるまえに何かしらの前兆はあるようです。
また、フレッツ光クロスでの固定IPの場合(つまりフレッツ光ネクストのひかり電話ありの場合と同じ)は、dhcpclientに対し "DHCPv6 Reconfigure message" で通知される様です。つまりdhcpでprefixが変わる場合があるので、半固定という表現は正しくなく、動的だと言うほうが正しいと思いました。
参考: IP通信網サービスのインターフェース 第三分冊(フレッツ 光クロス編)より
2.4.2.1.2 IPv6(IPoE)通信における IPv6 アドレス情報付与方法
端末機器は、RFC3315、RFC3633に規定されるDHCPv6-PD(DHCPによるIPv6 Prefix Option)を使用しIPv6
Prefixを取得することを推奨します。端末機器のアドレスとして利用可能なアドレスは、DHCPv6-PDを使用して
IP通信網から送信するメッセージに含まれる56bitのIPv6 Prefixを利用して生成したIPv6のグローバル・ユニキ
ャストアドレスのみです。なお、DHCPv6を利用した128bitのIPv6アドレスの取得はできません。
サービスの利用状況等によりIP通信網から送信されるIPv6 Prefixの値は変更される場合があります。なお、
IPv6 PrefixのサイズはIP通信網より指定をして送信します。
IP通信網は、RFC2461に規定されているNDP(Neighbor Discovery Protocol)に基づき、ルータ広告(Router
Advertisement)メッセージを端末機器に送信しますが、ルータ広告のOther stateful configuration flag及び
Managed address configuration flagが1を設定される場合があります。
なお、IP通信網はInformation-Requestには対応しておりません。

追記2: isc dhclientではデフォルトではDHCPv6 Reconfigure messageを受信しませんし、受信する設定をしても以下のようなログが吐かれるだけだそうです。
RCV: Reconfigure message on enp1s0f0 from fe80::xxxx:xxxx:xxxx:xxxx.
なお受信するには以下を/etc/dhclient.confに追加します。(interface "enp1s0f0"の部分は環境に合わせてください。)
option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
interface "enp1s0f0" {
also request dhcp6.sntp-servers;
also request dhcp6.vendor-opts;
also request dhcp6.reconf-msg;  #Reconfigure authentication option
send dhcp6.reconf-accept;  #Reconfigure accept option
}
こちらを参考にさせていただきました。ありがとうございます)
つまり、上記の設定をおこないsyslogを監視し、"RCV: Reconfigure message on enp1s0f0" のメッセージが来た時にrsyslogで何らかの処理を行い、スクリプトを再度実行するなどして自動的に対応できる可能性はあるかもしれません。

追記3: 以下、rsyslog設定とスクリプトをざっくりと書いてみました。
/etc/rsyslog.conf
###########################
#### GLOBAL DIRECTIVES ####
###########################

$template WaitSeconds,"20"
/etc/rsyslog.d/gw01.conf
if ($hostname == "gw01" and $msg contains "RCV: Reconfigure message on enp1s0f0") then ^/usr/local/sbin/reconfigure-enp1s0f0.sh;WaitSeconds
ここで、 systemctl restart rsyslog.service としrsyslogに設定を反映させる。
/usr/local/sbin/reconfigure-enp1s0f0.sh # chmod +x
#!/bin/bash
logger "$0 is triggerd."
WANDEV=enp1s0f0
WANDEVMAC=0c:aa:bb:cc:dd:ee

dhclient -r -6 -v -pf /run/dhclient6.$WANDEV.pid -lf /var/lib/dhcp/dhclient6.$WANDEV.leases -I -P -N -df /var/lib/dhcp/dhclient.$WANDEV.leases $WANDEV

#just for sure
kill $(cat /run/dhclient6.$WANDEV.pid)
rm -rf /run/dhclient6.$WANDEV.pid

dhclient -6 -v -pf /run/dhclient6.$WANDEV.pid -lf /var/lib/dhcp/dhclient6.$WANDEV.leases -I -P -N -df /var/lib/dhcp/dhclient.$WANDEV.leases $WANDEV

while [ ! -f /run/dhclient6.$WANDEV.pid ]; do
  ifdown $WANDEV
  ifup $WANDEV
  sleep 4
done

#自前のスクリプト(※1)
/usr/local/sbin/ipt-v6p-static-lan-01.sh

#その他のスクリプト等
#logger "/usr/local/sbin/dhcpv6-prefix-reconfigure.sh $WANDEV $WANDEVMAC"
#/usr/local/sbin/dhcpv6-prefix-reconfigure.sh $WANDEV $WANDEVMAC

logger "$0 ends."
テスト
sudo logger "RCV: Reconfigure message on enp1s0f0 from fe80::1111:2222:3333:4444."
確認
sudo tail -n 50 /var/log/syslog
/usr/local/sbin/dhcpv6-prefix-reconfigure.sh の例(再びこちらを参考にさせていただきました。ありがとうございます)
#!/bin/bash
WANDEV=$1
WANDEVMAC=$2

cd /tmp

FWGW=`grep "RCV: Reconfigure message on $WANDEV" /var/log/syslog | tail -n1 | awk '{print $NF}' | sed 's/\.//g'`

FWGWMAC=`echo $FWGW | awk -F':' '{
		val1= "0x"$3; printf "%04x", val1;
		val2= "0x"$4; printf "%04x", val2;
		val3= "0x"$5; printf "%04x", val3;
		val4= "0x"$6; printf "%04x", val4;
	}' | awk '{print substr($0, 1, 2) ":" substr($0, 3, 2) ":" substr($0, 5, 2) ":" substr($0, 11, 2) ":" substr($0, 13, 2) ":" substr($0, 15, 2)}'`

i=1;
FWGWMAC=$(for tet in `echo $FWGWMAC | sed 's/\:/\ /g'`;do 
	if [ $i -eq 1 ]; then tet=$((16#$tet ^ (1 << 1) )); printf '%02x' $tet; else printf $tet;fi;
	if [ $i -ne 6 ]; then printf ":";fi;
	i=$((i+1));
done)

TMPKEY=`grep dhcp6.unknown-11 /var/lib/dhcp/dhclient6.$WANDEV.leases | tail -n 1 | sed 's/\;//' | awk -F ' ' '{print $NF}' | cut -d ':' -f 13-`
IFS=:
HEXKEY=`for i in $TMPKEY; do printf %02x "0x$i";done`

srvmac=${FWGWMAC//:/}
cldev=$WANDEVMAC
clmac=${cldev//:/}

dt1900=`date --date='1900/1/1 0:0:0 UTC' +%s` #linux
dtnow=`date +%s` #linux
#dt1900=`date -j -u -f "%Y/%m/%d %H:%M:%S" "1900/1/1 00:00:00" +%s` #macOS
#dtnow=`date -j -u +%s` #macOS
dtntp=$(($dtnow-$dt1900))
#DHCPv6 Message type
echo -en "\xa\x0\x0\x0" > DHCPv6-MSG.bin
#Client ID option(1):length(10)
echo -en "\x0\x1\x0\xa\x0\x3\x0\x1" >> DHCPv6-MSG.bin
echo -n "$clmac" | xxd -r -p >> DHCPv6-MSG.bin
#Server ID option(2):length(10)
echo -en "\x0\x2\x0\xa\x0\x3\x0\x1" >> DHCPv6-MSG.bin
echo -n "$srvmac" | xxd -r -p >> DHCPv6-MSG.bin
#Option Request IA-PD(25) option(6):length(2)
echo -en "\x0\x6\x0\x2\x0\x19" >> DHCPv6-MSG.bin
#Reconfigure Messages Type: Renew(5) option(19):length(1)
echo -en "\x0\x13\x0\x1\x5" >> DHCPv6-MSG.bin
#Authentication option(11):length(28)#protocol(3):algorithm(1):RDM(0):ReplayDetection(8):key(1+16)
echo -en "\x0\xb\x0\x1c\x3\x1\x0" >> DHCPv6-MSG.bin
printf "%x%08x" $dtntp "0" | xxd -r -p >> DHCPv6-MSG.bin
#Authentication
echo -en "\x2" >> DHCPv6-MSG.bin
echo -n "00000000000000000000000000000000" | xxd -r -p > DHCPv6-0.bin
cat DHCPv6-MSG.bin DHCPv6-0.bin | openssl dgst -md5 -mac hmac -macopt hexkey:$HEXKEY -binary -out DHCPv6-DGST.bin
cat DHCPv6-MSG.bin DHCPv6-DGST.bin > DHCPv6-RECONFIGURE.bin
cat DHCPv6-RECONFIGURE.bin | nc -6 -u $FWGW%$WANDEV 547

コメント

このブログの人気の投稿

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の実装もあるようなので、いずれパッケージになるかもしれませ

Windows デバイス暗号化 のサポートで "許可されていない dma 対応バス/デバイスが検出されました"の対処

Windows でセキュリティー関係を見ているのですが、とあるPCでmsinfo32で確認すると"デバイス暗号化のサポート"で"許可されていない dma 対応バス/デバイスが検出されました"と出ていました。このPCの場合、それ以外はOK(なにも表示されない)だったのですが、ネットでしらべるとMSのドキュメントではハードウェアベンダーに問い合わせるなどと敷居が高く具体的にどこが引っかかっているかわかりません。そこでほかに方法はないかとしらべやってみたところ、"前提条件をみたしています"まで持って行けたので、本稿を挙げた次第です。 具体的には、以下のようにします。 1-a. 許可するDMA対応バス・デバイスを指定するレジストリの所有権と書き込み設定をおこなう。 以下のレジストリキーの所有者を自分自身(管理ユーザ)のものにし、フルコントロール権を付与する。 HKLM\SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses もしくは 1-b. MicrosoftよりPsExecをダウンロードし、System権限でRegeditを立ち上げ編集する。 Microsoftより、https://docs.microsoft.com/en-us/sysinternals/downloads/psexec にある こちら をダウンロードし、解凍する。解凍すると、x64の場合、PsExec64.exeがあるので、管理者権限で以下を実行し、システム権限でregeditを立ち上げることが出来るようになる。 cd Downloads\PSTools .\PsExec64.exe -sid C:\Windows\regedit.exe 2-a. パワーシェルスクリプトを実行し、PnPデバイスのうちインスタンスがPCIで始まるものを"AllowedBuses"に追加する。 以下のパワーシェルスクリプトを作成する。たとえばDocuments\allow-dma-bus-device.ps1として作成する。( こちらの記事のものを使用させていただきました: Thank you! ) $tmpfile = "$($env:T

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]と入力し、[別のユーザーとして接続する