IPv6
password gen (2)
前回の最後に、ちょっとパスワード発生器を書いた。その時に昔の癖で、こんな風にした。
昔の流儀
n=$2 if [ "x$2" = "x" ]; then n=20 fi
第二引数が有るか無いかの確認。無い場合は、それを参照すると、空文字になる。それを比較しちゃうとまずい事が起こる。それを防止する為、両辺に、無駄な文字xを付け足しておくって言う技。昔ながらのやり方だ。
昔を知らない人は、なんでこんな事するんだろう? "x" って、どこから湧いてきたの? 意味有るのと悩むだろうよ。
test or [
そこでた、man test してみたよ。
at OpenBSD
DESCRIPTION The test utility evaluates the expression and, if it evaluates to true, returns a zero (true) exit status; otherwise it returns 1 (false). If no expression is given, test also returns 1 (false). The form [ is an alias for test. -n string True if the length of string is nonzero. -z string True if the length of string is zero.
stringがzeroってどゆ事? セコンド・オブザーバーしてみる。
at debian
-n STRING the length of STRING is nonzero -z STRING the length of STRING is zero
少し、実験してみる。
ob$ test -z "" ob$ echo $? 0 ob$ test -z "20" ob$ echo $? 1
ダメ出しで、test.cに当たってみる。
/* test(1) accepts the following grammar: oexpr ::= aexpr | aexpr "-o" oexpr ; aexpr ::= nexpr | nexpr "-a" aexpr ; nexpr ::= primary | "!" primary primary ::= unary-operator operand | operand binary-operator operand | operand | "(" oexpr ")" ; unary-operator ::= "-r"|"-w"|"-x"|"-f"|"-d"|"-c"|"-b"|"-p"| "-u"|"-g"|"-k"|"-s"|"-t"|"-z"|"-n"|"-o"|"-O"|"-G"|"-L"|"-S"; binary-operator ::= "="|"!="|"<"|">"|"-eq"|"-ne"|"-ge"|"-gt"| "-le"|"-lt"|"-nt"|"-ot"|"-ef"; operand ::= <any legal UNIX file name> */ struct t_op { const char *op_text; short op_num, op_type; } const ops [] = { : {"-z", STREZ, UNOP}, {"-n", STRNZ, UNOP}, : } static int primary(enum token n) { : switch (n) { case STREZ: return strlen(*t_wp) == 0; case STRNZ: return strlen(*t_wp) != 0;
ホップ・ステップ・ジャンプで、現場に到着した。オリンピックなんて見るより、こちらの方が楽しいと思うぞ(あくまで、個人の感想です)。
大事な事を忘れていた。いきなりtestが出てきたけど、ifの所には、testのかけらも無いぞ。 そう、testと言うコマンドは、使いやすい(コードを書きやすい)ように、[ と言う記号にリンクされてるんだ。そうなると、[ の終わりを、] で閉じたくなるのが人情。そこためのコードが、test.cの中に組み込まれている。
if (strcmp(__progname, "[") == 0) { if (strcmp(argv[--argc], "]")) errx(2, "missing ]"); argv[argc] = NULL; }
すっきりさっぱりと、このテスト句を使った方が、良いと思うぞ。
n=$2 if [ -z "$2" ]; then n=20 fi
ぶっ飛んだ方法
ここまでは、まあ普通のやり方だ。shell本を眺めていたら、もっと過激な書き方のヒントが載ってた。 $2が未設定なら、初期値の20を使え。設定されてたら、それを使えって塩梅。
n=${2:-20}
そうそう、変数名は、慣習で大文字にするってのも、出てたな。すっかり忘れていたわい。
おまけで、OpenBSDのkshのソースを見ていたら、bashの人のお好みもサポートされてた。shはkshにリンクされてるので、そのまま使えるかな。
ob$ echo $((3 * 10 - 4)) 26
大丈夫だったので、前回のスクリプトをさっぱりさせてみた。
#!/bin/sh # Usage: pg.sh mypassword [n] N=${2:-20} START=66 STOP=$(( $START + $N - 1 )) echo -n "$1" | openssl sha512 | openssl base64 | tr -d '\n' | cut -b $START-$STOP
このコードは、あくまで原型だ。自由に改造して、自分だけの秘密のパスワード発生機にするのが望ましい。STARTの66はソルトの積りで入れた、たまたま読んでいた小説に、アメリカの有名な国道、route 66 ってのが出ていたんで、記念に取り込んでみただけ。
ちゃんとしたSOLTで、自分だけの味付けをしてあげましょう。塩と言えば、伯方とか石垣島とか。【ソルトコーディネーターが教える】塩のおすすめ人気ランキング20選とか。まて、オイラーは高血圧なんで控えろって言われてる。ならば、塩と言いつつ、砂糖の銘柄でもいいぞ。まて、それも糖尿病の関係から。。。だったら、コーヒーぐらいでどうだ。酒でもいいしね。
こういう道具は、バックアップも作っておくべきだろう。純粋なWindows上でも動くやつ。そうだ、golangで作っておk。材料は、
パスワードの種はいかが?
話はころんと変わって、図書館から、『星空の16進数』なんて本を借りてきた。正直に告白すると、16進数に反応したって訳。題名大事だよ、世の中の作家さん。
どう16進数が登場するかと思っていたら、主人公は17歳のWebデザイナーさん。赤色とか青色って正確じゃない。 中は#8B4513に統一した、素敵なレストランだった。グラスの中の空間がきれいな赤に染まって行く。#9F1010ぐらいだろうか、なんて具合。
そうか、こういう表現使えるな。パスワードの種に、自分の好きな色なんて楽しいかも知れない。それも、ありきたりの色じゃ駄目だ。私の好きな色は、もえぎ色です、だれも考えつくな。
sakae@debian:~$ grep oli /etc/X11/rgb.txt 85 107 47 dark olive green 107 142 35 olive drab
生憎10進表示だけど、これを小説の主人公みたいに16進表示で使うとかしたら、いいんでないかい。
catch lo0
ループバックデバイス lo0 は、何時作成されるのだろう? ちょいと興味が有ったので、追跡してみる事にした。その為のqemu起動スクリプトを、下記のように用意した。
sakae@debian:~/sim/6.6-obsd$ cat atBOOT qemu-system-i386 -m 128 -s -S -serial pty -net nic -net user,hostfwd=tcp::2022-:22 disk
何の事は無い。普段使っている起動スクリプトに、 -S を加えただけである。このスクリプトで起動すると、GUIなコンソール画面が出てくるので、そうなったらgdbを起動して、次の操作をするだけだ。
sakae@debian:/usr/src/sys/arch/i386/compile/SA/obj$ gdb bsd.gdb GNU gdb (GDB) 9.1 : Reading symbols from bsd.gdb... 0x0000fff0 in ?? () (gdb) b loopattach Breakpoint 1 at 0xd0e983b0: file /usr/src/sys/net/if_loop.c, line 158. (gdb) c Continuing. Breakpoint 1, loopattach (n=0) at /usr/src/sys/net/if_loop.c:158 158 {
ちゃんと引数を伴って止まってくれた。どんな所から呼ばれているか、確認。
(gdb) bt #0 loopattach (n=0) at /usr/src/sys/net/if_loop.c:158 #1 0xd038cd45 in main (framep=0x0) at /usr/src/sys/kern/init_main.c:411 (gdb) up #1 0xd038cd45 in main (framep=0x0) at /usr/src/sys/kern/init_main.c:411 411 (*pdev->pdev_attach)(pdev->pdev_count); (gdb) l 406 rtable_init(); 407 408 /* Attach pseudo-devices. */ 409 for (pdev = pdevinit; pdev->pdev_attach != NULL; pdev++) 410 if (pdev->pdev_count > 0) 411 (*pdev->pdev_attach)(pdev->pdev_count); 412 #ifdef DIAGNOSTIC 413 pdevinit_done = 1; 414 #endif
仮想デバイスをまとめて作成してるね。 このデバイス群は、どこかにテーブルと言う形で、まとめられているはず。それを探してみる。
/usr/src/sys/arch/i386/compile/SA/obj/ioconf.c
int pdevnames_size = 41; struct pdevinit pdevinit[] = { { pfattach, 1 }, { pflogattach, 1 }, : { vndattach, 4 }, { gifattach, 1 }, { loopattach, 1 }, :
コンパイルしたエリアにソースが有るって事は、カスタマイズにより、状況が変わって来るんだな。このエリアいらないから、消そうと思っていたけど、残しておいて良かったわい。なお、それぞれの関数の後に列記されてる数字は、デバイスを幾つ作るかと言う指示書だな。
sys/sys/device.h
/* * Pseudo-device attach information (function + number of pseudo-devs). */ struct pdevinit { void (*pdev_attach)(int); int pdev_count; };
なんだ、ちゃんと説明書が有るじゃん。
こういう関数テーブルが手に入ると、タグジャンプでスイスイ飛んで行けるな。ソースをgrepなんて、もう必要無くなる。 上で出てきた、IPv6をトンネルするgifを見たら、
#define GIF_MTU (1280) /* Default MTU */ #define GIF_MTU_MIN (1280) /* Minimum MTU */ #define GIF_MTU_MAX (8192) /* Maximum MTU */
IPv6をトンネルするんだから、MTUは普段より大きくしてもいいよってなってる。古いルーターはこれに耐えられるのか?ちょいと心配だぞ。
sakae@debian:/usr/src/sys/arch/i386/compile/SA/obj$ ls -l *.c -rw-r--r-- 1 sakae fax 33 Feb 8 2020 gapdummy.c -rw-r--r-- 1 sakae fax 115695 Feb 8 2020 ioconf.c -rw-r--r-- 1 sakae fax 4671 Feb 8 2020 param.c -rw-rw---- 1 sakae fax 498 Feb 8 2020 vers.c
これが、カスタム・カーネルを作る時に自動作成されるファイル群か。これらは、デフォのソースを探しても、出てこない訳だな。こうやって、余計な無駄知識が増えていくとな。
IPv6
前回はIPv6の事が出てきたので、プチブームになってる。IPv6 readyにするには、どうすれば良いのだろう? 調べてみるか。
ふむふむナルホド。でも、元から来てないと無理。そして更に嫌らしい事は、WiFiなルーターも対応品にしないといけない事。今使ってるルーターは比較的新しいんだけど、サポートされていない。そして法定(我が家のね)耐用年数以内なんで、交換の認可はおりず。よって、しばらくこのままで行く。別に困ってはいないしね。 Wi-Fi 6/IPv6 IPoE対応無線LANルーターおすすめ5選 (WiFi6って、先行投資っぽいね)
そんな訳で、少々憂さ晴らしする。BSD業界にIPv6をもたらした功労者に萩野純一郎氏が居たって事は、前回書いた。その功績の一旦が残っていないか、発掘してみる。彼のハンドル名は、有名で itojun だった。
sakae@pen:/usr/src/sys$ find . -name '*.c' | xargs grep -l itojun ./net/if_gif.c ./net/if_spppsubr.c ./netinet/ip_ecn.c ./netinet/ip_input.c ./netinet/in4_cksum.c ./netinet6/ip6_input.c ./netinet6/in6_cksum.c :
一番最初に出てきた if_gif.c
を眺めてみるか。確かgifってデバイスは、v4とv6を橋渡ししてくれる、有り難いトンネルだったな。昔、このトンネルを使って、海の向うの竜宮城の亀さんが泳ぐ姿を眺めたような、記憶があるぞ。
/* $OpenBSD: if_gif.c,v 1.128 2019/10/04 05:00:49 dlg Exp $ */ /* $KAME: if_gif.c,v 1.43 2001/02/20 08:51:07 itojun Exp $ */
ファイルの冒頭に、こういうクレジットが入っていた。彼の遺作がしっかり継承されてます。ありがたい事です。
この最だからってんで、DISKに余裕のあるdebianにFreeBSDとNetBSDのソース一式も入れたよ。そして、全文検索してみると、あちこちに彼が出没してた。面白いなと思ったのは、FreeBSDの/usr/share/examples/IPv6に、USAGEと言う文書が置いてあった事。冒頭部分を挙げておく。
USAGE KAME Project $KAME: USAGE,v 1.33 2000/11/22 10:22:57 itojun Exp $ $FreeBSD$ This is an introduction of how to use the commands provided in the KAME kit. For more information, please refer to each man page. <<<ifconfig>>> A link-local address is automatically assigned to each interface, when the interface becomes up for the first time. Even if you find an interface without a link-local address, do not panic. The link-local address will be assigned when it becomes up (with "ifconfig IF up"). :
この後、gifの説明が出てきたり、あの頃ノートパソコンで主流だったPCMCIAでの注意点が出てきたりしてて、昔を思い出しちゃったぞ。
ndpってコマンドはv4で言うとarp相当なのか。
<<<ndp>>> To display the current Neighbor cache, use "ndp": % ndp -a Neighbor Linklayer Address Netif Expire St Flgs Prbs nr60.v6.kame.net 0:60:97:c2:80:bf ed0 expired S R 3ffe:501:4819:2000:2c0:cff:fe 0:c0:c:10:3a:53 ed0 permanent R paradise.v6.kame.net 52:54:0:dc:52:17 ed0 expired S R fe80::200:eff:fe49:f929%ed0 0:0:e:49:f9:29 ed0 expired S R fe80::200:86ff:fe05:80da%ed0 0:0:86:5:80:da ed0 expired S fe80::200:86ff:fe05:c2d8%ed0 0:0:86:5:c2:d8 ed0 9s R
v6に興味を持ったら、 IPv6の実装に必要な知識 こういう所から始めればいいんだな。 IPv6 Networking FAQ これNetBSDだけど、情報古いかな。
あっ、itojun氏は、生粋のBSD親父で、リナ方面に足跡はありませんでした。オイラーみたいに、ハイブリッドな子じゃ無かったわけね。偉いなあ。
IPv6 vs IPv4
素朴な疑問として、どちらが強いんだろう? ああ、平等なL3階層にいるから、どちらが優先されるかって質問が正しいか。
Windows10でIPv4とIPv6の優先度を変更する方法
このページにリナの場合はどうよってのが出てるな。BSDの場合は?
DNS引いた時、AレコードとAAAAレコードの2種が帰ってきた時も、この優先制御が適用されるの? それともアプリの思し召しによるの? ググる製のブラウザーだと、v6優先なんだろうね。 幾らオリンピック開いて先進国をアピールしてても、ネットは後進国です。そんな国は、もう放っておきましょ、なんだろうね。