HTTPプロキシサーバ経由のssh接続
SSH over HTTP (HTTP Tunnelling) のやり方について説明します。HTTPのプロキシサーバを経由して、Secure Shellでサーバにログインできます。ここで扱うのは、HTTPトンネリングです。
読み方
- SSH over HTTP
- すえすえいち おーばー えいてぃてぃぴー
目次
概要
HTTPしか出ていけない環境で、ssh接続したいときに、どのように実現すれば良いのでしょうか?1つの方法は、sshをHTTPでトンネリングすることです。
ssh -> httpプロキシ -> サーバ
ここでの例では、OpenSSHを利用していますが、TeraTerm, PuTTYなどのsshクライアントもプロキシサーバの設定が可能です。
ここの例では、22番に接続していますが、sshdを443でアクセス可能にすることによって、自分が制御できないプロキシ経由でもアクセスが可能になります。
ここでは、HTTPトンネリングの例ですが、ICMPを利用したICMPトンネリングでトンネリングすることもできます。sshを利用して、sshポートフォワーディングによるsshトンネリングもよく利用されます。コネクションの中継のためにncatなんかも利用されます。
何のために使うのか
トンネリング自体は、正常な状態であれば、必要はありません。
通信経路が限定されているため、しかたがなく、socatなどでソケットトンネリングをするようなケースがありますが、おそらく、ネットワーク構成に問題がありそうです。
そのほかのケースで、トンネリングが必要なのは、たいていの場合、攻撃者が攻撃を検知されにくくするため、だったり、通信の制限のある環境で通信を確立するために用いられます。
用意するもの
- プロキシ
- connect-proxy
- ssh クライアント
インストール
Ubuntu
apt install squid3 apt install connect-proxy apt install openssh-client
設定
squidの設定
squidの設定に以下の設定が必要です。 Ubuntuの場合は、/etc/squid3/squid.conf の設定ファイルを編集します。
acl SSL_ports port 22 acl Safe_ports port 22 # ssh
設定編集後に、squidを再起動して、設定を反映してください。
sshの設定
sshのssh_configにも設定が必要です。~/.ssh/config を編集します。
Host example.com Hostname example.com ProxyCommand connect-proxy -H localhost:3128 %h %p
使い方
設定さえできれば、あとは、sshコマンドを実行するだけで、自動的にプロキシ経由で、sshの接続が確立できます。
ssh example.com
connect-proxy
コマンドラインオプション
connect-proxyコマンドのコマンドラインオプションは、以下の通りです。
usage: connect-proxy [-dnhst45] [-p local-port][-R resolve] [-w timeout] [-H proxy-server[:port]] [-S [user@]socks-server[:port]] [-T proxy-server[:port]] [-c telnet-proxy-command] host port
エラー
ssh が以下のようなエラーを起こす場合は、プロキシの設定に問題があります。
root@5ecf56dbad43:/root# ssh -v example.com OpenSSH_6.6, OpenSSL 1.0.1f 6 Jan 2014 debug1: Reading configuration data /root/.ssh/config debug1: /root/.ssh/config line 1: Applying options for example.com debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Executing proxy command: exec connect-proxy -H localhost:3128 example.com 22 debug1: permanently_set_uid: 0/0 debug1: permanently_drop_suid: 0 debug1: identity file /root/.ssh/id_rsa type -1 debug1: identity file /root/.ssh/id_rsa-cert type -1 debug1: identity file /root/.ssh/id_dsa type -1 debug1: identity file /root/.ssh/id_dsa-cert type -1 debug1: identity file /root/.ssh/id_ecdsa type -1 debug1: identity file /root/.ssh/id_ecdsa-cert type -1 debug1: identity file /root/.ssh/id_ed25519 type -1 debug1: identity file /root/.ssh/id_ed25519-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.6p1 Ubuntu-2ubuntu1 FATAL: failed to begin relaying via HTTP. ssh_exchange_identification: Connection closed by remote host
ssh が以下のようなエラーを起こす場合は、プロキシの設定に問題があります。
root@5ecf56dbad43:/root# connect -d -H localhost:3128 example.com 22 DEBUG: No direct address are specified. DEBUG: relay_method = HTTP (3) DEBUG: relay_host=localhost DEBUG: relay_port=3128 DEBUG: relay_user=root DEBUG: local_type=stdio DEBUG: dest_host=example.com DEBUG: dest_port=22 DEBUG: checking example.com is for direct? DEBUG: example.com is for not direct. DEBUG: resolving host by name: localhost DEBUG: resolved: localhost (127.0.0.1) DEBUG: connecting to 127.0.0.1:3128 DEBUG: begin_http_relay() DEBUG: >>> "CONNECT example.com:22 HTTP/1.0\r\n" DEBUG: >>> "\r\n" DEBUG: <<< "HTTP/1.1 403 Forbidden\r\n" DEBUG: http proxy is not allowed. FATAL: failed to begin relaying via HTTP.
なお、squidのaccess.logには、 TCP_DENIED と、接続を拒否したことを表すエラーが出ています。
1433677529.178 0 127.0.0.1 TCP_DENIED/403 3407 CONNECT example.com:22 - HIER_NONE/- text/html
SSLの接続先ポートとして 22 番が許されていない、安全なポートとして22 が設定されていない場合に、上記のエラーがでます。squidの設定でいえば、 SSL_ports と Safe_ports の設定です。 「squidの設定」(前述)の設定で示した設定が必要です。
acl SSL_ports port 22 acl Safe_ports port 22 # ssh
設定編集後に、squidを再起動して、設定を反映してください。
どうやって防ぐか
プロキシを提供している場合に、CONNECT 接続のセッションで、特に長いセッションが疑わしいのではないでしょうか。
関連項目
ツイート