티스토리 툴바

달력

052012  이전 다음

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  

最近の企業内F/Wや企業内Proxyは、tcp/httpとtcp/httpsしか穴が開いてない。だが、目の前にPCがあるにもかかわらず、自宅鯖にログインするときにいちいちW-ZERO3を起動するのもなかなかに面倒だ。傍目には遊んでるとしか思われないし、画面も小さいし :-)
ここでは一般的によく使われているS/Wで動くパケットリピータstoneを使ってパケットをhttpもしくはhttpsに化かして(トンネルさせて)疎通させることにする。

方針

上述のような使い方をするには、鯖にもクライアントにもstoneを入れる必要がある。お互いに意味不明なhttpsパケットを送受信しても正常にトンネリングされる(お互いにHTTPSヘッダを付けたり外したりする)ようにしなければならないからだ。

ここで示す例は、正常に設定されているsshサービス(tcp/22)をhttps経由で使う場合だ。模式図で書くと以下のようになる。

     [自宅鯖]----(Internet)----[企業内Proxy]----[クライアントPC]
            |                                   |
    SSH2 -->|<------------- HTTPS ------------->|<-- SSH2
  (tcp/22)  |             (tcp/443)             | (tcp/10022)

鯖の対応

Debian Etchでは apt-get でインストール可能だ。

# apt-get install stone

ただ、インストールされるのはバイナリのみで、設定ファイルの雛形や起動スクリプトすらインストールされないので、これらは自分で作らねばならない。

  1. 設定ファイル(サーバ用)を作成

    /etc/stone.conf として保存する。
    この例では鯖のtcp/443ポートに届いたパケットを、httpsヘッダを取り除いてtcp/22に中継することを意味する。

    localhost:22 443
  2. 起動スクリプトを作成

    /etc/init.d/stone として保存する。
    パーミッションもそにあるスクリプト群と合わせること。Debian Etchでは755である。

    #! /bin/sh
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="TCP/IP packet repeater in the application layer"
    NAME=stone
    DAEMON=/usr/bin/$NAME
    DAEMON_ARGS="-l -D -C /etc/stone.conf"
    SCRIPTNAME=/etc/init.d/$NAME
    KILL=/usr/bin/killall
    
    [ -x "$DAEMON" ] || exit 0
    
    case "$1" in
      start)
           echo "Starting $DESC:" "$NAME"
           $DAEMON $DAEMON_ARGS
           ;;
     stop)
           echo "Stopping $DESC:" "$NAME"
           $KILL $NAME
           ;;
     *)
           echo "Usage: $SCRIPTNAME {start|stop}" >&2
           exit 3
           ;;
    esac
  3. サービスとして登録

    コマンド一発。これで鯖を再起動しても勝手に上がってくる。

    # update-rc.d -f stone defaults
  4. stoneをサービスとして起動する
    # /etc/init.d/stone start
  5. tcp/443が外に向けてLISTENしていることを確認

    正常に上がっていると、以下のように表示される。

    # netstat -alnA inet | grep "443"
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN

クライアント側の対応

Windows系とLinux系で異なる。stoneにはWindows向けバイナリも存在するので、Windowsのサービスとして登録すると手間が掛からない。

  • Linux 編

Debian Etchでは先ほどと同様 apt-get でインストール可能だ。

# apt-get install stone

よって、インストールされるのはバイナリのみで設定ファイルの雛形や起動スクリプトすらインストールされないのも同様なので、これらは自分で作らねばならない。

  1. 設定ファイル(クライアント用)を作成

    /etc/stone.conf として保存する。
    この例ではクライアントのtcp/10022ポートから出るパケットについて、Proxyサーバへ中継する際にhttpヘッダを付けるようにし、そこで付けるhttpヘッダにはHTTP/1.0のCONNECTリクエストでhttpsなURLに化かす。もちろんここで設定するURLは、sshで接続したい鯖のものにする。

    XXX.XXX.XXX.XXX:8080/http 10022 "CONNECT www.example.com:443 HTTP/1.0"
  2. 起動スクリプトを作成

    /etc/init.d/stone として保存する。
    パーミッションもそにあるスクリプト群と合わせること。Debian Etchでは755である。

    #! /bin/sh
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="TCP/IP packet repeater in the application layer"
    NAME=stone
    DAEMON=/usr/bin/$NAME
    DAEMON_ARGS="-l -D -C /etc/stone.conf"
    SCRIPTNAME=/etc/init.d/$NAME
    KILL=/usr/bin/killall
    
    [ -x "$DAEMON" ] || exit 0
    
    case "$1" in
      start)
           echo "Starting $DESC:" "$NAME"
           $DAEMON $DAEMON_ARGS
           ;;
     stop)
           echo "Stopping $DESC:" "$NAME"
           $KILL $NAME
           ;;
     *)
           echo "Usage: $SCRIPTNAME {start|stop}" >&2
           exit 3
           ;;
    esac
  3. サービスとして登録

    コマンド一発。これでクライアントを再起動しても勝手に上がってくる。

    # update-rc.d -f stone defaults
  • Windows 編

Windowsでも基本は同じ。「バイナリがWindows向けになっていること」と「サービスに設定する手順が異なる」だけである。

  1. Windows 向けバイナリをDLし解凍

    この例ではディレクトリごと C:\bin\stone に保存する。

  2. configを書く

    C:\bin\stone 内に stone.cfg として、Linux編と同じ内容を記述する。

    XXX.XXX.XXX.XXX:8080/http 10022 "CONNECT www.example.com:443 HTTP/1.0"
  3. Windowsサービスとして登録する

    解凍したディレクトリにある README にも記述されているが、DOSプロンプトからのコマンド入力で、stoneをWindowsサービスとして設定できる。こうすることでPCの電源を入れるたびに勝手に起動されるようになる。

    C:\>stone -M install repeater -C C:\bin\stone\stone.cfg

使い方

UTF-8 TeraTerm Pro with TTSSH2などのコンソールエミュレータでは、

  • 接続先ホスト名は localhost
  • 接続先ポート番号は 10022

とする以外は、SSHの秘密鍵などを通常どおり設定することで自宅鯖に接続できる。

もし企業内で容易に試験できない場合は、httpsに対応したOpen Proxyを経由させることで、自宅で同様の試験が可能だ。
httpsに対応したOpen Proxyはなかなか無いが、ここはほぼリアルタイムで、生きているOpen Proxyが列挙されているので、設置されている国に注意して適宜使用する。
(ロシアや中国は…ね)

tips

stoneで接続させるには、概ね以下のどれかで可能になるはずだ。
もしできない場合は、その企業網をハックするしかないが…。
なお、クライアント側で"Basicパスワード"とある部分には、アカウントとパスワードをコロンで繋げた文字列(例えば、 tylor:password)を更にBASE64でencodeした文字列を入れる必要がある。BASE64エンコードにはJavaScript による Base64 エンコーダ/デコーダ簡略版が便利。

  • 鯖側
stone localhost:22 443
stone localhost:22 443/ssl
  • クライアント側
stone 鯖:ポート/ssl localhost:ポート
stone 串:8080/http 10022 "CONNECT 鯖:443 HTTP/1.0"
stone 串:8080/proxy 10022 "Proxy-Authorization:Basicパスワード"
stone localhost:10443/ssl 10022 -- 串:8080/http 10443 "CONNECT 鯖:443 HTTP/1.0"
stone 串:8080/proxy 18080 "Proxy-Authorization:Basicパスワード" -- localhost:18080/http 10022 "CONNECT 鯖:443 HTTP/1.0"
stone localhost:10443/ssl 10022 -- localhost:18080/http 10443 "CONNECT 鯖:443 HTTP/1.0" -- 串:8080/proxy 18080 "Proxy-Authorization:Basicパスワード"
 
출처:http://www.tylor.jp/index.php?stone
Posted by 동경불나방