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。材料は、

Go by Example: Base64 Encoding

【Go】文字列のハッシュ値を取得する ( MD5, SHA, RMD160 )

パスワードの種はいかが?

話はころんと変わって、図書館から、『星空の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にするには、どうすれば良いのだろう? 調べてみるか。

OpenBSDでIPv6 IPoEを設定したときのメモ

Configuring IPv6 on OpenBSD

ふむふむナルホド。でも、元から来てないと無理。そして更に嫌らしい事は、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優先なんだろうね。 幾らオリンピック開いて先進国をアピールしてても、ネットは後進国です。そんな国は、もう放っておきましょ、なんだろうね。


This year's Index

Home