1/22 (日)
[Movie] ノースマン 導かれし復讐者
チネチッタで『ノースマン 導かれし復讐者』(原題: The Northman)の字幕版を観る。 客の入りは2割ぐらい。
スカンディナヴィアの伝説上の人物アムレートの復讐譚を基にした映画らしい。 映画の宣伝とか見なかったので、上映時間の都合が良かったので行きなり入ってみた。 全編が暗くて寒い北欧が舞台にして、物悲しい雰囲気を感じる。
1/21 (土)
[Movie] ヒトラーのための虐殺会議
チネチッタで『ヒトラーのための虐殺会議』(原題: Die Wannseekonferenz)の字幕版を観る。 客の入りは2割ぐらい。
ドイツ映画を観るのは随分久しぶり。 1942年にナチス高官によって開催されたというヴァンゼー会議を議事録を元に脚本化した映画のようだ。 会議に出席した15名の中でライハンルト・ハイドリヒ、ハインリヒ・ミュラー、アドルフ・アイヒマンは知っていたが、他はよく知らない。 映画全体を通してずっと会話劇であまり盛り上がるシーンはない。 史実への興味という点で見ていられるが、映画としてはつまらない。
1/10 (火)
GitLab Runner がエラーになる
GitLab の CI/CD が突然動かなくなる。 GitLab Runner のコンテナの先頭で git リポジトリからフェッチする段階でアクセスエラーが発生している。 原因は究明中だがなかなか理由が分からない。
Running with gitlab-runner 11.6.1 (8d829975)
on myproject-devel y1Yt2HsR
Using Docker executor with image registry.gitlab.example.com/myproject/myproject-devel ...
Pulling docker image registry.gitlab.example.com/myproject/myproject-devel ...
Using docker image sha256:179936d for registry.gitlab.example.com/myproject/myproject-devel ...
Running on runner-y1Yt2HsR-project-31-concurrent-0 via myproject-2.fcxlocal...
Cloning repository...
Cloning into '/builds/myteam/myproject'...
fatal:unable to access 'http://gitlab-ci-token:xxxxxxx@gitlab.example.com/myteam/myproject.git/': The requested URL returned error: 503
追記
原因は HTTP プロキシの挙動が変わったことだった。
GitLab サーバーはイントラネット内にあったので、全てのアクセスを HTTP プロキシを介するようにしていた。 HTTP プロキシは当初は(社内のホストも含めて)全てのホストに対してプロキシしていた。 しかし、ある時期から社外のホストに絞ってプロキシするようになった。
GitLab は自身の URL である gitlab.example.com を指定してのアクセスをしていたが、これも HTTP プロキシに送られ、HTTP プロキシが社内のホストと判断して gitlab.example.com に折り返しアクセスしていた。 HTTP プロキシの挙動が変わったことでエラーになっていた。
1/6 (金)
[MyWeb] SSH over HTTP
ローカルサーバー(local server)からリモートサーバー(remote server)まで HTTP プロキシを経由して SSH を使えるように、httptunnel (https://www.gnu.org/software/httptunnel/)を使って SSH over HTTP を構築したのでメモを残していた。

コンパイル
GitHub の「<> Code」の「Download ZIP」からソースコードをダウンロードする。
サーバーとクライアントの両方の Linux 環境でコンパイルしてインストール。
unzip -x httptunnel-master.zip ./autogen ./configure --enable-debug make make install
systemd サービスユニットの作成と設定
[Unit] Description=httptunnel After=syslog.target network.target [Service] Type=forking ExecStart=/usr/local/bin/htc -F 2222 -P proxy-address:proxy-port -A user:password hts.example.com:80 ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=always [Install] WantedBy=multi-user.target
[Unit] Description=httptunnel After=syslog.target network.target [Service] Type=forking ExecStart=/usr/local/bin/hts -F remote-server:22 8888 ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=always [Install] WantedBy=multi-user.target
ローカルサーバーとリモートサーバーの両方で実施。
# ln -s /usr/lib/systemd/system/httptunnel.service /etc/systemd/system/httptunnel.service # systemctl enable httptunnel.service
nginx サーバーの設定
nginx サーバーに Web サーバーから httptunnel へのフォワーディングする設定をおこな。 nginx サーバーは 2022年12月28日に構築した設定を元に、以下を足す。
server { listen 80; server_name hts.example.com; location / { proxy_pass http://127.0.0.1:8888$request_uri; proxy_redirect ~^https?://.+?/(.+)$ http://hts.example.com/$1; # buffering proxy_buffering off; # retries off proxy_next_upstream off; # request buffering proxy_request_buffering off; } }
SSH の実行
クライアント環境で SSH を実行すると、httptunnel を介してリモートの SSH サーバーに接続できる。
ssh -p 2222 localhost
httptunnel の弱点
上記の構成だとリモート通信では問題がないが、大きなファイルをローカルサーバーからリモートサーバーへ scp へ転送するとエラーになった。 どうも httptunnel の通信は HTTP プロトコルとして問題があるようだ。 httptunnel へソケットが1つ接続されると、httptunnel クライアントから httptunnel サーバーへ GET メソッドと POST メソッドが貼られる。
- httptunnel クライアントは POST メソッドのリクエストボディに元ソケットの送信側のデータが流す。 httptunnel サーバーはこれを受け取ってトンネル先に送信する。 元ソケットがクローズした場合は POST メソッドを中断し、httptunnel サーバーはステータスコード等は返さない。
- httptunnel サーバーは GET メソッドのレスポンスボディで元ソケットの受信側のデータを流す。 受信のデータのサイズは事前に予想出来ないので、Content-Length は仮の値を入れ置き、トンネル先のソケットが終了した場合は GET メソッドを中断する。
このように httptunnel の GET/POST メソッドは HTTP の規約に違反している。 nginx のリバースプロキシは TCP ソケットとして動作を正しく模さずに、HTTP として解釈して丸めた処理をしている。 これが原因となって scp 転送が失敗していると思われる。