UI やコマンドラインを作ってみましたが、肝心のパケットのやりとり部分がわかりませんでした。
現在の accept_wnd_proc では反対側に素通しにしています。SOCKS をサポートするには accept_local_connection に行く前に接続元とやりとりを繰り返し(SOCKS 4 なら 1 往復、SOCKS 5 なら認証を NO AUTHENTICATION REQUIRED にして 2 往復)、大丈夫ならその後素通しにする必要があります。しかしどう実装したらいいのかよくわかりませんでした。
これだけではあれなので、SOCKS そのものについて調べてました。
SOCK には次の 7 種類があります。
CONNECT | BIND | UDP | |
SOCKS 4 | ○ | ○ | ― |
SOCKS 4A | ○ | ○ | ― |
SOCKS 5 | ○ | ○ | ○ |
※ PuTTY は CONNECT のみサポートしているようです。
SOCKS 4 は IPv4 の IP アドレス接続をサポートしています。IPv6 はサポートしていません。
SOCKS 4A は SOCKS 4 の拡張で、IPv4 のホスト名接続をサポートしています。
SOCKS 5 は、IPv4 および IPv6 の IP アドレス接続と、ホスト名接続をサポートしています。
※ PuTTY は SOCKS 5 の IPv6 接続をサポートしていません。
※ ホスト名接続の場合には名前解決が SOCKS サーバにまかされますが、SOCKS サーバになる TTSSH ではなく転送先の sshd 側にそのまま投げるべきと思われます。
というので行けそうな気がします。
あと、X11 forwarding で使っている channel filter の仕組みが利用出来るかもしれません。
ちょっと試してみます。
試験的に実装してみました。現在のところ、CONNECT のみ対応となっています。(BINDは必要?)
現在のところ UI 部分は未実装で、コマンドラインオプションで /ssh-D1080 のようにして使うようになっています。
添付のパッチが作成された頃とは一部 UI が変わっていますが、この辺りはどうしましょうか?
仕組みとしては channel filter として転送に干渉し、クライアントからの要求に基づいて LtoR の転送を開いた後は filter を削除して、後は通常の LtoR 転送として動作します。
TTProxyを利用した以下の ssh 接続が出来る事を確認しています。
また、IEでSOCKSプロキシを設定した状態でいくつかのサイトの閲覧が行える事を確認しています。 ただし、コネクションを大量に張ろうとして、チャネルが開けなくなる事がありました。
また一部のエラー処理に問題があるのか、SOCKS転送を提供している Tera Term で、 キーボード入力してもサーバが反応しなくなる事がありました。
リリースまでに安定したらいいなあ。
UIを作成しました。
TODO: 同じホスト・ポートでのリッスンをチェックしてエラーにしていますが、L内とD内でのチェックだけではなくLとDをまたいだチェックも必要です。
LとDをまたいだチェック
sort して前後で同じ設定かをチェックしているので、チェック方法の修正が必要
リッスンポートのチェックを追加しました。
あと何か必要な物ってありましたっけ?
まだ不安定な気がしますが、一旦クローズします。
現在判明している残件は別チケットで。 #37464
ポート転送のタイプで、ダイナミック(Socks)に対応していると便利。
例えば、ウェブブラウザのプロキシ設定でダイナミック転送のポートをSocksプロキシに設定すると、ssh接続先をプロキシサーバとして利用できる。