linux下翻墙访问bitbucket.org仓库

今天往 bitbucket.org push 时才发现 bitbucket 被 GFW 了。我的仓库为 Mercurial hg,hg 项目根目录下的 .hg/hgrc 配置文件中可指定 http_proxy,试了一下不支持 socks 代理(我的浏览器用它来翻墙),最终使用 tsocks 或 proxychains 实现翻墙访问 bitbucket.org 仓库。

使用 ssh 服务代理网络访问

创建本地 socks 代理的脚本 ssh_proxy.sh

#!/bin/bash

n=`ps waux | grep 'bash .*/ssh_proxy.sh' | grep -v grep | wc -l`
if [ $n -lt 3 ]; then
    while [ true ]; do
        n=`ps aux | grep 'ssh' | grep '7070' | grep -v grep | wc -l`
        if [ $n -lt 1 ]; then
            echo "start ssh connecting"
            ssh -qTnNf -D 7070 user@host
        fi
        echo "wait for next checking"
        sleep 30
    done
fi
echo "ssh_proxy.sh already running"

请将 user@host 改为你的 vps 用户及主机,并配置为免输入密码。

启动 socks 代理脚本

nohup bash ./ssh_proxy.sh &

通过 ssh 隧道是最简单的方式,vps 一般都会开 ssh 服务,拿来即用。

使用 shadowsocks 服务代理网络访问

vps 上安装并启动 shadowsocks 服务器(ss-server),配置文件 /etc/shadowsocks.json 内容如下

{
  "server":"0.0.0.0",
  "server_port":8989,
  "password":"7FdiirqD",
  "timeout":600,
  "method":"aes-256-cfb",
  "fast_open": false,
  "workers": 1
}

password 请自行进行修改。

pc 上安装并启动 shadowsocks 客户端(ss-local),配置文件 /etc/shadowsocks.json 内容如下

{
  "server":"X.X.X.X",
  "server_port":8989,
  "local_port":7070,
  "password":"7FdiirqD",
  "timeout":600,
  "method":"aes-256-cfb",
  "fast_open": false,
  "workers": 1
}

server 请自行修改为真正的 shadowsocks 服务器外网 IP。

透明代理

firefox 可以配置为通过 socks 代理联网,但绝大多数应用是不支持的,而透明代理(Transparent Proxy)可以使这些应用也使用代理联网。

ss-redir

shadowsocks 自带的本地透明代理客户端,可以使整个系统都使用代理访问网络。

参考 man ss-redir (1): shadowsocks client as transparent proxy, libev port

tsocks

  • 安装

    yaourt -S tsocks
    
  • 配置

    /etc/tsocks.conf

    # We can access 192.168.0.* directly
    local = 192.168.0.0/255.255.255.0
    local = 10.0.0.0/255.0.0.0
    
    # Otherwise we use the server
    server = 127.0.0.1
    server_port = 7070
    

    具体用法 man tsocks.conf

  • 使用

    让 hg 用上 socks 代理功能

    tsocks hg push
    

    tsocks 看起来很通用,应该也可以让 git 等进行 socks 代理访问。

proxychains

tsocks 不支持代理访问 https

$ tsocks curl https://www.baidu.com
curl: (7) Failed to connect to www.baidu.com port 443: Connection refused

proxychains 支持代理访问 https

$ proxychains curl https://www.baidu.com
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/libproxychains4.so
[proxychains] DLL init: proxychains-ng 4.11
[proxychains] Dynamic chain  ...  127.0.0.1:7070  ...  www.baidu.com:443  ...  OK
<html>
<head>
    <script>
        location.replace(location.href.replace("https://","http://"));
    </script>
</head>
<body>
    <noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>

proxychains 的安装配置请参考:用tsocks和proxychains代理Linux下所有软件 - 蜗牛图书馆

将 socks 代理转换为 http 代理

go get 不支持 proxychains(应该是 go 是静态链接的原因),可以使用 privoxy 将 socks 代理转换为 http 代理。

安装 privoxy

yaourt -S privoxy

修改 privoxy 配置文件 /etc/privoxy/config ,添加以下配置行

forward-socks5  / 127.0.0.1:7070 .
# local network do not use proxy
forward         192.168.*.*/     .
forward            10.*.*.*/     .
forward           127.*.*.*/     .

启用 privoxy 服务

sudo systemctl enable privoxy
sudo systemctl start privoxy

通过 http 代理使用 go get

export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
go get golang.org/x/net

参考:go get socks proxy设置 | 爱吃猫粮的鱼


linux