2013年5月21日星期二

树莓派折腾笔记:科学上网

别问我为啥现在才折腾这个,我以前一直 openvpn + chnroutes ,不过开了 vpn 之后从外网死活也登不上。万般无奈,只好现学 ssh -D ,我半个月之前才刚刚学会用。
是给自己看的笔记不是考试用的小抄,所以废话很多……

一、 ssh -D 自动登录
这个 ssh 我还没碰到过断线,所以脚本也没考虑自动重连。
安装 expect
脚本 /usr/local/bin/sshgfw 内容如下:
#!/usr/bin/expect -f

set port 7070
set user 用户名
set host 服务器地址
set password 密码
set timeout -1

spawn ssh -qTnN -D $port $user@$host
expect "*assword:*"
send "$password\r"
expect eof

使用的时候不断线不会退出,所以要自己来做后台运行。比如 nohup /usr/local/bin/sshgfw & 。
所以改了个 python 版的……其实依然只是勉强能用而已。 /usr/local/bin/sshgfw.py
#!/usr/bin/python

import sys
import pexpect
import daemon

port = "7070"
user = "用户名"
host = "服务器地址"
passwd = "密码"

def main():
child = pexpect.spawn('/usr/bin/ssh -qN -D %s %s@%s' % (port, user, host), timeout=None)
child.expect('password:')
child.sendline(passwd)
print '>> Now you can set socks5 proxy to 127.0.0.1:%s' % (port,)
child.expect(pexpect.EOF, timeout=None)

if __name__ == "__main__":
with daemon.DaemonContext():
main()

二、用 privoxy 把 socks 转换成 http 代理
iceweasel 直接可以用 socks5 代理。 midori 和 w3m 都不支持 socks5 ,需要转成 http 代理使用
安装 privoxy ,装好就有服务自己启动了。配置参考 http://kwanlife.yo2.cn/articles/ssh-socks5-http.html ,编辑 /etc/privoxy/config ,找 forward-socks5 ,复制那一行,去掉注释符号,内容改成 forward-socks5 / 127.0.0.1:7070 . (这样尾巴上的点肯定不会少了 :-) 还知其所以然)重启服务 sudo /etc/init.d/privoxy restart 之后就可以用了。
tip: 系统升级走代理 sudo env http_proxy=http://127.0.0.1:8118 apt-get update

三、用 tcp 对抗 DNS 污染
用 nslookup 需要安装 dnsutils
hosts 太简单粗暴了,缺乏美感和灵活性(身为野生程序猿怎么能忍受可以自动的事情手动来做!)。
使用 tcp 查询 DNS 暂时还没有污染,所以搭建本地 DNS 代理: http://opengg.me/815/tcp-dns-proxy-avoid-dns-poisoning/
https://github.com/henices/Tcp-DNS-proxy
wget https://raw.github.com/henices/Tcp-DNS-proxy/master/tcpdns.py
编辑一下,树莓派上用户 pi 的 uid 也是 1000 ,所以直接把文件尾部 #os.setuid(1000) 那一行的注释取消掉就可以了。顺手也用 python-daemon 做成后台。
把 /etc/resolv.conf 内容改成 nameserver 127.0.0.1 。

四、让上面的这些随网络启动
我的树莓派是用无线网络的,如果用以太网口的话需要改一下。
编辑 /etc/network/if-up.d/gfwout
#!/bin/bash
if [ "_$IFACE" != "_wlan0" ];then exit 0;fi
/usr/local/bin/tcpdns.py
/usr/local/bin/sshgfw.py
编辑 /etc/network/if-down.d/gfwin
#!/bin/bash
if [ "_$IFACE" != "_wlan0" ];then exit 0;fi
killall tcpdns.py
killall sshgfw.py
我知道这个很简单粗暴……能用就好。(所谓黑历史就是这么来的)

五、 fbterm 和 w3m 相关
w3m-img 在 fbterm 里不能用
http://www.hkepc.com/forum/viewthread.php?tid=1365821 提到 w3m-img 对 jfbterm 的支持是硬编码的, 8 楼提到可以去改 w3m-img 源代码, 9 楼提到装 jfbterm 之后用 TERM=jfbterm w3m 就可以了。
测试一下 TERM=jfbterm w3m -o http_proxy=http://127.0.0.1:8118 -o https_proxy=http://127.0.0.1:8118 m.facebook.com
w3m 默认编辑器是 nano ,不习惯,按 o 在选项里可以改成 vim 。代理也可以在设置里面改。
在 ~/.bashrc 最后加上
alias ff='fcitx-fbterm-helper -l'
# fbterm
if [ "$TERM" = "linux" ]; then
# echo -en "\e]P7ffffff" #lightgray
# clear #for background artifacting
alias w3m='TERM=jfbterm w3m' #use w3m-img
fi

后记
某天半夜 ssh 突然不好用了, w3m 开第一个网页正常,点任何链接都超时, privoxy 提示" socks5 negotiation read failed ",手动 ssh -v 连接,发现错误" open failed: administratively prohibited: open failed ",在 http://catfan.me/gujiaxi/p152086 里看到解决方法是加上 -p 参数指定端口,木有用。在 http://hi.baidu.com/imedal/item/534b5c438b195115886d108c 看到说是服务器人太多了。我换了个服务器就能用(……)。好吧起码不是我的 RP 或者技术问题。

--
≋ὥ≋
触手什么的最有爱了~

没有评论:

发表评论