トップ 最新 追記

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2021-07-05 [長年日記]

_ [FreeBSD][雑記]Firewall再構築

IPv6サポートのためにFirewallの再構築を実施

VLANも増えてきたので、DMZおよび境界制御ルールの記述パターンの標準化と 動的ルールの全面的な導入・tableおよびtagアクションオプションによる記述の圧縮などを実施

得られた知見をメモ

  • パケットに付けたtagは、divertルール等でカーネル外に出ると失われる (in-kernel nat actionでも同様にtagが剥がれる模様 2021-07-07 追記)
    • divertを挟んでの単純なtagベースのフロー制御は機能しない
    • tagged skiptoと組み合わせて、別々のdivertを潜らせるという解もあるが、性能を考えると設計で回避すべき
  • NATがある環境では、incommingとoutgoingでNAT通過後の内側アドレスが異なるので、動的ルールを使う場合はどのポイントで動的ルールを生成するか・ごのポイントで動的ルールアクションを発生するかを意識する必要がある
    • keep-stateの代わりにdefer-action付きのrecord-stateを用いることで、動的ルール生成とアクション適用点(check-state)を分離できる

境界ルーター上では、IPv6通信がつかえるようになった

実用レベルでIPv4 over IPv6を使うには、プロバイダー側がMAP-Eなのv4 NATの実装が面倒だし、外部からのIPv4着信を考えるとIPv4 PPPoE接続も維持して、用途によってIPv4経路を選択する必要があるので、routing tableの多重化を行い接続経路やjail/socketにFIBを設定する必要がある


2021-07-07 [長年日記]

_ [FreeBSD][IPv6]IPv6 gateway考察

WAN側のIPv6通信は確保したので、LAN側をどうするかの考察

技術的には以下のアイデアがある

  • WAN側から提供されるaddress prefixをLAN側で使う (LAN側にglobal unicast addressを付ける)
    • RA proxyによりWAN側のRAをLAN側に転送する
      • YAMAHA等のルーターアプライアンスにある機能
    • WAN側のNICからaddress prefixを切り出して、LAN側NICのrtadvdで配り直す (非常に稀なケースになると思われるが、途中でaddress prefixが変更された場合の対処を考える必要がある)
    • LAN内のDNS上のIPv6アドレスがWAN側のaddress prefix依存になる
      • IPv6初期に提案されていたDNAME/A6レコードによるaddress prefixとホストアドレスの分離は、非推奨になっているぽぃ
      • address prefix変更をトリガーにして、AAAAを動的に合成する実装が必要
  • LAN側にRFC4193 unique local unicast addressを与えて、境界ルーターでprefixを付け替える
    • ipfwだとNPTv6が該当
    • LAN内のAAAAレコードは、unique local unicastなので動的な変更を考慮しなくてよい

一番手がかからないのはYAMAHAルーターあたりを買ってくる(ついでにMAP-EなIPv4 over IPv6トンネルも開通する)辺りだが、LAN側にDNSで引けるIPv6アドレスを割り当てるなら次点はunique local unicastによる実装か?

_ [FreeBSD]sys/netinet/libalias/alias_db.cエンバグしてるぽぃ

久々にカーネルパニック(Fatal trap 18: integer divide fault while in kernel mode)で死んだ

バックトレースからsys/netinet/libalias/alias_db.cが怪しい

KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe00b27f30b0
vpanic() at vpanic+0x181/frame 0xfffffe00b27f3100
panic() at panic+0x43/frame 0xfffffe00b27f3160
trap_fatal() at trap_fatal+0x387/frame 0xfffffe00b27f31c0
trap() at trap+0x8b/frame 0xfffffe00b27f32d0
calltrap() at calltrap+0x8/frame 0xfffffe00b27f32d0
--- trap 0x12, rip = 0xffffffff808a68bc, rsp = 0xfffffe00b27f33a0, rbp = 0xfffffe00b27f33b0 ---
HouseKeeping() at HouseKeeping+0x1c/frame 0xfffffe00b27f33b0
LibAliasInLocked() at LibAliasInLocked+0x2f/frame 0xfffffe00b27f3470

おそらく当該コードは stable/13 390866d47effe8f5a11f3f852ae891f14dd4d15cで導入されたHouseKeepingの起床レートを処理パケットレートに基づいて調整するコードのコーナーケースと思われる

コーディング的には、kernel modeでの経時処理が重いので可能な限り処理パケット数で起床レートを制御し、直近約1秒の処理パケット数から平均毎秒3回の起床レートとなるようpacket_limitを制御するのが目的だが、パケットレートが低い場合に穴がある模様

  • packet_limitの更新コードにたどり着いた時点で、packetsはその時点のpacket_limitの整数倍
  • 3 * packet_limit > packets時には、packet_limitが引き下げられる
  • packet_limit3未満のケースでは、packet_limit = 0(非負の整数除算は切り捨て)に設定され、次回の呼び出し時にpackets % packet_limitで整数ゼロ除算で例外になる
  • 1packet/secへ向けて処理レートが減衰するケースでは、packet_limitの最短更新シナリオは、1000(初期値)->333->111->37->12->4->1->0で7秒ほどでpanicに至ると推定される

main現時点 では、治ってないぽぃ

修正は、packet_limitに下限値を設定しておく辺りか

user spaceのnatdを使っている場合は、デーモンが死んでNATが機能しなくなるものと思われる

void
HouseKeeping(struct libalias *la)
{
	static unsigned int packets = 0;
	static unsigned int packet_limit = 1000;

	LIBALIAS_LOCK_ASSERT(la);
	packets++;

	/*
	 * User space time/gettimeofday/... is very expensive.
	 * Kernel space cache trashing is unnecessary.
	 *
	 * Save system time (seconds) in global variable LibAliasTime
	 * for use by other functions. This is done so as not to
	 * unnecessarily waste timeline by making system calls.
	 *
	 * Reduce the amount of house keeping work substantially by
	 * sampling over the packets.
	 */
	if (packets % packet_limit == 0) {
		time_t now;

#ifdef _KERNEL
		now = time_uptime;
#else
		now = time(NULL);
#endif
		if (now != LibAliasTime) {
			/* retry three times a second */
			packet_limit = packets / 3;
			packets = 0;
			LibAliasTime = now;
		}

	}
	/* Do a cleanup for the first packets of the new second only */
	if (packets < (la->udpLinkCount + la->tcpLinkCount)) {
		struct alias_link * lnk = TAILQ_FIRST(&la->checkExpire);

		CleanupLink(la, &lnk, 0);
	}
}

2021-07-08 [長年日記]

_ [SAD]sequence utility

sequence container utilityを実装中

bsearchまで実装したので、delete操作を実装すれば、Complementは作れるはず

_ [FreeBSD][雑記]in-kernel NAT試験中

ipfw divert + natdの代わりに、ipfw in-kernel natを試験中

基本的な機能は、use_sockets/punch_fwオプションの類が無いぐらいでほぼ同じだが、微妙に挙動が違う

deny_in(deny_incoming)を指定しれないはずなのだが、divert/natd経由で観測されていたLISTENしてないポートへのincomming(攻撃) packetが見えない…

redirectしてるパケットは問題なく通信出来ている模様だが…

なにが違うのだろう? それとも時間帯か?


2021-07-09 [長年日記]

_ [SAD]Intersection/Complement再実装完了

一応、sort_utils.hとseq_utils.hを使ったIntersection/Complement実装が完了

これで、Sort/Union/Intersection/Complementに関しては、SADインタプリタスタックに依存せずに処理可能になったはず

_ [SAD]sequence utility

とりあえず、基本機能は実装完了

  • alloc/free/delete
  • List containerとの相互変換
  • sequenceのsort/union操作
  • 整列済みsequenceに対するbsearch

実装途中で整理が必要なのは

  • concat系 - catとncatに分けて整理する?

実用上必要なのが、

  • duplicate (alloc + catでも代用可能だけど、コーディング的には欲しい)
  • insert等の挿入操作系
  • 整列済みsequenceへの挿入点検索に必要なlower_bound系
  • Null頭部の展開付きのconcat系
    • stkall系の置き換え用途
      • Map実装を考えると insert系も必要か?
    • 再帰ありと再帰なしを個別に実装すべきかは、use caseを調べる
  • Map/Scan系の実装用途に container iterator

実用上、Join/Map関連が再実装できると、長いリストが気軽に扱える用になってGood

_ [SAD]stringbuf

実装の整理を目的にAPIよstring-buffer構造体の中身と動作の調査を開始…

コンソール向けに出力幅制御関連の妙な仕掛けが多く、関連コードが散らかっている・パラメータがilist配列のインデックスのみで無名なので、意味論の解読に骨が折れる Orz

_ [SAD]アイデアメモ(zero argument stack)

一部のイケてない実装 (arguemnt数確認前にstackを読み出すおバカさん)のために、関数コール前に zero arguement時に Nullを積み込んでいる実装の副作用で引数エラー回りの処理が面倒になっているので解決したい

アイデア段階だけど、次のような手順で直せばいいのでは?

  • Phase.1 - Nullをputするけど stack pointerは増やさない
    • まともなコードは、zero argumentとして認識する
    • イケてない実装は、Nullを読み出しエラーにはならない
  • Phase.2 - Nullの代わりに、参照解決時に必ずCoredumpするオブジェクトを積んでおく
    • ランタイムにイケてない実装コードを捕まえる実装
    • 最低1引数だと思って、isp - 1にアクセスするバカは何か変なものを食べる

_ [FreeBSD][IPv6]Load to IPv6 gateway

とりあえず、NPTv6の予備的な試験でipfwのcrashを見つけた int_prefix/nなprefixlen付き表記を使うと落ちる

ipfw nptv6 foo create ext_if em0 int_prefix ####::/64

int_prefixにprefixlenを含めず、別途prefixlenパラメータを指定するのはOK

sbin/ipfw/nptv6.cnptv6_createのバグで、nptv6_parse_prefixでデコードした結果にprefixlenが含まれる際にgoto check_prefix;でprefixlenの範囲を検査するコードに委譲するのだが、先方はprefixlenオプション直後のchar pointer pの指す内容も検査しているため、未初期化ポインタによる参照でcrashする

とりあえず、check_prefixラベルの前後にポインタ検査とplenの検査を分離して解決

やはり、main(14-CURRENT)も治ってないぽぃ

あまり使ったという話が流れてないので、誰も使ってないのかなぁ・・・

IPv6 LAN向けの検証作業

  • NPTv6
  • IPv6 gateway
  • unbound over IPv6
    • 設定の仕込み
    • 自動設定ツールのIPv6サポート
  • LAN側 RA および DNS cache server告知

2021-07-10 [長年日記]

_ [FreeBSD][IPv6]DNS v6化

とりあえずまとめ

  • unbound
    • 普通にinterfaceを増やせば良い
    • access-controlにIPv6アドレスの定義を追加するのを忘れずに
    • do-ip6でIPv6サポートが止めてある場合があるので、要確認
  • tinydns
    • v6パッチが当ててある場合は、env/IPにカンマ区切りでIPv6アドレスを追加すればOK
    • AAAAレコードの定義が独特なので各自対処のこと(0省略なし・コロン区切りなし)
      • tinydns-dataに処理させるMakefile側でsedとかを使って整形するのが現実的か?
  • axfrdns (TCP response for tinydns)
    • tinydnsと違いtcpserverからの起動なので、IP毎にtcpserverを立てる形式になる
      • v6パッチ付きucspi-tcpが必要
      • 最悪、intedから起動するのも有り
    • アクセス制御でprefixlenを指定出来ないので、実用的には48bit prefixもしくは64bit prefix毎にallow/denyを設定することになる
  • firewall
    • 境界でアドレス偽装パケットを弾いている場合、v4アドレス向けのnot address-range形式のdenyルールがv6パケットに適用されてないか要確認 (DNS通信試験時に嵌った)

_ [FreeBSD][IPv6]LAN側 IPv6接続性確保

rtadvd'およびDHCPv6 serverを立ち上げて、LAN側からIPv6アドレスを取得出来るところまでは確立

だが、外に出れない Orz

LAN側からWAN側にNTPv6でprefix変換して送出したパケットが戻ってこれない状況

原因は、回線側のルーターからNTPv6でprefix変換されてWAN側アドレスに対して近傍探索が届くが、WAN側のインターフェースに存在しないアドレスなので、応答しないため、回線側からWAN側インターフェースへの通信が開始されない模様

  • 動かすには、NTPv6同様のaddress prefix付け替え対応なND Proxyが必要?
    • Prefix Delegationで受けたときのND動作はどうなるのだろう?
  • NTPv6は標準化されたけど、IETF的には推奨してないらしぃ(おぃおぃ)

素直にNAT66で繋ごうにも、ipfwにNAT66は未実装な罠 Orz (pfは実装済みぽぃ)

回線側のサポートがあれば、DHCPv6-PDでWAN側からprefix delegationをもらってLAN側prefixを設定できるが、光電話契約してないので無理 (KAMEの影響か、BSD系の設定例はWIDE DHCP clientを使ったものが多い様だ)

回線契約形態で、prefix delegationの振り出し状態が変わるということは、ND動作を考えると、回線側のルータ設定も連動して変更されていて、prefix block単位でroutingされているのかなぁ…

NAT66のためだけにipfwからpfへ切り替えるのも面倒くさそう…(YAMAHAルーター買ってくるか?)

まあ、socket pid/gid filteringは止めたのでipfwでないと困る理由もなくなったのだが

_ [FreeBSD][IPv6]LAN側IPv6フィルタリングの考察

DHCPやlink localな通信を先に許可した後、残りの通信に対してLAN側に割り当て済みのアドレステーブルを使って

  • deny from not table(LAN-ips) to any in recv if-LAN
  • deny from any to not table(LAN-ips) out xmit if-LAN

なフィルターを仕掛けているが、DHCPv6-PDでglobal-prefixをLAN側に告知した場合、globalな通信に関したWAN側と同じprefixが付くのでフィルターに引っかかってしまう

global-prefixをもらってくるか、さもなくばglobal IF同様にglobal-unicastを通過させるしかないか…

global-prefixを抜き取るアイデアとしては、rtsoldを改造して、M/O/Rオプションで外部scriptを起動するように、RA-prefixを受け取った時に外部scriptを起動させるという案がある


2021-07-12 [長年日記]

_ [FreeBSD][IPv6]ipfwからpfへ乗り換え

乗り換え作業中…

pfに関しては、pf.confの文法が本家OpenBSDにて途中で変わっていることもあって、ネット上の資料を読む際は要注意

あと、アドレスの代わりにインターフェース名(+装飾)でインターフェースアドレスやネットワーク・ブロードキャストアドレスを参照する機能があるが、natdのdynamicオプションやipfw_natのifオプションのように動的に適用されるのではなく、pfctlからルールをロードする際に展開してからコンパイル・最適化しているようなので、動的に生えるインターフェースに適用するにはanchor等でインターフェースが生えた時にルールをロードさせる or テーブル参照にしておいて、テーブルへのアドレス追加・削除で対応する等の策が必要な模様

これに関連して、proto icmpなルールで嵌る

例えば、

pass in on IF proto icmp from any to IF

だと、IFにv6アドレスがあると"to IF"がv6アドレスにも展開されるので、IPv6にはicmp(icmpはICMP/IPv4の事で、ICMPv6はicmp6)が無いのでエラーになる 逆に、v6インターフェースIPv6

pass in on IFv6 proto icmp6 from any to IFv6

は機能するが、v4アドレスを追加すると問題が発生する


2021-07-13 [長年日記]

_ [SAD]sequence utilityの追加実装

追記・挿入系の基本操作の整理

concatinateは、sequence後方に領域を確保するrealloc操作と、contentsへの上書きコピー操作で構成されているが、insertなどの処理も含めて一般化を考えると、以下の3種類の基本操作の組み合わせと解すべき

  • realloc - 後方領域の追加
  • move - 部分列の後方への移動(sequence途中に穴を開ける)
  • copy - sequenceの任意位置へのcontents列の上書き

3種のうちreallocはallocation APIとして実装済みなので、残り2種類を実装する

APIの基本形は

  • seq_move(seq, src-begin, src-end, dst-begin)
  • seq_copy(dst, dst-begin, src, src-begin, src-end)

書き込み先領域後端が、sequence containerからあふれる場合は、自動拡張される方が使い易いか?

また、大きなhole gapを開ける操作をサポートするにはdst-beginがsequnce contents後端より後ろを指すことを許容すべきだが、負のindexが指定された場合の解釈はどうするか?

現行仕様では、contents終端(n)と確保済みの長さ(nmax)を保持するのみで、realloc等で要求した長さは保持していない

_ [SAD]get*stkallのユースケース確認 (作業項目)

list containerの要素をスタックに展開するget*stkall系のユースケースを収集・分類し、sequence ulitityやiterator utilityの設計に反映させる


2021-07-14 [長年日記]

_ [FreeBSD][雑記]in-kernel NATについて

in-kernel NAT試験でnatd + ipfw/divertとipfw in-kernel NATでincomming packetに対する挙動が異なる件だが、原因判明

sysctl net.inet.ip.fw.one_pass1(default)だと、natアクション作用後にパケットはipfwに戻ってこない

nat configでdeny_inオプションが指定されてない場合は、NATテーブルによる逆変換・redirectを受けなかったincommingパケットは破棄されず(deny_inなら破棄される)・ipfwにも戻らないので、inet層に届くことになり実質的に変換されないパケットにpassアクションが適用されたことになる Orz

divertアクションはsysctlによらずipfwに戻ってくる動作と比べると、分かりづらい挙動であるので要注意


2021-07-15 [長年日記]

_ [FreeBSD]libalias panicの件

libaliasエンバグの件だが、 治った模様


2021-07-19 [長年日記]

_ [SAD]multi-turn trackingの検討事項

beamline先頭・末尾の要素がOFFSET付きのMARKerで、要素内部を指しているケースで、multi-turn trackingを行う場合に周回trackingでの停止位置・開始位置をどうするか?

  • 実装上の問題として、周回毎にbeamline先頭・末尾でpartial element trackingを行うにはglobal scopeにあるelement parameter storageを書き換え・復元を行う必要から同期バリアが必要でコストが高い
  • multi-turn trackingを行う状況では、beamline先頭・末尾が物理的な同一性を持っているはずなので、同一要素の後半部・前半部を個別にpartial element trackingするのは、演算コスト的に無駄が多い
    • また、丸め誤差の累積の観点からは、その他の動作フラグで丸めの適用数が変わるので、先頭・末尾要素の分点数を制御する意味が薄い

先頭・末尾のどちらかでfull element trackingを実施して、反対側のpartial elementは省略するのが筋が良さそうだが、意図的に変態モデリングされてるケースはどうすべきだろう?


2021-07-20 [長年日記]

_ [FreeBSD][IPv6]IPv6開通

ipfwからpfに切り替えて、NAT66を導入してLAN側のUnique Local AddressからNAT66経由でWAN側のIPv6 worldに到達を確認

やはり、コア時間帯は、PPPoEなIPv4 downlinkの帯域とジッターがぼろぼろなので、IPv4 over IPv6 (MAP-E)の導入を考えるべきか…

DynamicDNSで外部公開しているサービスを考えるとMulti FIB構成で、Jail側のサービスをPPPoEルート、一般のIPv4通信をIPv4 over IPv6側に送る構成にしたい

とりあえず、MAP-Eのパラメータ設定と境界ルーターの情報を調べないと…Orz


2021-07-21 [長年日記]

_ [FreeBSD][IPv6]IPv4 over IPv6 (MAP-E)

別FIB上で、試してみた

まずは、IPv6のWAN側のGlobal Unicast Addressから、MAP-Eに必要なパラメータを手に入れる (例えば、 http://ipv4.web.fc2.com/map-e.html )

  • 境界リレー(BR)のIPv6 Address
  • 加入者側終端(CE)のIPv6 AddressとIPv4 Address
  • PSID offset/PSID length/PSIDの三つ組(ポート変換のパラメータ)

IPv4アドレスが不足気味なので、CE IPv4 addressは固定値になる模様

最低限の設定は、以下の通り

  • gif tunnel構築 (CE-IPv6-address -> BR-IPv6-address) / upすることを忘れずに
  • pfctlにnat on gif from <lan-ip4> to any -> CE-IPv4-address map-e-portset PSID-offset/PSID-length/PSIDを追加 (nat-anchorへ差し込む)
  • WAN側IPv6インターフェースに CE-IPv6-addressを追加
    • 追加しないとgifで通信できない (BR側からCE-IPv4-addressとport番号内のPSIDから誘導されるCE-IPv6-addressへカプセル化されたパケットが送られてくる)
  • IPv4 default routeにgif0を設定 (とりあえず、試験用の別fibで実装)

setfibして、fetch等でIPv4系にリクエストすると、IPv4 over IPv6(MAP-E)経由で降りてきた

ただし、手元の実験だとbind-addressオプションでLAN側のIPから発信しないとうまく通信出来ない?

どうやら起こっているのは、以下の状況の模様

  • gifトンネルのこちら側に、CE-IPv4-addressを付ける - 送出時のソースにCE-IPv4-addressが選択され、natルールのfromマッチから漏れる変換されないので、MAP-Eの規約を満たしたsrc portが選択されない (戻りのパケットが別のCEへ送られる)
  • gifトンネルにIPv4アドレスを付けない - 送出時のソースアドレスに0.0.0.0が選択され、natで変換されないケースでは戻り先が不明、変換されてもnatで逆変換した後の戻し先が分からない Orz

したがって、gifトンネルを保持するホストからIPv4 over IPv6 (MAP-E)で通信を行うには、下記の条件が必要

  • gifトンネルのこちら側に、到達可能なIPv4アドレスを付ける必要がある (natで逆変換した戻りパケットがルーティング出来る)
  • gifトンネルのこちら側に付けたIPv4アドレスは、natの変換対象でなければならない (MAP-Eではsrc portが制限されている)
    • CE-IPv4-addressを使う場合、natfromマッチルールにinterface addressを追加する必要がある
      • ルール記述的にこちらの設定が素直
    • LAN内のprivate addressのaliasを割り付ける (nat動作的には、LAN側のnetworkからの通信と同様に処理できる)
      • このケースでは、natルールの定義でトンネル終端アドレスをインターフェース名で参照出来ない

CE-IPv4-addressをgifトンネルに張り付ける場合の、pf natルール (<lan-ip4>は、LAN内のアドレス集合)

nat on gif# from gif#:0 to any -> gif#:0 map-e-portset offset/length/PSID
nat on gif# from <lan-ip4> to any -> gif#:0 map-e-portset offset/length/PSID

実運用では、変換し損ねた内部アドレスが漏れないように、境界でのアドレスクラスフィルタリングを実施すること

運用上の考察

  • IPv4のdefault gatewayをMAP-EとPPPoEの接続状況に応じて切り替える必要がある
    • 特にリンクダウン時の取扱いが必要
  • 外部から着信したIPv4パケットを着信したリンクに送り返す必要がある
    • IPv4サービスを提供するPPPoE側から入ってくるパケットはPPPoE側に返す必要がある
    • pfのreply-toオプションで接続状態にリンクを含める or 外部着信サービスのFIBを切り替える
    • reply-toオプションベースなら、accept anchorにリンク固有の着信ルールを追加する?
  • IPv4パケットに対するMAP-EトンネルのMTUは、IPv6トランスポート層があるので短くなるが、PPPoEのようにmpd側でTCP MSSが修正されない
    • 他のインターフェース経由のTCP通信を中継する場合には、MSSを修正する必要がある
    • gifトンネルのデフォルトMTUは、1280オクテットなのも注意 (適当な値に再設定することも要検討)
      • OCN MAP-E/IPv6 WAN MTU 1500の環境での実測だと、gif tunnel上のIPv4 MTUは1460オクテット(1500 - 40/IPv6ヘッダ)で理論通り
      • フレッツ網上のIPv4 PPPoEのMTU 1454より少し広い模様
  • IPv6 WANインターフェースをproto ipencapなBR-CE間の通信が通過する
    • BR/CEアドレスは、gifトンネル側にあるが、pf.confのインターフェース名+修飾子ではgifトンネルのパラメータは参照出来ないので、ルールを記述するなら明示的にBR/CE IPv6アドレスを記述する必要がある
    • CE->BRの送信トラフィックに関しては、pass outな総括ルールがあれば、通信が続く限りkeep-stateされるはずなので、内側から外へ行くケースではあまり問題にならないはず
    • BR->CEの着信トラフィックを確実に受信するには、anchorへpass in quick on gif inet6 proro ipencap from BR to CEなルールを挿入すること

当面の作業目標

  • anchorルールで、reply-toオプション付きのacceptルールを運用開始する(自動設定系を作る)
  • PPPoEデーモン(mpd)からdefault routeの設定を分離して、linkup/down時に自前でdefault routeの追加・削除を行う
    • multi FIB構成をサポートする
    • 各FIBのdefault routeの設定状況・経路に応じて、default routeの更新を行うか否かを選択する機能を実装する
      • 例えば、gif側(MAP-E)がdefault routeの際にはdefault routeを更新しないなど

2021-07-23 [長年日記]

_ [FreeBSD][IPv6]PPPoE vs IPv4 over IPv6

7/23 18:55頃測定

Connection Down Up ping www.google.co.jp
IPv4 PPPoE 49.22Mbps 80.42MBps 9.804/14.806/25.310/5.180 ms (drop 1/20)
IPv4 over IPv6 89.22Mbps 78.46Mbps 10.149/10.693/14.603/0.916 ms (drop 0/20)
IPv6 89.64Mbps 83.30Mbps 10.225/10.621/12.651/0.508 ms (drop 0/20)
  • IPv4 PPPoEの下り側帯域の減少とRTTジッターの増加が確認出来る
  • IPv4 over IPv6とIPv6はほぼ同じ特性

2021-07-24 [長年日記]

_ [FreeBSD][IPv6]IPv4 over IPv6運用開始

設定スクリプトの自動化実装完了し、default FIBのdefault routeをIPv4 over IPv6(MAP-E)に切り替え実施

接続スクリプトの主たる機能

  • PPPoE linkup/linkdown時に、default FIBにMAP-Eなdefault routeが存在する際は、default FIB側のdefault routeを変更しない
  • MAP-E linkdown操作時に、PPPoEがlinkup状態の時はdefault FIBのdefault routeをPPPoEへ切り替え
  • MAP-Eパラメータ(BR/CE-address & PSID)は、WAN側IPv6 prefixからテーブルマッチで検索し、検索失敗時はIPv4接続はPPPoEへfallbackさせる
    • 現時点では、v6 prefixからの自動計算スクリプトが未実装
    • v6 prefixは滅多に変わらないので、これで充分機能する

一応、経路試験用にFIB 1は、PPPoE側をdefault routeに指定

実は、RAで自動設定されるIPv6のdefault routeは、default FIBにのみ設定されているので、そのままではdefault FIB以外ではv6で外に出られない罠

後、v6 gatewayのnexthopアドレスが、Link Local Unicastになっているので、そのままsetfib 1 route -6 add default fe80:...%IFで登録しても、v6パケットの送り先がNexthopのLink Local Unicast Addressを向かず通信出来ない

どうやらdefault routeをNexthop Link Local Unicastへ向ける前に、route add nexthop-link-local-unicast -iface interfaceでdefault routeへ登録するNexthop Link Local Unicastがどのinterface上に居るかを登録すれば流れるっぽぃ


2021-07-29 [長年日記]

_ [FreeBSD][IPv6]LAN側のゾーン情報にv6アドレスを追加

tinydnsのゾーン情報にIPv6アドレスを追加を実施

tinydns-dataの扱うv6アドレスは省略無し・コロン無しの16進数32桁なのでそのままだと面倒この上ない

エントリ名とIPv4アドレス・EUI64アドレス・MACアドレスの対応表から、64bit prefixを繋げてIPv6アドレスエントリを生成したり、64bit prefixから誘導されるv6の逆引きゾーン名をマクロで参照してSOAエントリを生成するtinydns-dataのプリプロセッサをshell scriptで作成した


カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記