socks over http(その1)
SOCKS を HTTPプロトコルでラップできるのか調べてみました。
以下のようなページが見つかったのでどうもできるようです。
Socks via HTTP
http://lightbox.ath.cx/socks/
プロトコルの詳細についても一応調べてみました。
SOCKS4プロトコル
http://hp.vector.co.jp/authors/VA017085/text/socks4.html
SOCKS を HTTPでラップするクライアントと
HTTP中のSOCKSプロトコルを取り出す サーバ
の2つがあれば何とかなりそうです。
ということで作り始めてみました。
手始めに 通信データに対して何の加工もせずに Socksサーバにデータ中継できるサーバプログラムを作ってみます
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class HttpSocks { public static void main(String[] args) { proxy(); } public static void proxy() { int port = 55110; //サーバーポート String socks_host = "192.168.1.6"; //Dante が動いているホスト名 int socks_port = 49153; //Socksサービスポート try { ServerSocket server = new ServerSocket(port); while (true) { Socket in_socket = server.accept(); Socket out_socket = new Socket(socks_host, socks_port); createThread(in_socket, out_socket).start(); createThread(out_socket, in_socket).start(); } } catch (Exception err) { err.printStackTrace(); } } public static Thread createThread(final Socket input_socket, final Socket output_socket) throws IOException { Runnable r = new Runnable() { public void run() { try (InputStream in = new BufferedInputStream(input_socket.getInputStream()); OutputStream out = new BufferedOutputStream(output_socket.getOutputStream());) { int cnt = -1; byte[] buffer = new byte[1024]; while ((cnt = in.read(buffer, 0, buffer.length)) != -1) { debugLog(buffer, cnt); out.write(buffer, 0, cnt); out.flush(); } } catch (Exception err) { //err.printStackTrace(); } } }; return new Thread(r); } public static void debugLog(byte[] data, int cnt) { //DEBUG LOG for (int i = 0; i < cnt; i++) { System.out.print("0x" + Integer.toHexString(data[i] & 0xff)); } System.out.println(); } }
ブラウザの Socks に localhost:55110
Dante を 192.168.1.6:49153 で動作させて
WebブラウザとSocksサーバ間にProxy動作させることに成功。
ちょっと苦労しましたが、出来ました。
Httpでラップするのも行けそうな予感。
ソースはここ
https://github.com/moremagic/HttpSocks
moremagic
2015-03-01