翻墙过程 回首页

1.买了一个翻墙的ssh的帐号.
2.linux增加一个专用登陆SSH的用户,限制远程权限:仅给tcp转发权限,无shell权限.
    useradd -s /bin/false <username>
    passwd <username>
    (对已有帐号: usermod -s /bin/false <username>)
3.建立Tunnel:
    ssh -D 7070 -qTfnN <username>@<hostname>
    输入密码即可使用(也可以用key认证)

    让内网所有机器都搭上云梯:
    ssh -qTfnN -D 0.0.0.0:7070 <username>@<hostname>

    # netstat -anp| grep 7070
    tcp     0      0 0.0.0.0:7070       0.0.0.0:*   LISTEN      1444/ssh

参数详解:
    -D 7070 建立动态Tunnel,监听在本地7070端口.
    -q 安静模式.
    -f ssh在后台运行,即认证之后,ssh退居后台.
    -n 将stdio重定向到/dev/null,与-f配合使用.
    -N 不运行远程程序. 即通知sshd不运行设定的shell.

4.windows机器上设置代理

/*
 * 编写一个代理规则文件 stand_alone.pac
 */
function withPrefix(str, prefix) {
	return (str.indexOf(prefix) == 0);
}

function withSuffix(str, suffix) {
	var n = str.lastIndexOf(suffix);
	return (n >= 0 && n + suffix.length == str.length);
}

function contains(str, tok) {
	return (str.indexOf(tok) > 0);
}

function myHost(host) {
    return ( (host.indexOf("192.168") == 0) || (host.indexOf("10.10") == 0) );
}

function myIpAddress(ip) {
    return ( (ip.indexOf("192.168") == 0) || (ip.indexOf("10.10") == 0) );
}

function regExpMatch(url, pattern) {
	try { return new RegExp(pattern).test(url); } catch(ex) { return false; }
}

function isInNet(theHost) {
    var i = 0;
    var pos=0;
    hostList01 = new Array(
        "www.sina.com.cn.de",
        ".baidu.com",
        "12.34.56.78",
        "12.34.56.79",
        ".sohu.com",
        "12.34.56.77",
        "www.douban.com"
    );

    while (i < hostList01.length) {
        if (withSuffix(theHost, hostList01[i])) return 1;
        i++;
    }
    return 0;
}

function FindProxyForURL(url, host) {
    // var PROXY = "PROXY 192.168.10.22:8080";
    // var PROXY = "SOCKS5 220.181.126.77:19310";
    // var PROXY = "PROXY 192.168.10.22:8118";
    var PROXY = "SOCKS5 192.168.10.22:7070";
    // var HOMEPROXY = "PROXY aaa.test.org:63128";
    var HOMEPROXY = "PROXY 192.168.10.22:3128";
    var DEFAULT = "DIRECT";

    var ClientAddr = myIpAddress();

    if ( shExpMatch(url,"localhost") || shExpMatch(url,"127.0.0.1") ) {
        return "DIRECT";
    }

    if (isInNet(ClientAddr, "12.34.56.1", "12.34.56.2"))
    {
        return "DIRECT";
    }

    if (myHost(ClientAddr)) {
        return "DIRECT";
    } else {
        /* return "SOCKS5 127.0.0.1:7070"; */
        return PROXY;
    }

    if (shExpMatch(url, '*://*.ak.fbcdn.net/*')) return PROXY;
    if (shExpMatch(url, '*://*.test2.com/*')) return HOMEPROXY;
    if (shExpMatch(url, '*://*.test1.com/*')) return HOMEPROXY;
    if (shExpMatch(url, '*://*.google.*/*')) return PROXY;
    if (shExpMatch(url, '*://*.twimg.com/*')) return PROXY;
    //-- 被墙的网站!
    if(/^[\w\-]+:\/+(?!\/)(?:[^\/]+\.)?taitung\-house\.gov\.tw/i.test(url)) return DEFAULT;
    if(/^[\w\-]+:\/+(?!\/)(?:[^\/]+\.)?cromotc\.nat\.gov\.tw/i.test(url)) return DEFAULT;
    if(/^[\w\-]+:\/+(?!\/)(?:[^\/]+\.)?nici\.nat\.gov\.tw/i.test(url)) return DEFAULT;
    //-- END RULES

    return DEFAULT;
}



5.补充socks转http代理方式
    使用Privoxy:
    打开"Options"--->"Edit main Configuration", 搜索forward-socks4, 大约在1500多行左右找到.
    填加"forward-socks4a / 127.0.0.1:7070 ."
    或者"forward-socks5 / 127.0.0.1:7070 .".
    这两句用一个就可以了, 作用是forward本地的7070端口Socks代理, (forward-socks5我没有成功)
    再找到"listen-address 127.0.0.1:8118", 这一句的作用是在本地8118端口开一个HTTP代理,
    IE或其他浏览器中代理设置成127.0.0.1:8118就可以使用了.
        forward-socks4和forward-socks4a的区别:
        Socks4a的域名解析是有服务器端,
        而Socks4的域名解析是在客户端.
        如果某些IP比如192.168.*.* 127.*.*.*不想用代理,
        只需在文件中填加"forward 192.168.*.*/ ."和"forward 127.*.*.*/ ."即可.

6.参考:
http://autoproxy2pac.appspot.com/
http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt