2024/02/13 Telnetリーディング
RFCを読むときの心構え
✅ Telnetのサーバを立てる
簡単な方法があればよかったが、GitHubに存在するTelnet関連のリポジトリの多くはクライアントを記述したものである
inetutilsに含まれるtelnetdを起動するのがもっとも簡単であると思われる
✅ Telnet通信のパケット内容を読んでみる
PuTTYでサーバに接続するt6o_o6t.icon
WSL上のUbuntuで立てたTelnetサーバに、Windows側のPuTTYプロセスから接続するから、vEthernetインターフェースをパケットが通過するはずである
WiresharkでTelnet通信の内容を読む。
簡単な実装を見つけたt6o_o6t.icon
https://github.com/TooTallNate/node-telnet/blob/master/lib/telnet.js
ほとんど生のTCPパケットであることが分かった
WiresharkでTelnet通信を読む場合、TelnetというProtocolではなくTCPとして表示されるので注意
10: fffd00
do, transmit_binary
12: fffd1ffffd03fffb03fffb01
fffd1f
do, naws
fffd03
do, suppress_go_ahead
fffb03
will, suppress_go_ahead
fffb01
will, echo
14: 1b5b3147
.[1G
16: 1b5b304a74656c6e6574207265706c3e201b5b313447
.[0Jtelnet repl> .[14G
注:telnet repl> はサーバから送信した本文。
Q. 0x1bは何を表している?
これはANSIエスケープシーケンスの冒頭ではないか
Q. [ 数字 + アルファベットの列は何を表している?
ANSIエスケープシーケンス
★ Client)18: fffb1ffffb20fffb18fffb27fffd01fffb03fffd03
fffb1f:
ff: iacが255(iac)
fb: commandが251(will)
1f: optionが31(naws = windows size)
fffb20:
ff: iac
fb: will
20: optionが32(terminal_speed)
fffb18:
ff: iac
fb: will
18: optionが24(terminal_type)
fffb27:
will
27: optionが27(new_environ = environment variables)
fffd01:
fd: commandが253(do)
01: optionが01(echo)
fffb03:
will, suppress_go_ahead
fffd03:
do, suppress_go_ahead
★ Client)20: fffb00
iac, will, transmit_binary
★Client)22: fffa1f00500018fff0
fffa1f:
ff: iac
fa: 250(sb = subnegotiation begin)
1f: 31(naws)
005000:
0050: 80(width)
18fff0:
0018: 24(height)
ff: iac
f0(se = subnegotiation end)
Q. 末尾6バイトの意味は?
RFCか実装を読めば解決するだろう
RFC854に記述はなかった
IAC (subnegotiation begin) nawsとIAC (subnegotiation end)で挟まれたデータは、おそらく自由にやり取りできる
nawsに関してサーバがdo、クライアントがwillした
なので、nawsのデータをiac sb~ iac se間に配置することができる
RFC1073にnawsオプションについて記述されている
https://datatracker.ietf.org/doc/html/rfc1073
24: fffa1801fff0
fffa18
sb, terminal_type
01fff0
不明
つまり..
制御系のメッセージは、0xff(iac)で始まり、commandとoptionの2バイトが続く
commandには、いくつか種類が存在する
fa(sb)、fb(will)、fd(do)
また、端末から入力した文字はすべて、サーバ側に一文字ずつ送信されている
そしてサーバは、同じ文字をクライアントに即時送り返している
★ Client)26: fffa1800585445524dfff0
fffa18
sb, terminal_type
00
不明
585445524d
文字列「XTERM」
fff0
不明
今後の方針
node-telnetのserver実装は、単にclientオブジェクトをnet.createServerに渡しているだけ
つまりtelnet自体は、
node-telnetの実装を眺めて理解する
2024/02/13 note-telnetのリーディング