3行のブラウザー

先週の枕で、古代文書を読んでみようなんてのを書いた。実家で50年前の文書が発掘された。

義母が終活かどうか知らないけど、机の引き出しの奥に眠っていた女房名義の貯金通帳を見つけたのだ。あんたんのだから、あげるって言って女房が引き取ってきた。

ご入学記念に作った貯金だ。口座を開設した時の種金は、270円。多分、小遣いのあり金全部を供出させられたのだろう。

3-15-69な月日年式の記帳になってた。だからY2K問題が発生して、銀行が消滅したんだろうね。日本相互銀行ですって。今は影も形も無い。

残金が12,621円残っていて、女房はこれを取り戻せないか、色々調べたらしい。20年で時効になって、国庫に編入されてしまうとか。本店の有った場所は、渋沢栄一の記念館になってるとか言ってた。

昔は利息が良かったのね。残金が42,047に対して451円も付いていたぞ。何故か利息の刻印はゴム印で昭和42年下期とかなってる。和洋折衷版が面白いな。

この利率で残金が50年間運用されてたら、一体幾らになる。捕らぬ狸の皮算用してみる。

julia> r = 451 / 42_047
0.010726092230123434

julia> 12_621 * (1 + r)^50
21516.302023822598

まてまて、利息は上期と下期で年に2回付くから、50年でチャンスは100回だろうに。

julia> 12_621 * (1 + r)^100
36681.02787262121

ヒェッ、塵も積もれば山となるだな。 女房が悔しがるだろうから、そっと胸に秘めておこう。

IPQoS

前回のssh接続失敗を追ってみる。どんな要求パケットが飛んで行くのよ? 久しぶりにソース嫁モードになってみます。

/usr/sr/crypto/openssh の、 ChangeLog がgrepで引っかかってきた。

commit 5ee8448ad7c306f05a9f56769f95336a8269f379
Author: job@openbsd.org <job@openbsd.org>
Date:   Wed Apr 4 15:12:17 2018 +0000

    upstream: Update default IPQoS in ssh(1), sshd(8) to DSCP AF21 for

    interactive and CS1 for bulk

    AF21 was selected as this is the highest priority within the low-latency
    service class (and it is higher than what we have today). SSH is elastic
    and time-sensitive data, where a user is waiting for a response via the
    network in order to continue with a task at hand. As such, these flows
    should be considered foreground traffic, with delays or drops to such
    traffic directly impacting user-productivity.

    For bulk SSH traffic, the CS1 "Lower Effort" marker was chosen to enable
    networks implementing a scavanger/lower-than-best effort class to
    discriminate scp(1) below normal activities, such as web surfing. In
    general this type of bulk SSH traffic is a background activity.

    An advantage of using "AF21" for interactive SSH and "CS1" for bulk SSH
    is that they are recognisable values on all common platforms (IANA
    https://www.iana.org/assignments/dscp-registry/dscp-registry.xml), and
    for AF21 specifically a definition of the intended behavior exists
    https://tools.ietf.org/html/rfc4594#section-4.7 in addition to the definition
    of the Assured Forwarding PHB group https://tools.ietf.org/html/rfc2597, and
    for CS1 (Lower Effort) there is https://tools.ietf.org/html/rfc3662

    The first three bits of "AF21" map to the equivalent IEEEE 802.1D PCP, IEEE
    802.11e, MPLS EXP/CoS and IP Precedence value of 2 (also known as "Immediate",
    or "AC_BE"), and CS1's first 3 bits map to IEEEE 802.1D PCP, IEEE 802.11e,
    MPLS/CoS and IP Precedence value 1 ("Background" or "AC_BK").

実際、どんな値? 特別定義のヘッダーファイルが置いてあった。

defines.h

# define IPTOS_LOWDELAY          0x10
# define IPTOS_THROUGHPUT        0x08
# define IPTOS_RELIABILITY       0x04
# define IPTOS_LOWCOST           0x02

# define        IPTOS_DSCP_AF11         0x28
# define        IPTOS_DSCP_AF12         0x30
# define        IPTOS_DSCP_AF13         0x38
# define        IPTOS_DSCP_AF21         0x48
# define        IPTOS_DSCP_AF22         0x50
# define        IPTOS_DSCP_AF23         0x58
# define        IPTOS_DSCP_AF31         0x68
# define        IPTOS_DSCP_AF32         0x70
# define        IPTOS_DSCP_AF33         0x78
# define        IPTOS_DSCP_AF41         0x88
# define        IPTOS_DSCP_AF42         0x90
# define        IPTOS_DSCP_AF43         0x98
# define        IPTOS_DSCP_EF           0xb8

# define        IPTOS_DSCP_CS0          0x00
# define        IPTOS_DSCP_CS1          0x20
# define        IPTOS_DSCP_CS2          0x40
# define        IPTOS_DSCP_CS3          0x60
# define        IPTOS_DSCP_CS4          0x80
# define        IPTOS_DSCP_CS5          0xa0
# define        IPTOS_DSCP_CS6          0xc0
# define        IPTOS_DSCP_CS7          0xe0

# define        IPTOS_DSCP_EF           0xb8

sshはOpenBSDからの移植なんで、やっぱり原本に当たるべき。sysの一員として定義されてた。

sys/netinet/ip.h in OpenBSD

/*
 * Definitions for IP type of service (ip_tos)
 */
#define IPTOS_LOWDELAY          0x10
#define IPTOS_THROUGHPUT        0x08
#define IPTOS_RELIABILITY       0x04
/*      IPTOS_LOWCOST           0x02 XXX */
#if 1
/* ECN RFC3168 obsoletes RFC2481, and these will be deprecated soon. */
#define IPTOS_CE                0x01    /* congestion experienced */
#define IPTOS_ECT               0x02    /* ECN-capable transport */
#endif

/*
 * Definitions for IP precedence (also in ip_tos) (hopefully unused)
 */
#define IPTOS_PREC_NETCONTROL           0xe0
  :

LOWCOSTとECTで、被ってる。LOWCOSTはOpenBSD独自の定義なんで、身を引いたとな。 出来れば使うなとは、混沌の極み。

IPヘッダのフォーマット ~ToS/TTL/Protocol/IHL/Option等各フィールドの解説~

こちらを見ると、tosフィールドって、色々な思惑が込められた激戦区なのね。

実際には、どんな風に指定するのだろう? 並みのネットワークプログラミング本には載っていない特殊な事例だから、ソースが一番の教材だな。ソースはやっぱりOpenBSD印が一番です。

/usr/src/usr.bin/ssh/packet.c

ssh_packet_set_tos(struct ssh *ssh, int tos)
{
        if (!ssh_packet_connection_is_on_socket(ssh) || tos == INT_MAX)
                return;
        switch (ssh_packet_connection_af(ssh)) {
        case AF_INET:
                debug3("%s: set IP_TOS 0x%02x", __func__, tos);
                if (setsockopt(ssh->state->connection_in,
                    IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
                        error("setsockopt IP_TOS %d: %.100s:",
                            tos, strerror(errno));
                break;
        case AF_INET6:
                debug3("%s: set IPV6_TCLASS 0x%02x", __func__, tos);
                 :

IPPROTO_IPレベルのTOSを変更してねって事だな。

これで現場を押さえられた訳だけど、本質はここでは無い。CentOSにしろFreeBSDにしろVMWAREが施設した(Windows10内の)仮想サブネットにぶら下がっている。そこから、外部のdebian機に行くには、MS製のルーターを経由する事になる。(Vboxの場合は、完全にネットが分離されてて、Windows側からはポートフォワーディングで、ちょびっと出てるsshの口に接続。これとて、パケットはルーター経由となる)

sshが要求するaf21 (Low-Latency Data)は、生意気だからパケットを通してあげないって、嫌がらせのモードで動いているのだろう(想像だけどね)

抜け道を例示してた人は、パケットモニターしてたら、接続された瞬間にリセットのパケットが飛んできたと報告してた。パケットが破棄されたって証しを表しているのだろうね。

wairesharkでも入れてみれば一発なんだろうけど、GUI嫌いだしなあ。追従するなら、tcpdumpでパケットの流れをキャプチャーした後、wiresharkで表示してみればいいかな。 いずれにしろ、暗号化されたパケットが流れるから、追跡は面倒そう。いや、IP Headerを見るだけだろうから、難しく考えなくてもいい、のかな?

tcudump + wireshark

パケットキャプチャをしようとすると、ロートルはtcpdumpを思い出す。若い人はwiresharkだな。GUI人類と言うかクリック猿だからね。オイラーにはメニューが有り過ぎるwiresharkを使いこなせない。

最近のwiresharkはUSBPcapとかが付いていて、USBのパケットまでキャプチャ出来るとか。そんなん、やり過ぎだろう。機能を取り込んで、取り込んでM$の糞Wordみたいになってく運命なのね。

とは言え、無料で使えるなら、極一部だけの機能をwiresharkに求めたっていいだろう。これから合わせ技をします。

$ sudo tcpdump -i em0 -w bad port xxx

FreeBSD側でモニターする。最後のパケットは、RSTになってた。 IPパケットのDiffentiated Service Field: (DSCP: CS0.ECN: Not-ECT)となってた。

IPQoS=throughput を設定すると、ちゃんと通信は継続。当該のパケット部分は、 Field: 0x80 (DSCP: Unknown, ECN: Not-ECT) となってた。

なんだ、wiresharkも知らない、フラグなんだな。sshってかOpenBSD様が設定した独自仕様。 ただ、FreeBSDにしろLinuxにしろ、sshはOpenBSD様に、おんぶにだっこ状態だから、これぞ、デファクトスタンダードだな。

今度はモニターポイントをOpenBSD側にしてみる。FreeBSD側からすれば、MS製の仮想ルーターを経由する事となる。

ob$ doas tcpdump -i em0 -w plog host xxx.xxx.xxx.xxx
tcpdump: listening on em0, link-type EN10MB
^C
93 packets received by filter
0 packets dropped by kernel
ob$ wireshark plog

見たいパケットをクリックして、後はそれを展開してくだけ。使うのはこの機能だけって言う超初心者モードです。

FreeBSD側から到着したパケットは、0x00 になっていた。OpenBSD側は、0x48 (DSCP: AF21)を送り出そうとしてる。って事は、クライアント(この場合FreeBSD)からの要求が無いと、サーバー(OpenBSD)から、親切にフラグを立ててあげても、叩き落とされてしまうって事だな。

参考でOpenBSDから、Windows機と同一サブネット上にあるdebian機にsshしてみた。要求パケットのtosは、0x48(DSCP: AF21)を送り出していた。debian機からの返答パケットは、0x00になってた。

これって、元祖のOpenBSDにあるsshと移植版のsshで、送り出すToSの内容が違っているって事だよね。移植版は、IPQoSを設定しないと0x00なんだな。

3行のブラウザー

ここで話はくるりんぱ と代わります。以前juliaのグラフ描きパッケージでPlotlyJSだったかをやった。プロセスを起動するコマンドをモニターした所、裏でブラウザーが走り、その上でJabascriptによって描画してる疑惑があった。

ちょいと詳しく調べてみたら、Blinkと言うパッケージを内部的に使ってた。こやつが、そのものづばりのブラウザーだったよ。

だから、このBlinkだけを呼び出してみる。

julia> using Blink

julia> w = Window()
Window(1, Electron(Process(`/home/sakae/.julia/packages/Blink/AO8uN/deps/atom/electron /home/sakae/.julia/packages/Blink/AO8uN/src/AtomShell/main.js port 3747`, ProcessRunning), Sockets.TCPSocket(RawFD(0x00000011) active, 0 bytes waiting),
Dict{String,Any}("callback"=>##1#2())), Page(1, WebSocket(server, CONNECTED), Dict{String,Any}("webio"=>##26#27{WebIOBlinkComm}(WebIOBlinkComm(Window(#= circular reference @-5 =#))),"callback"=>##1#2()), Distributed.Future(1, 1, 1, Some(true))), Task (done) @0x00007f3863a09fc0)

julia> loadurl(w, "https://hamesspam.sakura.ne.jp")
false

julia> loadurl(w, "https://www.yahoo.co.jp")
false

Blink.jl Documentation

これ、ドキュメントから引っ張ってきた実行例。わずか3行juliaのコマンドを叩くだけで、ブラウザーが出現して、動いてしまった。当然ながら、リンクも辿ってくれるし、それなりに鬱陶しい広告も表示される。変な装飾が全くない、ただ見るだけのブラウザーの出現である。

シグネチャー

ブラウザーなんでシグネチャーが付いているはず。nginxを立ち上げて、アクセスログを見てみた。

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.106 Electron/4.0.4 Safari/537.36"

モジラなんでGeckoなエンジンは分かるんだけど、これはフェイクだな。真実な姿はChromaな奴で、あれれSafariなんて言ってる。煙に巻く作戦か。torはどうしたと言いたくなる。

上記は、CentOS 8.0からのアクセスだったけど、今度はi386なDebian機からもアクセスしてみる。

"Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.106 Electron/4.0.4 Safari/537.36"

i686に変わってるな。って事は、オイラーのHPを訪れる人は、古いマシンを大事に使ってるかどうか、分かるんだな。今度、暇に任せて、調べてみるか。

アプルなら何と言ってくるかな? 本物のSafariからアクセス

"Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1"

もう6年も前のipadなんだけど、like Mac OS X なんて、期待を込めた宣言がなされている。 ああ、6年前って事は無いか。途中までsafariもupdateされてたからね。それが途中でOSの更新が途絶えてしまってる。貧乏人よ金を貯めて、早くipad Proを買えとね。女房のリクエストは、ひたすら画面の大きい奴ってんで、始末が悪い。

ついでに、Windows10上から、ぐるるさん、赤狐さん、CentOSに入れたw3mでアクセスしてみた。

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
"w3m/0.5.3+git20190702"

内部監察

パッケージの中を覗いてみた。

deps/atomなんてのが置いてあった。LibEGL.soだとか、electronとか言う実行属性の付いたものが置いてある。 こういうのが有ると、走らせてみたくなるんだよな。

(base) [sakae@c8 atom]$ ./electron

Electron 4.0.4 - Build cross platform desktop apps with JavaScript, HTML, and CSS
Usage: electron [options] [path]

A path to an Electron app may be specified. It must be one of the following:
  - index.js file.
  - Folder containing a package.json file.
  - Folder containing an index.js file.
  - .html/.htm file.
  - http://, https://, or file:// URL.

Options:
  -i, --interactive     Open a REPL to the main process.
  -r, --require         Module to preload (option can be repeated).
  -v, --version         Print the version.
  -a, --abi             Print the Node ABI version.

electronと似たような画面が出てきた。雰囲気で、アプリのプラットフォームに使われそう。そう言えば、みんな大好きatomなeditorとかM$が押している visual stdio code editor なんかが、お得意様とか。

docなリンクをクリックしたら Electron Documentationにchromeなブラウザーが表示してくれたよ。餅は餅屋に任せるって方針なのね。

> (base) [sakae@c8 atom]$ ./electron -i
> ?
?
^

SyntaxError: Unexpected token ?

> 10 + 4
14

replが動いて、計算ぐらいは出来るようだけど、他にどんなコマンドが使えるのかな? 要調査だな。

(base) [sakae@c8 atom]$ ./electron https://hamesspam.sakura.ne.jp

これで、愛想の無いブラウザーが立ち上げってきた。リンクをクリックすると、ググル様ブラウザーが起動されて、リンク先が表示された。その画面を(多分)掠め取ってきて、愛想の無いブラウザーにも、リンク先が表示されたよ。

yahooを見に行ってる時のps図

(base) [sakae@c8 AO8uN]$ ps -awocmd
  :
/home/sakae/.julia/packages/Blink/AO8uN/deps/atom/electron https://www.yahoo.co.jp
/home/sakae/.julia/packages/Blink/AO8uN/deps/atom/electron --type=zygote --no-sandbox
/home/sakae/.julia/packages/Blink/AO8uN/deps/atom/electron --type=gpu-process --enable-features=SharedArrayBuffer --no-sandbox --gpu
/home/sakae/.julia/packages/Blink/AO8uN/deps/atom/electron --type=renderer --no-sandbox --enable-features=SharedArrayBuffer --servic
ps -awocmd

atomの下で起動したのに、ご丁寧にjulia様のパッケージですと自己主張してる。それから、隙あらばgpuを動かして、採掘でもしてプロジェクトの資金でも調達しようと言うのかね。OSSなプロジェクトは、何処も資金難ですから。

再び、あちこちを突くと、 Electron API Demosなんて所へ飛ばされた。

どんな事が出来るか、じっくり鑑賞してよかったら採用してください。 これさえ有れば、スマホのアプリもバッチリよと言いたいんだな。 こちらには electronの本体も公開されてますから、どうぞ煮るなり焼くなりしてください。

オイラー的には npmなんて、煮ても焼いても食えぬけどね。

good tips for wireshark

wiresharkで、パケットを開いて見た時、それをテキストに落としてHPに張りたい事がある。GUIな世界だから駄目と諦めていたんだけど、tipsを見つけた。

取り合えず見たい所を展開。それからFileメニューの Export Packet Dissections で、 As Plain Text ... を選んでセーブする。これでパケット事のデータが下記のように得られる。

Internet Protocol Version 4, Src: 10.0.2.15, Dst: 10.0.2.2
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x48 (DSCP: AF21, ECN: Not-ECT)
        0100 10.. = Differentiated Services Codepoint: Assured Forwarding 21 (18)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 668
    Identification: 0xd4dd (54493)
    Flags: 0x4000, Don't fragment
    Time to live: 64
    Protocol: TCP (6)
    Header checksum: 0x4b26 [validation disabled]
    [Header checksum status: Unverified]
    Source: 10.0.2.15
    Destination: 10.0.2.2
Transmission Control Protocol, Src Port: 22, Dst Port: 55369, Seq: 1, Ack: 1, Len: 628
SSH Protocol

上記はIPヘッダー部を展開したもの。

Transmission Control Protocol, Src Port: 22, Dst Port: 55369, Seq: 629, Ack: 1, Len: 1012
    Source Port: 22
    Destination Port: 55369
    [Stream index: 0]
    [TCP Segment Len: 1012]
    Sequence number: 629    (relative sequence number)
    [Next sequence number: 1641    (relative sequence number)]
    Acknowledgment number: 1    (relative ack number)
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
    Window size value: 17520
    [Calculated window size: 17520]
    [Window size scaling factor: -1 (unknown)]
    Checksum: 0x1c1f [unverified]
    [Checksum Status: Unverified]
    Urgent pointer: 0
    [SEQ/ACK analysis]
    [Timestamps]
    TCP payload (1012 bytes)
SSH Protocol

TCPヘッダーも展開してから書き出しすれば、ちゃんとemacsなりで確認出来る。(大容量だけど、本当に開くの?って、呆れかえりながらだけど)

vmware player update

何か久しぶりの感じがするけど、やって来た。

VMWARE Update

今までPlayer 12が入っていたんで、一足飛びにUpした事になる。Updateの注意として、古いやつを先に削除する。それからインストール。そうしないと、古いランチャー(のアイコン)が残っていて、起動に失敗する。

Linux系については、toolがインストールされたけど、FreeBSD系はなしのつぶてだ。見切ったか。骨董品扱いか。時代の趨勢だからと諦めろ、かな。

Linux、FreeBSD共、元気に動いてるから許したる。月末には、新しいOpenBSDが降ってくるから、動くかどうか要注目って所かな。

etc

全20時間の大学講義が無償公開

筑波大学ですって。無料の聴講と言っても、20時間のロングラン。1週間に2時間づつの聴講を 勧めているけど、きついな。大体、そんなにTVも見ないし。(贅沢言うな!!)