goo blog サービス終了のお知らせ 

rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する

2021-08-21 14:00:00 | ひかり電話
ひかり電話 HGW PR-600MI(PR-S300SEも同じ)は、NTT-GWのDHCPv6relayを介してDHCPv6サーバーより56ビット長のプレフィックスが委譲される。委譲されたプレフィックス「AAAA:BBBB:XXXX:YY00::/56」を16分割し、「AAAA:BBBB:XXXX:YY10::/60」から「AAAA:BBBB:XXXX:YYF0::/60」の15プレフィックスをDHCPv6-PDサーバーとして再委譲する。Prefix「AAAA:BBBB:XXXX:YY00::/64」をLAN側にRAし、インターフェースアドレスをSLAAC(StateLess Address Auto Configuration)設定する。またPrefix「AAAA:BBBB:XXXX:YY01::/64」のSLAACをLAN側インターフェースに設定し、DNSパケットのソースアドレスとしている。
PR-600MIのDHCPv6サーバーは、「Valid Life Time(14400秒)」を超えて「renew/rebind」がされないとリース情報がクリアされ、新たなクライアントのリース対象となる。また、PR-600MIの再起動で、全てのリース情報がクリアされる。再起動やプレフィックス変更時には、「reconfigure」が発行される。

現在「2409:10:XXXX:YY00::/56」のプレフィックスが委譲されており、NVR510に「2409:10:XXXX:YY10::/60」、OpenWrtに「2409:10:XXXX:YY20::/60」と「2409:10:XXXX:YY30::60」、NVR500に「2409:10:XXXX:YY40::/60」が委譲されている。PR-600MIの再起動が発生すると、DHCPv6サーバーからの「reconfigure」メッセージにより各ルータが再取得を行うが、早いもの順でprefixが取得されるため、設定が変更されてしまう(「ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合」)。UPSなどでシャットダウンからの起動でもprefix設定が変更されてしまう(「APC SMT500J にSynology DS216J (USB)とDebian10(Serial)から同時接続」)。

(1)PR-600MIのDHCPv6 サーバー機能
IP通信網サービスのインターフェース 第三分冊」の「2.4.2.1.4 DHCPv6 における DUID 生成方式」で「DUID-LL」の使用が定義されている。リースデータの有効時間(取得値)は、下記の通り。
LAN側
T1 = 6300秒(renew)
T2 = 10800秒(rebind)
Preferred Life Time = 12600 秒
Valid Life Time = 14400 秒 
仕様では、NTT-GWからRA(Router Advertisement)が発行されるように読めるが、PR-600MIがRS(Router Solicit)を発行してもNTT-GWは応答しない(ひかり電話契約)。
LAN側に接続されたルータからのRSに対して、Prefix=2409:10:XXXX:YY00::/64でOther Flag=1のRAが送出される。

(2)PR-600MIのDHCPv6サーバーの確認
「DUID-LL」の使用を指定されているが、「DUID-LLT」で接続する機器も存在するので両方確認してみた(RFC3315#section9)。

あ)確認方法
Debian10(ISC dhclient)は、クライアントIDを設定ファイルに記述、OpenWrt(odhcp6c)は、クライアントIDを引数指定で行う。LLTの時刻は、2000年1月1日0時0分UTC基準で秒数指定するがDebian10(Linux)のdateコマンドは、1970年1月1日0時0分UTCが基準のため下記変換スクリプトで算出した。
date-d2s '2021/4/1 00:00:00 UTC'
#!/bin/sh
D70=`date --date="$1" +%s`
D2K=`date --date='2000/1/1' +%s`
printf '%x¥n' $(($D70-$D2K))
LL及びLLTのクライアントID値は、下記の通り。
クライアントID
インターフェースのMAC address = 34:76:c5:57:0b:00
 時刻(2021/4/1 00:00:00 UTC) = 27:f8:48:10
クライアントID(LLT) = 00:01:00:01:27:f8:48:10:34:76:c5:57:0b:00
クライアントID(LL) = 00:03:00:01:34:76:c5:57:0b:00
(OpenWrtのodhcp6cでは、「:」を記載せず指定)
DHCPv6クライアントは、Debian10のISC dhclientとOpenWrtのodhcp6cで行った。

dhclientの場合
ISC dhclient
#Prefix取得
dhclient -6 -P -cf vaio-00.conf -pf vaio-00.pid -lf vaio-00.enp3s0.leases enp3s0
#releaseしないで終了
dhclient -6 -x -P -cf vaio-00.conf -pf vaio-00.pid -lf vaio-00.enp3s0.leases enp3s0
#releaseして終了
dhclient -6 -r -P -cf vaio-00.conf -pf vaio-00.pid -lf vaio-00.enp3s0.leases enp3s0

---- vaio-00.conf ----
interfaces "enp3s0" {
    also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
    send dhcp6.client-id 00:01:00:01:27:f8:48:10:34:76:c5:57:0b:00
}
odhcp6cの場合
OpenWrt
#Prefix取得
/usr/sbin/odhcp6c -k -P0 -c0001000127f848103476c5570b00 -s odhcp6c-script -d odhcp6c-pid eth1
kill `cat odhcp6c-pid`
#releaseして終了
/usr/sbin/odhcp6c -P0 -c0001000127f848103476c5570b00 -s odhcp6c-script -d odhcp6c-pid eth1
kill `cat odhcp6c-pid`

---- odhcp6c-script ---
#!/bin/sh
logger -t "odhcp6c-script" -s " Prefix=$PREFIXES Clinet-ID=$OPTION_1"
い)確認結果
PR-600MI(PR-S300SEを含む)は、DUIDにLLTを使用してもPrefixの委譲を受けられる。LLT時刻の異なる二つのクライアントIDを使い、一つのデバイスから二つのPrefix「2409:10:XXXX:YY30::/60」と「2409:10:XXXX:YY50::/60」を取得した時のPR-600MI「情報」「DHCPv6サーバ払い出し状況」

同一デバイス(MAC アドレスが同じ)だと最後のリース情報だけが表示される。リース数も表示されたリース数となる。「2409:10:XXXX:YY30::/60」のリース情報が表示されないが、リースされている。この状態でMACアドレスが異なるクライアントIDでPrefix Delagationを行うと、「2409:10:XXXX:YY30::/60」がリース中のため「2409:10:XXXX:YY60::/60」がリースされる。


LLTのクライアントIDで時刻を変えた12個のPrefix取得例

12個のPrefixの内、最後の「2409:10:XXXX:YYf0::/60」だけが表示され、リース個数も「4/15」と表示されるが、12個のPrefixがリースされた状態。


LLのクライアントIDでMACアドレスを変えた12個のPrefix取得例

12個のPrefixが全て表示され、リース個数も「15/15」と表示される。
PrivateネットワークなのでMACアドレスが重ならないように最終アドレスを変化させてPrefixを取得するのが良さそう。

う)リースされたPrefixの経路情報
PR-600MIがリースしたPrefixの経路情報は、指定したMACアドレス宛てと推定していたが、Prefix要求元のインターフェースアドレスとなる。(い)で取得したPrefixのアドレスをインターフェースに設定し、他端末からpingで確認した。
ip address add 2409:10:XXXX:YYf0::1 dev enp3s0
ping -6 2409:10:XXXX:YYf0::1
「renew」「rebind」などは、クライアントIDが同じであれば、Prefix要求元のインターフェース以外からも更新が可能。NVR500/510のDHCPv6クライアントは、「release」指定が出来ない。他端末からNVR500/510のクライアントID(LL)で「release」が可能(LLTだと時刻の推定が難しい。パケットキャプチャで確認する必要がある)。経路情報をNVR500/510に向けるには、NVR500/510自身がPrefix取得を行う必要がある。

(3)任意のPrefixを取得する
ルータ機器が下記Prefixを取得できるよう制御する
NVR510 「2409:10:XXXX:YY10::/60」
OpenWrt 「2409:10:XXXX:YY20::/60」
NVR500 「2409:10:XXXX:YY40::/60」
PR-600MIの再起動後、NVR500, NVR510, OpenWrtの取得したPrefixを全て「release」させる。その後、NVR510, OpenWrt, NVR500の順にPrefixを再取得させる。
NVR500/510は、「ヤマハ NVR510 / NVR500 のDHCPv6-PDをCUSTOM-GUIで再取得させる」で再取得させる(「NVR510 / NVR500 のDHCPv6-PDをリモートで再取得させる」でも良い)。OpenWrtなどのLinux機は、「ssh」(公開鍵認証)によりコマンド実行で再取得させる。

PR-600MIのLAN側に接続されたDebian10クライアント端末からスクリプト実行によるDHCPv6-PDの再取得
Debian10
---- RebindAllISC ----
#!/bin/shbash
# for ISC DHCP
ID1="NVR510"
ID2="OpenWrt"
ID3="Dummy"
ID4="NVR500"
PTH="/home/dhcp"
DHCPV6CL="/usr/sbin/dhclient -6 -P "
#----
CID="$ID1 $ID2 $ID3 $ID4"
IF="enp3s0"
CUSTOMAPI="custom/api?password=JYUMON"
# release all prefix
for CL in $CID; do
    $DHCPV6CL -cf "$PTH/$CL.conf" -pf "$PTH/$CL.pid" -lf "$PTH/$CL.$IF.leases" $IF
    $DHCPV6CL -r -cf "$PTH/$CL.conf" -pf "$PTH/$CL.pid" -lf "$PTH/$CL.$IF.leases" $IF
done
echo "Released all"
# rebind NVR510 for #1
if echo -n $CID | grep "$ID1" >/dev/null; then
wget -q -O- --post-data=$'syslog debug on\r\nipv6 lan2 dhcp service client' http://nvr510-lan2.familynae/$CUSTOMAPI
while [ "$pf" = "" ]; do
   sleep 1
    pf=`wget -q -O- --post-data="show status ipv6 dhcp" http://nvr510-lan2.familyname/$CUSTOMAPI | grep prefix | sed 's/ *prefix: //'`
done
wget -q -O- --post-data="syslog debug off" http://nvr510-lan2.familyname/$CUSTOMAPI >/dev/null
echo "Bind #1"
fi

# rebind OpenWrt for #2
if echo -n $CID | grep "$ID2" >/dev/null; then
ssh root@openwrt.familyname ubus call network.interface.wan6 renew
echo "Bind #2"
fi

# rebind Dummy for #3
if echo -n $CID | grep "$ID3" >/dev/null; then
$DHCPV6CL -cf "$PTH/$ID3.conf" -pf "$PTH/$ID3.pid" -lf "$PTH/$ID3.$IF.leases" $IF
$DHCPV6CL -x -cf "$PTH/$ID3.conf" -pf "$PTH/$ID3.pid" -lf "$PTH/$ID3.$IF.leases" $IF
echo "Bind #3"
fi

# rebind NVR500 for #4
if echo -n $CID | grep "$ID4" >/dev/null; then
wget -q -O- --post-data=$'syslog debug on\r\nipv6 lan2 dhcp service client' http://nvr500-lan2.familyname/$CUSTOMAPI >/dev/null
while [ "$pf" = "" ]; do
    sleep 1
    pf=`wget -q -O- --post-data="show status ipv6 dhcp" http://nvr500-lan2.familyname/$CUSTOMAPI 2>/dev/null | grep prefix | sed 's/ *prefix: //'`
done
wget -q -O- --post-data="syslog debug off" http://nvr500-lan2.familyname/$CUSTOMAPI >/dev/null
echo "Bind #4"
fi
-------- dhclient用設定ファイル --------
---- nvr510.conf ----
interface "enp3s0" {
	also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
	send dhcp6.client-id 00:03:00:01:ac:44:f2:AA:BB:CC; #nvr510 WAN
}
---- OpenWrt.conf ----
interface "enp3s0" {
	also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
	send dhcp6.client-id 00:03:00:01:00:1d:73:34:45:56; #openwrt WAN
}
---- Dummy.conf ----
interface "enp3s0" {
	also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
	send dhcp6.client-id 00:03:00:01:00:1d:73:34:45:57; #Dummy
}
---- nvr500.conf ----
interface "enp3s0" {
	also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
	send dhcp6.client-id 00:03:00:01:00:a0:de:AA:BB:DD; #nvr500 WAN
}
2021/10/7 修正: /bin/sh -> /bin/bashに変更。debian10の/bin/sh は、/usr/bin/dashへのリンク。wgetが誤動作するため/usr/bin/bashに変更。
NVR510, OpenWrt, NVR500のリースをreleaseさせ、NVR510, OpenWrtで再取得を実行させる。NVR500の前に「2409:10:XXXX:YY30::/60」をスクリプト実行機でDumy取得し、その後にNVR500に再取得させる。Dummy取得したPrefixは、releaseしないでdhclientを終了させるので、Valid Lifetime後に解放される。dhclientを終了させなければ、定期的に「renew/rebind」がされ取得したPrefixを確保する事ができる。NVR510/500では難しいが、OpenWrtなどのLinux機であれば、取得するPrefix毎に異なるクライアントIDを使用すれば、1台のゲートウェイで複数のPrefix委譲を受ける事ができる。

PR-600MIのLAN側に接続したOpenWrtルータ上でDHCPv6-PDの再取得用スクリプト
OpenWrt
---- RebindAll ----
#!/bin/sh
# for OpenWrt  odhcp6c
NVR510="ac44f2AABBCC"
OpenWrt="001d73344556"
Dummy="001d73344557"
NVR500="00a0deAABBDD"
ID1="00030001$NVR510"
ID2="00030001$OpenWrt"
ID3="00030001$Dummy"
ID4="00030001$NVR500"
CID="$ID1 $ID2 $ID3 $ID4"
IF="eth1"
PID="/var/run/odhcp6c-sh.pid"
SCRIPT="/root/odhcp6c-sh"
DHCPV6CL="/usr/sbin/odhcp6c -P0" #release
#DHCPV6CL="/usr/sbin/odhcp6c -k -P0" #keeping
CUSTOMAPI="custom/api?password=JYUGEM"
# release all prefix
for CL in $CID; do
    $DHCPV6CL -c$CL -s$SCRIPT -d -p$PID $IF
    while [ ! -e "$PID" ]; do sleep 1; done
    kill `cat $PID`
    while [ -e "$PID" ]; do sleep 1; done
done
echo "Released all"
# rebind NVR510 for #1
if echo -n $CID | grep "$ID1" >/dev/null; then
wget -q -O- --post-data=$'syslog debug on\r\nipv6 lan2 dhcp service client' http://nvr510-lan2.familyname/$CUSTOMAPI
while [ "$pf" = "" ]; do
   sleep 1
    pf=`wget -q -O- --post-data="show status ipv6 dhcp" http://nvr510-lan2.familyname/$CUSTOMAPI | grep prefix | sed 's/ *prefix: //'`
done
wget -q -O- --post-data="syslog debug off" http://nvr510-lan2.familyname/$CUSTOMAPI >/dev/null
echo "Bind #1"
fi
# rebind OpenWrt for #2
if echo -n $CID | grep "$ID2" >/dev/null; then
ubus call network.interface.wan6 renew
echo "Bind #2"
fi
# rebind Dumy for #3
if echo -n $CID | grep "$ID3" >/dev/null; then
$DHCPV6CL -k -c$ID3 -s$SCRIPT -d -p$PID $IF
while [ ! -e "$PID" ]; do sleep 1; done
kill `cat $PID`
while [ -e "$PID" ]; do sleep 1; done
echo "Bind #3"
fi
# rebind NVR500 for #4
if echo -n $CID | grep "$ID4" >/dev/null; then
wget -q -O- --post-data=$'syslog debug on\r\nipv6 lan2 dhcp service client' http://nvr500-lan2.familyname/$CUSTOMAPI >/dev/null
while [ "$pf" = "" ]; do
    sleep 1
    pf=`wget -q -O- --post-data="show status ipv6 dhcp" http://nvr500-lan2.familyname/$CUSTOMAPI 2>/dev/null | grep prefix | sed 's/ *prefix: //'`
done
wget -q -O- --post-data="syslog debug off" http://nvr500-lan2.familyname/$CUSTOMAPI >/dev/null
echo "Bind #4"
fi
--------
---- odhcp6c-sh ----
#!/bin/sh
logger -t "odhcp6c-script" -s " Prefix=$PREFIXES Clinet-ID=$OPTION_1"
----
OpenWrtは、wget名のツールがインストールされているが「busybox」のwget相当ツールの為か、「--post-data=」の内容が正常に反映されなかった(OpenWrt 19.07.4)。「GNU Wget 1.20.3」をインストールして確認した。

(4)課題
PR-600MIが再起動した時にDHCPv6-PDの再取得用スクリプト実行の自動化。
現在は、手動実行なので、PR-600MIのDHCPv6から「reconfigure」メッセージを受信し、設計通りのPrefix設定が出来なかったら再取得のスクリプトを実行する。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ひかり電話 HGW PR-600MIのDHCPv6-PDをDHCPv6Relayで取得できるか確認

2021-07-20 17:00:00 | ひかり電話
ひかり電話 HGW PR-600MIとNTT-GW間のDHCPv6-PDをDHCP Relayを介して取得できるか確認した。

Wireshark のパケットキャプチャは、Netgear GS524Eのポート01にポート09と11をミラーした。PR-600MIのWANポートとUNIポートが接続されている状態で「情報」「DHCPクライアント取得情報」「DHCP再取得(IPoE)」のキャプチャ結果

「Solicit」「Advertise」「Request」「Reply」でPrefixや設定情報が取得できる。NTT-GWは、DHCP RelayでNGN内のDHCPv4/v6サーバ(NECのOID)から情報で応答。

1)DHCP Relay設定
PR-600MIからのDHCPv6プロトコルが直接NTT-GWへ到達しないように「ebtables」で遮断する
ebtables -A FORWARD -p 0x86dd -s 28:e9:8e:12:34:57 -o enp1s0f1 --ip6-proto udp --ip6-dport 547 --log-level notice --log-prefix "PR600MI DHCPv6 " --log-ip6 -j DROP
さらにIPv6パケットを完全遮断する
eatables -A FORWARD -p 0x86dd -i enp1+ -o enp1+ --log-level notice --log-prefix "IPv6 Block " -j DROP
ブリッジ接続されたPR-600MIとNTT-GWをDHCP Relayでアクセスするようプリッジポートbr0にISCのdhcrelayを稼働させる。
dhcrelay -6 -pf /var/run/dhcrelay.pid -l br0 -u FF02::1:2%br0
dhcrelayは「-u」インターフェースにグローバルアドレスが設定されていないと言う理由で起動しない。dhcp-4.4.2-P1のrelay.cをリンクローカルアドレスでも起動できるよう変更した。
dhcp-4.4.2-P1/relay/relay.c 
1617c1617
< 			log_fatal("Interface %s does not have global IPv6 "
---
> 			log_info("Interface %s does not have global IPv6 "


2)DHCP Relay結果
PR-600MIからの「Solicit」が「Relay Forward」される

NTT-GWは、DHCPv6 Relay Forwardをリレーしてくれないようだ。「Relay Reply」応答が無い。

3)改変したDHCPv6 Relayの動作
DHCPv6サーバーをenp7s0インターフェース(P07(PVID07/VL07/U))で起動し、P11(PVID08/VL08/U)をP11(PVID07/VL07/U)に変更してDHCPv6 Relay機能を確認。リンクローカルアドレス上稼働とRelay Forward/Relay Reply



 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ひかり電話 HGW PR-600MIがネットボランチDDNS登録をTCP廃棄する原因と対策

2021-07-03 14:00:00 | ひかり電話
2021年5月13日の自動バージョンアップで「ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合」が発生した。バージョンを戻す(01.00.0007->01.00.0005)事を考え、NTTの「0120-970-413」へ電話した(「0120-000-113」では、機器交換しか対応出来ないとの事だった)。結果、「0120-000-113」へ回される。そして、「バージョンを戻すfirm提供が出来ない」「技術者派遣で機器確認しか対応出来ない」との事。コロナ下で入室させ対面対応はお断りし、「様子見」で状態確認を進めていた。「ひかり電話 HGW PR-600MIのIPv6パケットフィルターがネットボランチDDNS登録をTCP廃棄」で「2409:10:XXXX:YY00::/64」からの通信不具合が発生したり、「ひかり電話 HGW PR-600MIのIPv6パケットフィルタを無効にしてもTCP廃棄発生」で、万策つき、再度問い合わせを行った。サポートの方曰く、チェックツールで確認すると「グローバルprefixが二つ登録されている(?)」との事。複数の機器からDHCPv6-PDを行なっているので履歴がそのようになっているのかもしれない。時間切れで翌日対応。PR-600MIのIPv6パケットフィルタ「無効」対応のFirewallゲートウェイを介さず確認したいとの事だったので、深夜にVLAN設定を変更し、Firewallゲートウェイを外した。PR-600MIのDHCPクライアント取得情報が「保存済み自動設定情報にて起動」で取得出来ない。この状態になるとリースタイムが切れるまで取得出来ない。2時間30分から3時間程掛かるので翌朝の確認とした。翌朝、NTTサポートから連絡があり、「グローバルPrefixの登録が一つになっている」と連絡、「2409:10:XXXX:YY00::/64」からの通信が正常になっている事を確認した。
ひかり電話 HGW PR-600MIのSPI設定とIPv6パケットフィルタ設定(IPoE)で不具合」を解決させるのが目的だが、「ひかり電話 HGW PR-600MIのIPv6パケットフィルタを無効にしてもTCP廃棄発生」なのでどうにもならない。NTTサポートから「IPv6ファイアウォール機能の無効化」が出来ない件、「IPv6パケットフィルタ設定(IPoE)が有効にならない」件について、製品担当部門へ要望を上げてくれるとの事で終了した。

(1)「2409:10:XXXX:YY00::/64」からの通信不具合時構成

ひかり電話HGW PR-S300SEのIPv6スループットを確認する」「ひかり電話 HGW PR-600MIのIPv6スループットを確認する」「ひかり電話 HGW PR-600MI のオフライン設定」と同様の構成で「ひかり電話 HGW PR-600MIのIPv6パケットフィルタを無効にしてもTCP廃棄発生」と同じ「ip6tablesによるFirewall」を構成している。
PR-600MIのLAN4から「2409:10:XXXX:YY00::/64」ネットワークに接続され、NVR510。NVR500、OpenWrtなどのルータが接続されている。ホームネットワーク機器は、NVR510配下の「2409:10:XXXX:YY10::/64」ネットワークに接続されている。NVR510のネットボランチDDNS登録は、WAN側アドレス「2409:10:XXXX:YY00:ae44:f2ff:feaa:bbcc/64」をソースアドレスとして登録する。「2409:10:XXXX:YY00::/64」ネットワークでは、PR-600MIからのRAとDHCPv6-PDでホストやルータのアドレスが決定される。「2409:10:XXXX:YY00::/64」からのIPv6パケットは、PR-600MIのLAN4ポートを経由し、ルーティングされ、WANポートからDebian10のbr0ポートへ送られる。Debian10でルーティングされbr0ポートからLinkLocalアドレス経由でUNIポートを介し、NTT-GWへ送られる。応答パケットも逆順でこの経路を通過する設計。

(2)不具合原因
Debian10のenp3s0ポートが「2409:10:XXXX:YY00::/64」ネットワークに接続されているため、このポートから応答パケットが「2409:10:XXXX:YY00::/64」の機器にルーティングされるためだった。ネットワークに接続されると「暗黙」で経路が経路テーブルに設定され、IPv6 neighbor cashに接続機器のMACアドレスが記録される。
tcp接続では、「syn」パケットがPR-600MI -> Debian10 -> NTT-GW経由で宛先ホストに到達、「syn/ack」パケットがNTT-GW -> Debian10 -> 送出ホストへ戻り、「ack」パケットがPR-600MIへ送られる。PR-600MIのSPIが「syn/ack」を確認していないため、「ack」パケットを「TCP 廃棄[パケットフィルタ]」した。
ping(icmpv6)は、応答パケットが、送出ホストに戻るため、疎通が確認されていた。

(3)不具合対策
ポリシールーティング(PBR)で解決を計ったが、うまくいかない。
PBR
/etc/iproute2/rt_tables
100    PR600
-----------------------
ip -6 rule add iif br0 table PR600
ip -6 rule add from 2409:10:XXXX:YY02::/64 table PR600
ip -6 route add default via fe80::212:e2ff:feab:cdef dev br0 table PR600
ip -6 route add 2409:10:XXXX:YY00::/56 via fe80::2ae9:8eff:fe12:3457 dev br0 table PR600
neighbor cashも分離できそうなVRF(Virtual Router and Forwarder)で確認してみた
VRF
ip link add Tvrf type vrf table 2
ip link set dev enp3s0 up
ip link set dev enp3s0 master Tvrf
ip -6 route add default via fe80::2ae9:8eff:fe12:3456 dev enp3s0 table 2
通過するパケットは上手くルーティングされるが、enp3s0で受けたパケット応答がenp3s0経由で送出されない。「ip -6 route show table 2」と「ip -6 route show vrf Tvrf」で結果が異なる(local routeが異なる)のでバグかもしれない。。。
Namespaceを試してみる
namespace
ip netns add net0
ip link set dev enp3s0 netns net0
ip netns exec net0 ip link set enp3s0 up
ip netns exec net0 ip -6 a add fe80::c225:e9ff:fe67:89ab/64 dev enp3s0
ip netns exec net0 ip -6 a add 2409:10:XXXX:YY00::1:110/64 dev enp3s0
ip netns exec net0 ip -6 route add default via  fe80::2ae9:8eff:fe12:3456 dev enp3s0
これは、上手く動作する。

(4)その他
firmwareのバージョンアップを契機に最初に発生した「ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合」に関して、再現しなくなってしまった。引き続き、状況を見守る事とした。firmwareの自動更新は、停止した。

・IPv6パケットフィルタ設定(IPoE)
・IPv6ファイアウォール機能の「無効」化

が改善されるか注視する。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ひかり電話 HGW PR-600MIのIPv6パケットフィルタを無効にしてもTCP廃棄発生

2021-06-09 22:00:00 | ひかり電話
PR-600MIのファームウェア 01.00.0007になってから
ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合」「ひかり電話 HGW PR-600MIのIPv6パケットフィルターがネットボランチDDNS登録をTCP廃棄」と不具合が発生している。ファームウェアを01.00.0005に戻すファームウェア提供もされない。
「詳細設定」「IPv6パケットフィルタ設定(IPoE)」の「IPv6セキュリティレベル」「IPv6ファイアウォール機能」を「無効」にしてみた。単純に無効にすると「China Telecom領域からのIPv6スキャンをフィルタする」が問題となる。そこで、「ひかり電話 HGW PR-600MIのIPv6スループットを確認する」で使用したDebian10サーバに「ip6tables」フィルタを設定してからPR-600MIのIPv6ファイアウォール機能を無効にした。


(1)ip6tables設定
このスクリプトを実行してip6tables設定を行う
go-filter
#!/bin/sh
## --- Multi Interfaces Gateway ---
# enp3s0/enp6s0/enp7s0
# br0 enp1s0f0 ( pr-600mi wan )
#       enp1s0f1 (pr-600mi uni )
## Link Local Address
NTTGW="fe80::0212:e2ff:feab:cdef"
XPSBR="fe80::215:17ff:fe34:abcd"
PR600WAN="fe80::2ae9:8eff:fe12:3457"
PR600LAN="fe80::2ae9:8eff:fe12:3456"
PREFIX="2409:10:XXXX:YY00::/56"
## --
ip6tables -F
ip6tables -X
ip6tables -N TCP
ip6tables -N UDP
ip6tables -N PR600TCP
ip6tables -N PR600UDP
##--- basic policies
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
# --- interfaces
ip6tables -A INPUT ! -i br0 -j ACCEPT
ip6tables -A OUTPUT ! -o br0 -j ACCEPT
ip6tables -A FORWARD ! -i br0 ! -o br0 -j ACCEPT
# --- enable statefull rules
ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# --- drop invalid state packet
ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP
ip6tables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
ip6tables -A FORWARD -m conntrack --ctstate INVALID -j DROP
## --- input chain
ip6tables -A INPUT -i br0 -p ipv6-icmp -s fe80::/10 -j ACCEPT
#ip6tables -A INPUT -i br0 -p ipv6-icmp --icmpv6-type echo-request -m conntrack --ctstate NEW -s $PREFIX -j ACCEPT
ip6tables -A INPUT -i br0 -p ipv6-icmp -m conntrack --ctstate NEW -s $PREFIX -j ACCEPT
ip6tables -A INPUT -i br0 -p udp -s $NTTGW  --sport 547 --dport 546 -j ACCEPT #dhcpd6
ip6tables -A INPUT -i br0 -p udp -s $PR600WAN --sport 546 -d ff02::/16 --dport 547 -j ACCEPT #dhclient
ip6tables -A INPUT -i br0 -p udp -m conntrack --ctstate NEW -d $PREFIX -j UDP
ip6tables -A UDP -p udp -m recent --update --rsource --second 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp6-port-unreachable
ip6tables -A INPUT -i br0 -p tcp --syn -m conntrack --ctstate NEW -d $PREFIX -j TCP
ip6tables -A TCP -p tcp -m recent --update --rsource --second 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset
ip6tables -A TCP -p tcp --dport 22 -j ACCEPT #ssh
ip6tables -A TCP -p tcp --dport 5201 -j ACCEPT #iperf3
#### -- dhcpd6 is no answer from decliner on the same server --- ####
ip6tables -A INPUT -i br0 -p udp -s $XPSBR --dport 547 -j DROP
# -- log
ip6tables -A INPUT -j LOG --log-level debug --log-prefix '[FW INPUT]: ' 
ip6tables -A INPUT -i br0 -p udp -m recent --set --rsource --name UDP-PORTSCAN -j REJECT --reject-with icmp6-port-unreachable
ip6tables -A INPUT -i br0 -p tcp -m recent --set --rsource --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset
ip6tables -A INPUT -j REJECT --reject-with icmp6-port-unreachable
#ip6tables -A INPUT -j REJECT --reject-with icmp6-adm-prohibited
## --- output chain
ip6tables -A OUTPUT -o br0 -p ipv6-icmp -d fe80::/10 -j ACCEPT
ip6tables -A OUTPUT -o br0 -p udp -s $XPSBR --sport 546 -d ff02::/16 --dport 547 -j ACCEPT
ip6tables -A OUTPUT -o br0 -p udp -s $XPSBR --sport 547 -d $PR600WAN --dport 546 -j ACCEPT 
ip6tables -A OUTPUT -o br0 -d $PREFIX -j ACCEPT
ip6tables -A OUTPUT -o br0 -s $PREFIX -j ACCEPT
ip6tables -A OUTPUT -j LOG --log-level debug --log-prefix '[FW OUTPUT]: ' 
## --- forward chain
ip6tables -A FORWARD -m conntrack --ctstate NEW -s $PREFIX -j ACCEPT
ip6tables -A FORWARD -i br0 -p ipv6-icmp --icmpv6-type echo-request -m conntrack --ctstate NEW -d ${PREFIX%%00::/[0-9]*}10::11:241 -j ACCEPT
ip6tables -A FORWARD -i br0 -p udp -m conntrack --ctstate NEW -d $PREFIX -j PR600UDP
ip6tables -A PR600UDP -p udp -m recent --update --rsource --second 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp6-port-unreachable
ip6tables -A PR600UDP -p udp -d ${PREFIX%%00::/[0-9]*}20::12:1 --dport 500 -j ACCEPT
ip6tables -A PR600UDP -p udp -d ${PREFIX%%00::/[0-9]*}20::12:1 --dport 4500 -j ACCEPT
ip6tables -A FORWARD -i br0 -p tcp --syn -m conntrack --ctstate NEW -d $PREFIX -j PR600TCP
ip6tables -A PR600TCP -p tcp -m recent --update --rsource --second 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset
ip6tables -A PR600TCP -p tcp -d ${PREFIX%%00::/[0-9]*}10::11:241 --dport 80 -j ACCEPT
ip6tables -A PR600TCP -p tcp -d ${PREFIX%%00::/[0-9]*}10::11:241 --dport 443 -j ACCEPT
# --- plala imaps servers
ip6tables -A FORWARD -i br0 -p tcp -m conntrack --ctstate NEW -s 2400:7800:0:502e::51 --sport 993 -j ACCEPT
ip6tables -A FORWARD -i br0 -p tcp -m conntrack --ctstate NEW -s 2400:7800:0:502e::52 --sport 993 -j ACCEPT
ip6tables -A FORWARD -i br0 -p tcp -m conntrack --ctstate NEW -s 2400:7800:0:502e::53 --sport 993 -j ACCEPT
ip6tables -A FORWARD -i br0 -p tcp -m conntrack --ctstate NEW -s 2400:7800:0:502e::54 --sport 993 -j ACCEPT
ip6tables -A FORWARD -j LOG --log-level debug --log-prefix '[FW FORWARD]: ' 
ip6tables -A FORWARD -i br0 -p udp -m recent --set --rsource --name UDP-PORTSCAN -j REJECT --reject-with icmp6-port-unreachable
ip6tables -A FORWARD -i br0 -p tcp -m recent --set --rsource --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset
ip6tables -A FORWARD -j REJECT --reject-with icmp6-port-unreachable


(2)PR-600MI(firmware version 01.00.0007)結果
IPv6ファイアウォール機能を無効にした後、二度再起動を実施した


セキュリティログ(IPv6)を確認すると

「有効」「無効」設定に無関係に「TCP 廃棄[パケットフィルタ]」が記録されパケットが廃棄される。

どういう事?
ソフトバンクの「IPv6 IPoE + IPv4(IPv6⾼速ハイブリッド)接続⽅式」では、ひかり電話HGWのIPv6ファイアウォール機能を無効にしろとしているが何も問題になっていないのだろうか?

01.00.0005に戻したい!

 
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ひかり電話 HGW PR-600MIのIPv6パケットフィルターがネットボランチDDNS登録をTCP廃棄

2021-05-22 10:00:00 | ひかり電話
公開アドレスのWebページがアクセス出来なくなった。
調べてみるとDDNSアドレスが更新されていない。DDNSは、NVR510のNetvolanteサーバーを利用しているので再登録を試みると

登録できない。

PR-600MIのセキュリティログ(IPv6)に「TCP廃棄[パケットフィルタ]」でNetvolanteサーバへの登録パケットが廃棄されている

「01.00.0005」では、登録されていた。「01.00.0007」からおかしい。。。
内部(イントラネット内)からインターネット(NGN網を含むグローバルアドレス)への通信は、基本「許可」だろう。SPIの不具合か?

NVR510以外に、OpenWrt上のDDNSからも登録ができていない。「2409:10:XXX:YY00::/64」のPrefixを持つ(PR-600MIのLAN側と同じ)機器からのアクセスがIPv6パケットフィルターで遮断されている。DHCPv6サーバ払い出しを全て停止しても状況に変化なかった。

その他の確認
VAIO(VJP131B01N)にDebian10を稼働させ、PR-600MIのLAN側に接続し、

「192.168.1.10/24」「2409:10:XXXX:YY00:2a48:9cba72e6:6d1」のIPアドレスを得る
・ぷららのWebサービスサーバー( http://www.plala.or.jp/ ) 「接続できず」 「セキュリティログ(IPv6)でTCP廃棄[パケットフィルタ]」
・ぷららのメールサーバー( v6mail.plala.or.jp:imaps ) 「接続できず」 「セキュリティログ(IPv6)でTCP廃棄[パケットフィルタ]」
・ping6/ping -6は、応答あり

「192.168.11.18/24」「2409:10:XXXX:YY10:d6be:1a00:ab70:42dd」のIPアドレスを得る
・ぷららのWebサービスサーバー( http://www.plala.or.jp/ ) 「接続」
・ぷららのメールサーバー( v6mail.plala.or.jp:imaps ) 「接続」

ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合」との関連が疑われる。
対策を検討するも術が無い。
「詳細設定」「IPv6パケットフィルタ設定(IPoE)」で「IPv6ファイアウォール機能」の「無効」が考えられるが、ポートスキャンの現実を考えると問題。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする