monolithic kernel

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/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_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設定を指定している部分を分離しているので、組み合わせの爆発を回避していることがわかりますね。例では数が少ないですが、数が増えた場合には効果も大きいと思います。