SquidとCorkscrewでSSH over HTTP
前に似たようなことをstoneでやったのですが、MacのHomebrewにstoneのパッケージがなかったので、今度はSquidとCorkscrewでやってみました。HTTPでSquidに接続し、そこからsshサーバに接続します。
サーバはUbuntu Server 11.10、クライアントはOS X 10.7.3な環境で試してます。
サーバ側の設定
Squidのインストール
sudo apt-get install squid
Squidの設定
Basic認証用にユーザを作成しておきます。ほんとはDigest認証を使いたいところですが、残念ながら今回の用途では利用できないようです。
sudo htpasswd -c /etc/squid/passwd mono
ポートはデフォルトでは3128になっています。443などのすり抜けられそうなポートに変更しましょう。ポートに制限がなかったとしても、わざわざわかりやすい番号を開けておくのは間抜けなので変えた方がいいでしょう。
http_port 443
Basic認証を利用するように設定します。
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwdauth_param basic children 5auth_param basic realm Squid proxy-caching web serverauth_param basic credentialsttl 2 hoursauth_param basic casesensitive off
SSHのポートに対するアクセスを許可するようにします。
acl SSL_ports port 22
接続時にパスワードを要求するようにします。
acl password proxy_auth REQUIRED
http_access allow password
アクセス元を制限したほうがより安全でしょう。
acl mynetwork src x.x.x.x
http_access allow password mynetwork
変更した設定を反映させます。
sudo service squid reload
ファイアウォールの設定を変更して外部からアクセスできるようにすれば完了です。
sudo ufw allow 443/tcp
クライアント側の設定
Corkscrewのインストール
Homebrewでインストールします。
brew install corkscrew
proxyの設定
認証用のファイルを作成します。
vi ~/.ssh/proxyauth
「ユーザ名:パスワード」の形式で記述します。
mono:password
ssh接続時にCorkscrewを利用するように設定します。
vi ~/.ssh/config
単にCorkscrewを利用するだけなら以下の行を記述すればおしまいです。
ProxyCommand /usr/local/bin/corkscrew 接続先のホスト 接続先のポート %h %p ~/.ssh/proxyauth
実用的な設定方法
実際に使う場合は、Corkscrewを通すか通さないかを簡単に切り替えられるようにしたい・複数の接続先を利用したい、などの要望が考えられるので、ちょっと書き方を工夫します。
Host server-1 server-1-proxy-1 server-1-proxy-2 Hostname server-1 User mono
Host server-2 server-2-proxy-1 server-2-proxy-2 Hostname server-2 User ramu
Host *-proxy-1 ProxyCommand ...
Host *-proxy-2 ProxyCommand ...
接続時は以下のように解釈されます。
$ ssh server-1 : Hostname server-1へ接続する
$ ssh server-2 : Hostname server-2へ接続する
$ ssh server-1-proxy-1 : Hostname server-1へproxy-1を利用して接続する
$ ssh server-2-proxy-1 : Hostname server-2へproxy-1を利用して接続する
$ ssh server-1-proxy-2 : Hostname server-1へproxy-2を利用して接続する
$ ssh server-2-proxy-2 : Hostname server-2へproxy-2を利用して接続する
この場合は 接続先2通り * proxy3通り(proxy2通り+proxyなし) = 6通り の設定が考えられますが、接続先を指定している部分とproxy設定を指定している部分を分離しているので、組み合わせの爆発を回避していることがわかりますね。例では数が少ないですが、数が増えた場合には効果も大きいと思います。