私は単純な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は機能せず、継続的に実行されるプロキシが必要なため、どのような場合でも実用的ではありません。-
アプリケーションは着信接続ごとにスレッドを開始し、プロキシソケットからサーバーソケットに、またはその逆にデータを渡します。結果は同じ
socat fork
私が書いたHaskellアプリはソケットを渡しますが、1つの接続しか許可しません。
上記と同じですが、1つの接続のみを許可します。結果
socat
はnoに等しく、fork
これは疑わしいです。
結果
私は基本的なXアプリケーション(、、、、)、Firefox、Firefoxを使ってすべてのプロキシの試みをxterm
テストしましたxeyes
。xclock
xev
オークラそしてkeepassx
。結果は次のとおりです。 ✓ 有効な場合、無効な場合は空白です。機能しない組み合わせの場合、アプリケーションは出力なしで「中断」され、何も実行中であるという指示はありません。
ssh -X |
ssh -R |
socat fork |
socat いいえfork |
Haskell アプリケーション | Haskell アプリケーションは 1 つだけ許可されます。 | |
---|---|---|---|---|---|---|
ベーシックX | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Firefoxブラウザ | ✓ | ✓ | ✓ | ✓ | ||
オークラ | ✓ | ✓ | ||||
パスワードを維持する | ✓ | ✓ |
質問
最大の質問はなぜ機能しないのですsocat
かssh
。socat
唯一の作業はソケットを渡すことなので、他の作業がある以外にも性能が悪いことに驚きましたssh
。私が見つけたopensshのソケット配信ソースsocat
しかし、うまくいかない方法で動作する理由を理解するには複雑すぎます。
私が欠落している可能性があるソケットプロキシアプリケーションに明確な内容を書く必要がありますか?
学習できるXを正常に渡すことができる単純な(数百行)ソケットプロキシのサンプルソースコードはありますか? openssh コードベースが大きすぎます。
Firefoxが新しい接続を許可しないと、socat
アプリが突然Firefoxと連携し始めるのはなぜですか?
答え1
1つ以上のX拡張(私の考えでは、DRIはそのうちの1つだと思います)はUnixドメインソケットを介してファイル記述子を送信し、これらのファイル記述子はプロキシされませsend
んrecv
。代わりにsendmsg
/を使用recvmsg
してすべてのCMsgデータを送信する必要があります。
これはあなたが見つけた結果をよく説明します。socat
ファイル記述子がプロキシされず(コードから呼び出されないsendmsg
)、Haskellアプリケーションもプロキシされないと思います。なぜそれが機能するのかわかりませんssh -R
。
ネイティブX11プロキシを作成しようとしたとき、私自身もこの問題のために戸惑いました。最後に、ソースコードを操作して問題を解決し、xtrace
Unix接続を正常にプロキシしました。