ping, dhcp
『サイン・署名のつくり方』(スモール出版)なんて本を読んだ。
別にオイラーが、ピコ太郎みたいに中年アイドルを目指して、マイサインを持とうと思った 訳ではない。単に面白そうだったから。
日本は今まで印鑑が中心。(殿様は、花押と言うサインを持ってたけど)それが近頃は サインも勢力を伸ばしているとか。宅配便の受け取りは、大体サインでOKになったし、 クレジットカードは元々サインだったし。頑なに印鑑文化を守っているのは、お役所と 銀行の類ですかね。
著者は、印鑑なんて盗まれたら、それで終わりじゃん。それに対しサインは、本人の 筆致が他人に真似るのが極めて難しいとの事。そう言えば、サイン認証なんてのも 有ったような無かったような。。。どうでっしゃろか? インターフェースの街角の 人。
署名は、アルファベットにするか漢字にするか? 日本名をアルファベットにすると 長くなるので、名を1文字にしちゃうとかの工夫が必要。そうしないと書くのに えらく苦労してしまい、サインの利便性がが落ちる。
ならば漢字か、氏名は、平均して4文字ぐらいらしい。でも、漢字は画数が多いもの もありからなあ。一一 こういう氏名の人っているのかしら。いち はじめさん。 これなら、2画だけど、逆に、サインをデザインするのは難しい?
こういう時は、連想を働かせて、新しいイメージを作るのだそうだ。サインは氏名が 基本だけど、そうしなければならない決まりがあるわけではない。あくまで、本人を 同定するシンボルなんだから。
画数を減らす為の第一歩は、草書体の省略方法を参考にするのが定番らしい。
あとは、それをデザインしていく。サインはアートだとも言うらしい。いよいよ困ったら
こちらにご相談。サインを練習するには、万年筆が良いらしい。ボールペンだと 滑り過ぎて、難しいそうだ。
matzさんのサイン。どれぐらい練習されたんだろう? 家にサイン本が6冊も有ったぞ。
問題提起
前からやってるOpenBSDの中に仮想PCを作って、そこにOpenBSDを入れるやつ。 どうしてもネットワークインストールが前提になる。その為の足場作りで、NICに IPアドレスを振る必要がある。普通はdhcpサーバーからIPを貰ってくるんだけど、 それが下記のように失敗するんだ。失敗するんで、ふて寝という暴挙ですよ。
Available network interfaces are: vio0 vlan0. Which network interface do you wish to configure? (or 'done') [vio0] IPv4 address for vio0? (or 'dhcp' or 'none') [dhcp] DHCPDISCOVER on vio0 - interval 1 DHCPDISCOVER on vio0 - interval 1 DHCPDISCOVER on vio0 - interval 1 DHCPDISCOVER on vio0 - interval 1 DHCPDISCOVER on vio0 - interval 1 No acceptable DHCPOFFERS received. No working leases in persistent database - sleeping.
そこで、手動でIPを振る。 VMware Player の NAT ネットワークを極める を見ながら、DHCPサーバーの管理外のアドレス、xxx.xxx.xxx.100/24 を振ってあげた。 そして、親機にピン。
# ping -i 1 xxx.xxx.xxx.130 PING xxx.xxx.xxx.130 (xxx.xxx.xxx.130): 56 data bytes 64 bytes from xxx.xxx.xxx.130: icmp_seq=1 ttl=255 time=436.899 ms 64 bytes from xxx.xxx.xxx.130: icmp_seq=2 ttl=255 time=1573.782 ms : 64 bytes from xxx.xxx.xxx.130: icmp_seq=9 ttl=255 time=819.243 ms 64 bytes from xxx.xxx.xxx.130: icmp_seq=10 ttl=255 time=1031.985 ms --- xxx.xxx.xxx.130 ping statistics --- 12 packets transmitted, 10 packets received, 16.7% packet loss round-trip min/avg/max/std-dev = 187.726/1104.959/2231.708/703.837 ms
パケットが何処かをさ迷っているみたいだ。親機のHUBポートの所で、パケットを モニターしてみる。
bash-4.3# tcpdump -i bridge0 icmp tcpdump: listening on bridge0, link-type EN10MB 15:51:19.133379 xxx.xxx.xxx.100 > xxx.xxx.xxx.130: icmp: echo request 15:51:19.133403 xxx.xxx.xxx.130 > xxx.xxx.xxx.100: icmp: echo reply : 15:52:49.977165 xxx.xxx.xxx.100 > xxx.xxx.xxx.130: icmp: echo request 15:52:49.977187 xxx.xxx.xxx.130 > xxx.xxx.xxx.100: icmp: echo reply
親機は、要求が来れば、速やかに返答してる。でも、リクエストの間隔が随分と ばらついているな。仮想PCの計時機能が壊れているの? 初期時刻は、CMOS時計から得るけど、一旦カーネルが動き出せば、OSが管理する タイマー類で時間管理が行われるはず。どうも解せないな。
軽くpingのコードを眺めておく。iオプションで指定される時間間隔でpingする。 それに対するpongの時間を測っているのだな。ピンポンとは書いてないので、 コードした人は、卓球を知らない人だな。
pingerがパケットの送出ルーチン。現在時刻を埋め込んでいる。そして、 pr_packが受信した結果を表示するルーチン。
受信したサイズやらシーケンス番号とか、送出時刻を取り出し、現在時刻からの 差を取って、パケットが往復するにかかった時間を表示してる。
パケットの最大待ち時間は、デフォで10秒に設定されてた。いやー、コードを 読むと色々な事が分かって楽しいな。例えば、洪水を発生させるとか。これを やるには、巨大な権力が必要。権力者は迷惑な存在ですよ。
これ以上深入りも出来そうも無いので、dhcpのおさらいでもして、お茶を濁して みるかな。
オイラーのつたない記憶では、IPをプールしてるDHCPサーバーからIPをリースするのが dhclientの役目。
最初は、IPが振られていないので、普通の通信は出来ない。そこで、パケットに 自分のMACアドレスを入れて、誰がDHCPサーバーさん? 答えて頂戴とやるはずだったな。 それから先の事は、すっかり失念してる。再勉強するか。
使う道具も復習しておく。
dhcpサーバーとのやり取りを盗みみる
早い話が、盗聴ですな。
先ずは、dhcpサーバーとのやり取りがどんな風に行われるか、同一サブネットに属する 別のマシン(アドレス自動取得)を起動して調べてみる事にした。
tcpdumpでモニターしつつ、別マシンを起動。起動したら、パケットのやり取りは終了 してるはずなんで、CTRL-Cでtcpdumpを停止する。
bash-4.3# tcpdump -s 1024 -w LOGether tcpdump: listening on em0, link-type EN10MB ^C 166 packets received by filter 0 packets dropped by kernel
余計なパケットも拾っているので、DHCPに属するパケットだけフィルターしよう。 そのパケットはどういう名前で呼ばれているのかな?
bash-4.3# grep dhcp /etc/services dhcpv6-client 546/udp # DHCPv6 client dhcpv6-server 547/udp # DHCPv6 server dhcpd-sync 8067/udp # dhcpd(8) synchronisation bash-4.3# grep boot /etc/services bootps 67/tcp # BOOTP server bootps 67/udp bootpc 68/tcp # BOOTP client bootpc 68/udp
IPv4とIPv6では違うポートを使うのね。そんなの知らなかったぞ。
bash-4.3# tcpdump -r LOGether | grep boot tcpdump: WARNING: snaplen raised from 116 to 1024 05:07:36.926080 0.0.0.0.bootpc > 255.255.255.255.bootps: xid:0x5bdebc25 vend-rfc1048 DHCP:DISCOVER RQ:xxx.xxx.xxx.128 PR:SM+BR+TZ+121+DN+NS+HN+YD+YS+NTP+MTU+119+DG+121+249+SR+252+NTP CID:255.41.31.148.26.0.4.115.102.88.86.179.253.77.49.133.155.191.12.106.119.48.111 [tos 0x10] 05:07:37.930022 xxx.xxx.xxx.254.bootps > xxx.xxx.xxx.128.bootpc: xid:0x5bdebc25 Y:xxx.xxx.xxx.128 S:xxx.xxx.xxx.254 vend-rfc1048 DHCP:OFFER SID:xxx.xxx.xxx.254 LT:1800 SM:255.255.255.0 BR:xxx.xxx.xxx.255 DN:"localdomain" NS:xxx.xxx.xxx.2 DG:xxx.xxx.xxx.2 [tos 0x10] 05:07:37.934095 0.0.0.0.bootpc > 255.255.255.255.bootps: xid:0x5bdebc25 vend-rfc1048 DHCP:REQUEST SID:xxx.xxx.xxx.254 RQ:xxx.xxx.xxx.128 PR:SM+BR+TZ+121+DN+NS+HN+YD+YS+NTP+MTU+119+DG+121+249+SR+252+NTP CID:255.41.31.148.26.0.4.115.102.88.86.179.253.77.49.133.155.191.12.106.119.48.111 [tos 0x10] 05:07:37.934866 xxx.xxx.xxx.254.bootps > xxx.xxx.xxx.128.bootpc: xid:0x5bdebc25 Y:xxx.xxx.xxx.128 S:xxx.xxx.xxx.254 vend-rfc1048 DHCP:ACK SID:xxx.xxx.xxx.254 LT:1800 SM:255.255.255.0 BR:xxx.xxx.xxx.255 DN:"localdomain" NS:xxx.xxx.xxx.2 DG:xxx.xxx.xxx.2 [tos 0x10]
どうやら4パケットやり取りされてるようだけど、何の事やら? こういう時はGUIなツールの 出番だろう。Wiresharkを入れたら、Qtの関係者までごっそり付いて来て、げんなり しましたよ。毎度々、GUIは舞台設定が大変ですなあ。
# wireshark LOGether
毎度、あちこち押す所が有って悩むんだけど、どうやらパケットの表示のすぐ右上に 有る、矢印の右側のExpressionを押して、パケットを絞りこむようだ。押すと、 フィールドネームがわんさか出てくるので、下のSearchからbootとでも入れると、 BOOTP/DHCPが出てくるので選ぶ。OKを押すと、bootpが緑色の背景で検索窓に 表示される。背景が赤とかだと、お前アホかって事なんだろうな。
続いて、右矢印を押すと、grep相当が実行されて、パケットが絞り込まれる。 おお、パケットの意味論を分かりやすく図解してくれたぞ。
大まかには、Discoverして、Offerがなされる。それに対するRequestが発しられて サーバーからACKを受けて、完了とな。
で、本番。仮想PC側からリクエストが行くんだけど、それが親hostからも発せられてる。 オファーパケットが返ってくるんだけど、それを親が横取りして破棄しちゃうんだろうな。 だから仮想PCにはいつまで経っても、オファーパケットが届かないという事になるんだな。
親が余計な事をしないようにしないと、いつまでたってもこの問題は解決しないわな。 こういうのは、パケットを眺めてみなと分からん。測定器重要。
13:42:13.717265 0.0.0.0.bootpc > 255.255.255.255.bootps: xid:0xbb8bbb0d vend-rfc1048 DHCP:DISCOVER HN:"vm" PR:SM+BR+TZ+121+DG+DN+119+NS+HN CID:1.254.225.186.208.230.35 [tos 0x10] 13:42:13.717348 xxx.xxx.xxx.130.56945 > 255.255.255.255.bootps: (request) xid:0xbb8bbb0d vend-rfc1048 DHCP:DISCOVER HN:"vm" PR:SM+BR+TZ+121+DG+DN+119+NS+HN CID:1.254.225.186.208.230.35 [tos 0x10] 13:42:14.719270 xxx.xxx.xxx.254.bootps > xxx.xxx.xxx.144.bootpc: xid:0xbb8bbb0d Y:xxx.xxx.xxx.144 S:xxx.xxx.xxx.254 vend-rfc1048 DHCP:OFFER SID:xxx.xxx.xxx.254 LT:1800 SM:255.255.255.0 BR:xxx.xxx.xxx.255 DG:xxx.xxx.xxx.2 DN:"localdomain" NS:xxx.xxx.xxx.2 [tos 0x10]
Where is dhcp server
ふと気になって、dhcpなサーバーってどうやって探し出すか調べてみた。 dhcp-discover 本家にスクリプトが置いてあったぞ。でも、出来心なんで、そんな高級なものでなくても良い。 簡易的には、下記のようにするみたい。
味噌は、UDPで探せですね。
[sakae@fb11 ~]$ sudo nmap -sU xxx.xxx.xxx.0-254 -p 67-68 Starting Nmap 7.31 ( https://nmap.org ) Nmap scan report for xxx.xxx.xxx.1 Host is up (-0.17s latency). PORT STATE SERVICE 67/udp open|filtered dhcps 68/udp open|filtered dhcpc MAC Address: 00:50:56:11:22:33 (VMware) Nmap scan report for xxx.xxx.xxx.2 Host is up (0.00013s latency). PORT STATE SERVICE 67/udp open|filtered dhcps 68/udp open|filtered dhcpc MAC Address: 00:50:56:AA:BB:CC (VMware) Nmap scan report for xxx.xxx.xxx.254 Host is up (0.00017s latency). PORT STATE SERVICE 67/udp open|filtered dhcps 68/udp open|filtered dhcpc MAC Address: 00:50:56:F6:4C:E0 (VMware) Nmap scan report for xxx.xxx.xxx.131 Host is up (0.00027s latency). PORT STATE SERVICE 67/udp closed dhcps 68/udp closed dhcpc Nmap done: 255 IP addresses (4 hosts up) scanned in 9.46 seconds
VMWAREって、こんなにサーバーをちりばめているのか。びっくりしましただ。
大きな問題
それより、決定的に重要な事項が見つかった。親側から仮想PCにピンすると
bash-4.3# ping xxx.xxx.xxx.100 PING xxx.xxx.xxx.100 (xxx.xxx.xxx.100): 56 data bytes ping: sendto: Host is down ping: wrote xxx.xxx.xxx.100 64 chars, ret=-1 ping: sendto: Host is down ping: wrote xxx.xxx.xxx.100 64 chars, ret=-1 ping: sendto: Host is down ping: wrote xxx.xxx.xxx.100 64 chars, ret=-1 ping: sendto: Host is down ping: wrote xxx.xxx.xxx.100 64 chars, ret=-1 --- xxx.xxx.xxx.100 ping statistics --- 10 packets transmitted, 0 packets received, 100.0% packet loss
まさかの一方通行状態です。pingって両方から実施して導通確認するのが大事だな。 そんなの常識、昔テスターで盛んににやっただろう。もう忘れているのか。
with NAT
どうも、NICを2枚刺ししてNATするのが正解みたい。前例に倣ってやってみた。
けど、サーバーへファイルを取りに行ったきり、応答が無くなる。 しょうがないので、shellに落ちて、ftpしてみた。
230- *** JAIST Public Mirror Service *** 230- 230- Welcome to JAIST Public Mirror Service (ftp.jaist.ac.jp). 230- : 250 Directory successfully changed. Retrieving pub/OpenBSD/6.0/amd64/bsd local: bsd remote: bsd 150 Opening BINARY mode data connection for bsd (10504752 bytes). uid 0 on /: file system full /: write failed, file system is full ftp: local: bsd: No space left on device 500 OOPS: setsockopt: linger 416908 bytes received in 0.08 seconds (4.90 MB/s)
書き込むべき場所が無いので、エラーにはなるけど、ftpはちゃんと行われている 事が判明。
NATはパケットフィルターで実現されているので、変換具合をモニターしてみた。
bash-4.3# pfctl -s state all tcp xxx.xxx.xxx.130:29294 <- xxx.xxx.xxx.1:50977 ESTABLISHED:ESTABLISHED all udp xxx.xxx.xxx.2:53 <- 10.0.0.2:44369 SINGLE:MULTIPLE all udp xxx.xxx.xxx.130:55794 (10.0.0.2:44369) -> xxx.xxx.xxx.2:53 MULTIPLE:SINGLE all tcp 150.65.7.130:21 <- 10.0.0.2:41014 FIN_WAIT_2:FIN_WAIT_2 all tcp xxx.xxx.xxx.130:51037 (10.0.0.2:41014) -> 150.65.7.130:21 FIN_WAIT_2:FIN_WAIT_2 all tcp 150.65.7.130:50392 <- 10.0.0.2:11990 TIME_WAIT:TIME_WAIT all tcp xxx.xxx.xxx.130:50464 (10.0.0.2:11990) -> 150.65.7.130:50392 TIME_WAIT:TIME_WAIT