monolithic kernel

SquidとCorkscrewでSSH over HTTP

March 23, 2012

    前に似たようなことを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設定を指定している部分を分離しているので、組み合わせの爆発を回避していることがわかりますね。例では数が少ないですが、数が増えた場合には効果も大きいと思います。