SOCKS経由でOpenSSHを使う方法


はじめに(事の経緯とか)

某所で使っているLinux-BoxをVine2.1.5に移行した。このLinux環境から、ファイアウォールを介してインターネットにアクセスする必要があるんだけど、こちらの場合、telnet, ftp, sshなどに関しては、SOCKSサービスを利用することになっている。そこで、socks5とsocks対応のsshをセットアップすることになった。
これらは、移行前の環境からそのままコピーすればいいんだけど、VineではOpenSSH関連のパッケージ群が標準でインストールされるため、sshについては、これを使うのがスマートだな、ということで、SRPMを持ってきて再構築することにした。
従来だと、"--with-socks5[=PATH]"というオプションで対応していたんだが、ドキュメントやヘルプを見ても、それらしい記述が見当たらない。。ネットなどでいろいろ調べるうち、どうやらOpenSSHでは、Version2に上がる頃からSOCKS5サポートを打ち切ったらしい、ということがわかった。これは、OpenSSHの"ProxyCommand"という機能で代用できるし、何よりコードを簡素化できて保守性も向上できるからだ、と言っている。
man ssh とかやってみたけど、ProxyCommand というのがよく分からない(涙)し、いったいどんなコマンドを実行すればいいんだろう、と、またまた調べていくと、ありがたいことに、connect.c という、SOCKS4/5 やHTTP Proxy とのコネクションを確立するためのプログラムと遭遇。そこで今回はこれを使ってみる事にした。

OpenSSHをSOCKS5に対応させる方法

まずは、SOCKS5がインストールされた環境下で、connect.c を make。
 $ gcc -o connect -lresolv connect.c
次に、出来上がったconnect を /usr/local/bin あたりにコピー。
 $ cp -a connect /usr/local/bin
最後に、~/.ssh/config に、
 ProxyCommand /usr/local/bin/connect -S socks-server %h %p
と書けば出来上がり。後は、普通に、
 $ slogin remote-host-name
とやればつながる。。。はずなんだけど、
 Can't get password for user xxxxx
というエラーが出てうまくいかない。(涙)
会社のSOCKS5サーバではユーザID/パスワードによる認証はしていないはずなのに。。と思いながら、しばしconnect.c を眺めていると、この認証処理の部分をすっ飛ばせるように考慮されていることが判明。というほど大げさな発見ではないが、このプログラムの作者に感謝しつつ、149行目付近にある、
 #define SOCKS_ALLOW_USERPASS_AUTH
をコメントアウト。再度、makeして試すと、今度はばっちり。:-)
というわけで、無事、OpenSSHのSOCKS5対応が完了したのでした。

おまけ

いろいろ試行錯誤する過程で、SOCKS4も試してみたけど、会社の環境では、名前解決ができませんでした。-lresolv とかもつけてみたんだけど。。 SOCKS4のバージョンレベルにも関係するのかな? ちなみに、SOCKS4サーバ経由でsshを使う時は、~/.ssh/config に、
 ProxyCommand /usr/local/bin/connect -4 -S socks4-server %h %p
とするようです。

参考文献など


Copyright (c) 2000-2004 Ryoichi "Rio" MURASHIMA
[戻る] [R!o Interactive top]