Go
golang
Socks

net/httpでSOCKS proxyを扱う

More than 3 years have passed since last update.

GoはデフォルトではHTTP_PROXY環境変数を使うことでHTTP Proxyを使うことが出来るのですが、SOCKSは対応していません。

hailiang/socksがSOCKSのライブラリを適用してくれているのでTransportに突っ込むことでSOCKS経由で通信することができます。

mkdir -p go-socks-example/src

cd go-socks-exmaple
export GOPATH=`pwd`
go get -u "github.com/hailiang/socks"

package main

import (
"fmt"
"github.com/hailiang/socks"
"io/ioutil"
"net/http"
)

func main() {
dialSocksProxy := socks.DialSocksProxy(socks.SOCKS5, "127.0.0.1:1080")
tr := &http.Transport{Dial: dialSocksProxy}
httpClient := &http.Client{Transport: tr}

req, _ := http.NewRequest("GET", "http://google.com", nil)
res, err := httpClient.Do(req)
if err != nil {
fmt.Printf("Error: %s\n", err)
return
}
defer res.Body.Close()
contents, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Printf("Error: %s\n", err)
return
}
fmt.Printf("result: %s\n", contents)
}

# 別ターミナルでSOCKSつくっとく

ssh YOUR_SERVER -D 1080
# 動かす
go run example.go

社内ツールなどはSOCKS経由でアクセスできると色々楽だったりするので、組み込んでおくと捗るかもしれません。