X11をプロキシするときsocatは失敗しますが、sshが成功するのはなぜですか?

X11をプロキシするときsocatは失敗しますが、sshが成功するのはなぜですか?

私は単純なX11 Unixソケットベースのプロキシを作成しようとしています。さまざまな標準アプリケーションを試して独自のコードを書いたが、得られた結果は非常に多様であった。何が間違っていますか?

背景:私の究極の目標は、xpraとxepyrの軽量代替品として、セキュリティ目的のためにフィルタリングX11プロキシを実装することです。バラよりFirejailを使用したFirefoxブラウザサンドボックスX11の脆弱性に関する追加情報。

努力する

  • ssh localhost -X

    私たちはXリツイートを知って愛していますssh。良い結果。

  • ssh localhost -R /tmp/.X11-unix/Xnnn:/tmp/.X11-unix/X0

    sshソケットも渡すことができ、X転送はそれをうまく処理します。 (参考に手動で設定する必要があります。DISPLAY=:nnn

  • socat UNIX-LISTEN:/tmp/.X11-unix/Xnnn,fork UNIX-CONNECT:/tmp/.X11-unix/X0

    socat本質的にソケットプロキシとして設計されたプログラムです。しかし、それを介したX11の配信は不安定です。 (参考に手動で設定する必要があります。DISPLAY=:nnn

  • socat UNIX-LISTEN:/tmp/.X11-unix/Xnnn UNIX-CONNECT:/tmp/.X11-unix/X0

    すべての接続を分岐するのではなく、1つのsocat接続のみを処理してから終了できます。これによりFirefoxは機能しますが、Okularまたはkeepassxは機能せず、継続的に実行されるプロキシが必要なため、どのような場合でも実用的ではありません。

  • ソケット配信用に作成したHaskellアプリケーション

    アプリケーションは着信接続ごとにスレッドを開始し、プロキシソケットからサーバーソケットに、またはその逆にデータを渡します。結果は同じsocat fork

  • 私が書いたHaskellアプリはソケットを渡しますが、1つの接続しか許可しません。

    上記と同じですが、1つの接続のみを許可します。結果socatはnoに等しく、forkこれは疑わしいです。

結果

私は基本的なXアプリケーション(、、、、)、Firefox、Firefoxを使ってすべてのプロキシの試みをxtermテストしましたxeyesxclockxevオークラそしてkeepassx。結果は次のとおりです。 ✓ 有効な場合、無効な場合は空白です。機能しない組み合わせの場合、アプリケーションは出力なしで「中断」され、何も実行中であるという指示はありません。

ssh -X ssh -R socat fork socatいいえfork Haskell アプリケーション Haskell アプリケーションは 1 つだけ許可されます。
ベーシックX
Firefoxブラウザ
オークラ
パスワードを維持する

質問

最大の質問はなぜ機能しないのですsocatsshsocat唯一の作業はソケットを渡すことなので、他の作業がある以外にも性能が悪いことに驚きましたssh。私が見つけたopensshのソケット配信ソースsocatしかし、うまくいかない方法で動作する理由を理解するには複雑すぎます。

私が欠落している可能性があるソケットプロキシアプリケーションに明確な内容を書く必要がありますか?

学習できるXを正常に渡すことができる単純な(数百行)ソケットプロキシのサンプルソースコードはありますか? openssh コードベースが大きすぎます。

Firefoxが新しい接続を許可しないと、socatアプリが突然Firefoxと連携し始めるのはなぜですか?

答え1

1つ以上のX拡張(私の考えでは、DRIはそのうちの1つだと思います)はUnixドメインソケットを介してファイル記述子を送信し、これらのファイル記述子はプロキシされませsendrecv。代わりにsendmsg/を使用recvmsgしてすべてのCMsgデータを送信する必要があります。

これはあなたが見つけた結果をよく説明します。socatファイル記述子がプロキシされず(コードから呼び出されないsendmsg)、Haskellアプリケーションもプロキシされないと思います。なぜそれが機能するのかわかりませんssh -R

ネイティブX11プロキシを作成しようとしたとき、私自身もこの問題のために戸惑いました。最後に、ソースコードを操作して問題を解決し、xtraceUnix接続を正常にプロキシしました。

関連情報