ssh forwarding

Table of Contents

init

ふと思いたって、WSL2でこんなコマンドを叩いてみた。

sakae@atom:~$ sudo shutdown -P now
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon: Host is down
sakae@atom:~$ ps awx
  PID TTY      STAT   TIME COMMAND
    1 hvc0     Sl+    0:00 /init
    6 hvc0     Sl+    0:00 plan9 --control-socket 5 --log-level 4 --server-fd 6 --pipe-fd 8 --log-truncate
    9 ?        Ss     0:00 /init
   10 ?        S      0:00 /init
   11 pts/0    Ss     0:00 -bash
  407 pts/0    R+     0:00 ps awx

WSL2 with systemd じゃないと、動かんのか。ちゃんとinitが居るんだけどな。

qemu

qemuで疑問があったので、あの人に質問してみた。これ前回のデータを眺めて いて不思議に思ったのさ。

A: QEMUのポートフォワーディングでホスト側に2つのセッションが表示される理由について説明します。

ポートフォワーディングを使用して、ホストのポート2022をゲストのポート22にフォワードしています。この場合、SSHでホストのポート2022に接続すると、QEMUがその接続をゲストのポート22に転送します。

具体的な理由は以下の通りです:

  1. ホスト側の接続: `localhost.2022`から`localhost.9698`への接続。これは、あなたがホストのポート2022にSSH接続を開始したことを示しています。
  2. QEMU内部の接続: QEMUはホストのポート2022への接続を受け取り、それを内部で処理し、ゲストのポート22に転送します。このため、QEMU内部でフォワードされるための新しい接続が作成されます。この接続が`localhost.9698`から`localhost.2022`への接続として表示されます。

この2つの接続が表示される理由は、QEMUがフォワーディングを処理するために内部的に別の接続を作成する必要があるためです。結果として、1つの接続が2つのセッションとして表示されることになります。これは正常な動作であり、特に問題ではありません。

再確認で、リッスンしてるポートも含めて表示してみる。

ob$ netstat -af inet
Active Internet connections (including servers)
Proto   Recv-Q Send-Q  Local Address          Foreign Address        TCP-State
tcp          0      0  localhost.43113        localhost.2022         ESTABLISHED
tcp          0      0  localhost.2022         localhost.43113        ESTABLISHED
tcp          0     96  ob.ssh                 xxx.xxx.x.x.49928      ESTABLISHED
tcp          0      0  localhost.smtp         *.*                    LISTEN
tcp          0      0  *.1234                 *.*                    LISTEN
tcp          0      0  *.2022                 *.*                    LISTEN
tcp          0      0  *.time                 *.*                    LISTEN
tcp          0      0  *.ssh                  *.*                    LISTEN
tcp          0      0  *.www                  *.*                    LISTEN

netstatの表題に、Local AddressとForeign Addressが出てくる。ちょっとま ぎらわしいので、これを(パケットの)送り元、受取先と理解しておくのが良い。 そしてAddressはIPAddress.portという表現になっている。なお、portは、そ のマシン内でのアプリを一意に決定する番号だ。有名なアプリには、世界共通 の番号が割り当てられている(https=443,ssh=22等)。

1234番は、qemuを起動する時gdbと接続できる様にしたんだったな。その他 2022で別な接続も待受してる。

じゃ、ノーマルにssh接続した場合はどうか? FreeBSD側

sakae@fb:~ $ netstat -f inet
Active Internet connections
Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4       0     36 fb.ssh                 ob.22286               ESTABLISHED

そして、OpenBSD側。

ob$ netstat -f inet
Active Internet connections
Proto   Recv-Q Send-Q  Local Address          Foreign Address        TCP-State
tcp          0      0  ob.22286               fb.ssh                 ESTABLISHED

さて、どちらから接続を貼ったのでしょうか? そこの貴方5秒で回答してく ださい。当てずっぽでも当たるので、ちゃんと理由も述べてください。

答は、OpenBSD側から ssh fb しました。

この結果を、強引に、まとめてみると

Proto   Recv-Q Send-Q  Local Address          Foreign Address        TCP-State
tcp          0      0  ob.22286               fb.ssh                 ESTABLISHED
tcp4         0     36  fb.ssh                 ob.22286               ESTABLISHED

こうなる。OpenBSD(tcp)では、fbとの接続の為、適当なポート(2286)を用意し て、sshdに接続。それを契機にFreeBSD(tcp4)では、sshdが反応、相手からの ポート番号(2286)を使って接続を確立した。

qemuは同一ホスト上にあるsshdって理解するのが合理的。そして、qemu側では、 相手とのポート番号を入手できれば、それを利用して、ゲスト側とのやりとり も可能になる。こう解釈するのが良い。

まあChatGPTの解説も、そんなものだと薄く理解するのはいいけど、真実は、 これなのさ。前回は、見知らぬポート番号をqemuが用意するって理解だったけ ど、あれは間違いなんだな。あくまで、ホスト側OSがqemuに内蔵してるsshdに 接続する時の挙動だった訳だ。

ssh forwarding

ちょっとsshを利用したポートフォワーディングについても、調べておく。

sshポートフォワーディングの使い方

ssh接続のポートフォワーディングは3種類ある!

SSHポートフォワード:OpenSSH の -L と -R オプションの動作を図解

Windows10 でも簡単にsshdがインストールできるけど、設定は何処にあるのと かファイアーウォールに穴を開けるとか、面倒で躊躇しちゃうぞ。

上の例に出てたncを利用した通信事例。ホスト間は、sshで暗号化されている。 サーバー側をfbに、クライアント側をobとして実験してみる。

server sideで、ncのサーバー(受け)をたてる。

sakae@fb:~ $ nc -4 -kl 11111

client sideで、フォワーディングしつつ、サーバーにログイン。単に暗号路 を確保する為だ

ob$ ssh -L 22222:fb:11111 fb
(sakae@fb) Password for sakae@fb:

Welcome to FreeBSD!

sakae@fb:~ $

クライアントからssh経由(暗号路にデータを載せる)で、サーバー側に送信。

ob$ nc -4 localhost 22222
12345

この時のサーバー側

sakae@fb:~ $ netstat -f inet
Active Internet connections
Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4       0      0 fb.11111               fb.64578               ESTABLISHED
tcp4       0      0 fb.64578               fb.11111               ESTABLISHED
tcp4       0      0 fb.ssh                 ob.16058               ESTABLISHED

クライアント側

ob$ netstat -f inet
Active Internet connections
Proto   Recv-Q Send-Q  Local Address          Foreign Address        TCP-State
tcp          0      0  localhost.41277        localhost.22222        ESTABLISHED
tcp          0      0  localhost.22222        localhost.41277        ESTABLISHED
tcp          0      0  ob.16058               fb.ssh                 ESTABLISHED

暗号路が必要なければ、直接サーバー側のncに接続すれば良い。

ob$ nc -4 fb 11111

ただし、事前にsshを停止し、ncは再起動しておく事。

X11-forwarding

X Windowの利用について 科学技術計算システムを利用するには?

WSL上にXサーバをインストールしてGUIを実現する(VcXsrv編)

OpenBSDからFreeBSDにsshして、FreeBSD側のXを使ってみる。って、何もない ので、pkg install xorgしたよ。そしたら、llvm15まで、侵入してきたぞ。 xorgってメタパッケージなんだな。おかげでfirefoxを入れる余裕がなくなっ た。しょうがないので、アプリの代表として、xtermでお茶を濁すことにした。

fb側で、export DISPLAY=ob:0 して、表示には、OpenBSDのXを利用してねって 設定を行ない。そして、

ob$ ssh -XY fb xterm

これでOpenBSD側に、FreeBSD由来のxtermが表示された(つくづく、firefoxじゃ ないのが残念であります)。この時の接続状況。

sakae@fb:~ $ netstat -f inet
Active Internet connections
Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4       0      0 localhost.x11-ssh      localhost.41989        ESTABLISHED
tcp4       0      0 localhost.41989        localhost.6010         ESTABLISHED
tcp4       0      0 fb.ssh                 ob.6404                ESTABLISHED

psすれば、ちゃんとxtermは存在するけど、その姿形は、OpenBSD上に表われて いる。x11-sshってのが表示されているけど、これは、6010の事だ。なんで、 表示がちぐはぐ? そりゃ、ローカル側は、自分で把握できるけど、外部側の 事は、よう知らんわって主張なんだろね。

sakae@fb:~ $ grep x11 /etc/services
x11             6000/tcp   #6000-6063 are assigned to X Window System
x11             6000/udp   #X Window System
x11-ssh         6010/tcp   #Unofficial name, for convenience
x11-ssh         6010/udp

FreeBSDだと/usr/src/crypto/openssh こんな所に鎮座してる。*.cだけで、軽 く11万行を越える巨大なやつだ。隣には、opensslが鎮座してた。

OpenBSDなら、/usr/src/usr.bin/ssh に、族が集結している。やはり巨大で10 万行を越えてた。ソースをちら見すると、debug printが強い見方になりそう なので、、

ob$ ssh -vv -X fb xterm
OpenSSH_9.7, LibreSSL 3.9.0
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolving "fb" port 22
debug1: Connecting to fb [xx.xx.xx.xx] port 22.
 :
debug2: client_x11_get_proto: xauth command: /usr/X11R6/bin/xauth -f /tmp/ssh-9d
GSLghUwNbs/xauthfile generate :0 MIT-MAGIC-COOKIE-1 untrusted timeout 1260 2>/dev/null
debug2: x11_get_proto: /usr/X11R6/bin/xauth -f /tmp/ssh-9dGSLghUwNbs/xauthfile list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
debug2: channel 0: request x11-req confirm 1
debug2: fd 3 setting TCP_NODELAY
debug2: client_session2_setup: id 0
debug1: Sending command: xterm
debug2: channel 0: request exec confirm 1
debug2: channel_input_open_confirmation: channel 0: callback done
 :
debug2: X11 forwarding request accepted on channel 0
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0
debug1: client_input_channel_open: ctype x11 rchan 2 win 65536 max 16384
debug1: client_request_x11: request from 127.0.0.1 19945
debug2: fd 7 setting O_NONBLOCK
debug1: channel 1: new x11-connection [x11] (inactive timeout: 0)
debug1: confirm x11
debug2: channel 1: rcvd adjust 65536
 :
debug2: channel 1: garbage collecting
debug1: channel 1: free: x11, nchannels 1
Transferred: sent 3248232, received 58552 bytes, in 26.3 seconds
Bytes per second: sent 123601.0, received 2228.0
debug1: Exit status 0

xauth

なんだか、xauth なんてのが出てたので調べてみる。

Xのウィンドウで別のデスクトップを表示するには

WSL2からアクセス制御(Xauthority)を有効にしたX Serverに接続する

Q: X11-forwardingする時に利用されるマジッククッキーは、どんな目的で利 用されるのですか?

A: X11-forwardingで利用される「マジッククッキー」は、セキュリティのために使われます。具体的には、以下の目的で利用されます:

  1. 認証: マジッククッキーは、一意の認証トークンとして機能します。Xサーバーに接続しようとするクライアントは、正しいマジッククッキーを持っている必要があります。これにより、不正なクライアントがXサーバーに接続するのを防ぎます。
  2. アクセス制御: Xサーバーは、接続を許可するかどうかを決定する際にマジッククッキーをチェックします。クライアントが提供するマジッククッキーがXサーバーの設定と一致しない場合、そのクライアントの接続は拒否されます。これにより、信頼できるクライアントのみがXサーバーに接続できるようになります。
  3. 通信の保護: X11-forwardingを利用する際、SSHプロトコルを使ってX11データを暗号化して送信しますが、マジッククッキーは通信の開始時にクライアントを認証するために使われます。これにより、セッション中にクライアントの正当性が確保されます。

このように、マジッククッキーはX11-forwardingにおける重要なセキュリティ 機構の一部として機能し、クライアントの認証とアクセス制御を行うために利 用されます。

Q: 誰がこのクッキーを作成してくれるのですか?

A: マジッククッキーは通常、以下のプロセスを通じて作成されます:

  1. Xサーバーの起動時: ローカルでXサーバーを起動する際、Xサーバー自身がマジッククッキーを生成します。これは一般的に`~/.Xauthority`ファイルに保存されます。このファイルには、Xサーバーに接続するために必要な認証情報が含まれています。
  2. SSHサーバー: X11-forwardingを利用する場合、リモートのSSHサーバーがローカルのXサーバーからマジッククッキーをコピーし、リモート環境に適用します。このプロセスは通常、SSHクライアントによって自動的に行われます。
    • SSHクライアントが接続されると、リモートの環境にマジッククッキーが設定され、クライアントがリモートXサーバーに対して認証を行えるようにします。
    • このクッキーは一時的にSSHセッションの間だけ使用されます。SSH接続が終了すると、クッキーは無効になります。

### 具体的な流れ

  1. ローカルでの生成: Xサーバーが起動すると、`xauth`ツールを使ってマジッククッキーが生成されます。

    xauth generate :0 . trusted

  2. リモートへの転送: SSH接続時に、SSHクライアントがローカルのマジッククッキーをリモートにコピーします。

    ssh -X user@remotehost

  3. リモートでの利用: リモートマシン上で`DISPLAY`環境変数が設定され、リモートアプリケーションがローカルのXサーバーに接続できるようになります。

このようにして、マジッククッキーは自動的に生成され、必要な場所に転送されます。通常、ユーザーが手動で行う必要はなく、SSHクライアントとXサーバーがその役割を果たします。

GPT-4o が利用できると言う大盤振舞いが来てたので、切り替えてみた。

A': X11マジッククッキーは通常、Xサーバーの設定時に自動的に生成されます。具体的な生成と管理は以下のように行われます:

  1. Xサーバーの起動時: Xサーバー(通常は`Xorg`や`XFree86`など)は起動時にマジッククッキーを生成します。このクッキーはランダムなバイト列であり、一意性が保証されます。
  2. `xauth`コマンド: クライアント側で認証情報を管理するために、`xauth`コマンドが使われます。`xauth`コマンドは、認証情報(マジッククッキー)をユーザーの`~/.Xauthority`ファイルに保存します。これにより、クライアントはXサーバーに接続する際に適切な認証情報を提供できます。
  3. SSHのX11-forwarding: SSHを使ってX11-forwardingを行う場合、SSHサーバーが接続時に一時的なマジッククッキーを生成し、それをクライアントに提供します。この一時的なマジッククッキーは、SSH接続が終了すると無効になります。

### 手順の例

  1. Xサーバーの起動:

    startx

    または

    systemctl start display-manager

  1. `xauth`による管理:
    • クッキーのリスト表示:

      xauth list

    • クッキーの追加:

      xauth add <displayname> . <hexkey>

    • クッキーの削除:

      xauth remove <displayname>

  1. SSH経由のX11-forwarding:
    • SSH接続時にX11-forwardingを有効にする:

      ssh -X user@remotehost

      この時、SSHサーバーが一時的なマジッククッキーを生成してクライアントに渡します。

### まとめ

X11マジッククッキーは、Xサーバー起動時や`xauth`コマンド、またはSSH接続時に自動的に生成されます。これにより、ユーザーは特別な操作をしなくても安全にX11-forwardingを利用できます。

ためしてみた。

ob$ xauth list
ob.my.domain/unix:0  MIT-MAGIC-COOKIE-1  faed9de84eb3bdfd1cc91b0123456789
ob.my.domain:0  MIT-MAGIC-COOKIE-1  faed9de84eb3bdfd1cc91b0123456789

WSL2/Debianへssh

無駄と言えば無駄だけど、やってみる。DebianはNATの中だけど、外側 (Windows)からssh接続できる。その準備として、debianでsshdを起動 しとくのが前提になる。

Windows側からlocalhost:22へ接続すると、ポートフォワーディングされて、 debianに入いれる。挙動としては、ポートフォワーディングと言うより(IP)ア ドレス変換だな。localhostを変動する172.21.xx.xxに自動変換して、接続し てくれる。Windows側でのOpenSSHはMSが用意してくれているので、簡単な操作 でイネーブルに出来る。至れり尽くせずな準備がされているぞ。

この時に使うのは、慣れたPuTTYだ。このPuTTYの設定で、ssh/x11の所にあるX 転送をonにしておくと、VcXsv X Serverが利用出きる。

Windowsのポートプロキシを使った接続

UbuntuをWindows11上で動かす その12: 外部から接続する

またまたMSの大発明(名前だけ)です。さて、ポートフォワーディングと何が違 うのでしょう?

etc

ChatGPT

朝5時頃は曇っていて、10時ぐらいにスーパーへ行っても大丈夫、日焼けしな いかなと思っていると、何時も裏切られる。気象予報士もどききに聞いてみた ぞ。

Q: 日中は晴れることが多いのに、朝は曇りがちです。何故ですか?

A: 朝が曇りがちな理由はいくつかあります。以下に主要な理由を挙げます。

  1. 地表の冷却: 夜間は地表が放射冷却によって冷えます。これにより地表付近の空気も冷やされ、相対的に湿度が高まります。冷えた空気が露点に達すると、水蒸気が凝結して霧や低い雲が発生しやすくなります。
  2. 風の影響: 夜間や早朝は風が弱くなりがちです。これにより大気の混合が少なく、地表付近の湿った空気がそのまま残りやすくなります。これも霧や雲の形成を助けます。
  3. 放射霧: 晴れた夜は放射冷却が強くなりやすく、その結果として放射霧が発生することがあります。放射霧は朝日が昇るにつれて消散しますが、朝のうちはまだ残っていることが多いです。
  4. 海風の影響: 海に近い地域では、夜間に冷えた空気が海上に流れ込み、朝方に海風として戻ってくることがあります。この風が冷たく湿った空気を運び、曇りや霧を引き起こすことがあります。

これらの要因が組み合わさることで、日中が晴れていても、朝が曇りがちになることが多いのです。

README

バッタを倒すぜ アフリカで

著者は、前野ウルド浩太郎博士。日本人には珍しくミドルネームをお持ち。 モーリタリアから贈呈されたとか。なんでも、◯◯の子孫と言う意味らしい。

大量発生して、全ての緑を食べつくしてしまうやっかいなバッタ。これが発生 してるアフリカに渡る著者。ある時、そのバッタの婚活現場に運よく遭遇。

不思議な事に、その男女比率が1:1に近い事を発見。何故そうなる? 普通は男 の方が多くて、比率は異るはずだろう。

仮説を立てる。成熟するまで、男女は別居して生活してるんではなかろうか? そして、発展場所に集合すれば、ほぼ全員がペアになれるという、効率よい繁 殖戦略をとっているんではなかろうか?

ある時、論文集を眺めていたら、そういう形態が普通らしい事を知る。教科書で 習ったはずなんだけど、すっかり忘却の彼方だったらしい。

ここから、色々とアイデアが湧いてきて、地道な観測と、実験が始まる。 研究者って、こういう風に悩んで手を動かして、その成果を論文にするんだな あ。その一端をかい間みられて、とっても楽しかったよ。それにコボレ話もふ んだんに盛りこまれていて、飽きないぞ。


This year's Index

Home