代理的话,试过 u2nl + dnsp 可是 u2nl 不能转发 https ,dnsp 的话太慢,后来想到了 redsocks ,不过 redsocks 的 dnstc 只能监听一个地址,被共享网络的设备不能解析 DNS 。
因为联通免流只能通过HTTP(s)代理上网,UDP的包都会费流量。所以就决定直接放个 pdnsd 进去。pdnsd 用来做缓存和把 UDP 的 DNS 查询全部转成 TCP 通过 redsocks 代理出去。(不过这样上网会变慢,感觉得不偿失,不如直接让他通过
本机代理
redsocks 配置可以这么写
redsocks.confbase { log_debug = off; log_info = off; daemon = on; redirector = iptables; }
redsocks { local_ip = 0.0.0.0; local_port = 65; ip = $HTTP_PROXY; port = $HTTP_PROXY_PORT; type = http-relay; } redsocks { local_ip = 0.0.0.0; local_port = 56; ip = $HTTPS_PROXY; port = $HTTPS_PROXY_PORT; type = http-connect; } dnstc { local_ip = 127.0.0.1; local_port = 5353; }
|
iptables 规则如下
iptables -t nat -N PROXY
iptables -t nat -A OUTPUT -o $interface -j PROXY
iptables -t nat -A PROXY -d 127.0.0.1,HTTP_PROXY -j ACCEPT
iptables -t nat -A PROXY -p udp --dport 53 -j REDIRECT --to-port 5353
iptables -t nat -A PROXY -p tcp --dport 80 -j REDIRECT --to-port 65 iptables -t nat -A PROXY -p tcp --dport 443 -j REDIRECT --to-port 56
iptables -t nat -A PROXY -p tcp -j REDIRECT --to-port 56
|
共享给其他设备
这样的话就行了。但如果是用数据流量上网要共享给其它手机或电脑的话,被共享的设备不能解析 DNS 。
这就要用到 pdnsd 了,它可以用 TCP 查询 DNS 。
需要注意的就是不能用 53 端口,因为会和 Android 自带的 dnsmasq 冲突。
redsocks 的配置和上面一样。
pdnsd 的配置文件
pdnsd.confglobal { perm_cache = 4096; run_as = root; pid_file = /data/p.pid; //pid文件的位置。 server_ip = any; server_port = 5354; query_method = tcp_only; status_ctl = on;
min_ttl = 1m; max_ttl = 1d; paranoid = on; timeout = 30; randomize_recs = on; daemon = on; } server { label = DNS; ip = 8.8.8.8; //要填支持 TCP查询 的 DNS,多个用 , 隔开。 port = 53; proxy_only = on; edns_query = on; } source { owner=localhost; serve_aliases=on; file=/system/etc/hosts; //导入一下 hosts 。 } rr { //Windows验证联网用的,右下角黄色感叹号。 name = www.msftncsi.com; reverse = on; a = 124.40.53.8; }
|
iptables 是这样的
上面的规则的后面再加上
iptables -t nat -N TETHER
iptables -t nat -I PREROUTING -s 192.168.0.0/16 -j TETHER
iptables -t nat -A TETHER -d 192.168.0.0/16,124.40.53.8,$HTTP_PROXY -j ACCEPT
iptables -t nat -A TETHER -p udp --dport 53 -j REDIRECT --to-port 5354
iptables -t nat -A TETHER -p tcp --dport 80 -j REDIRECT --to-port 65
iptables -t nat -A TETHER -p tcp -j REDIRECT --to-port 56
|
写个脚本
然后写个启动脚本。就是下载之类的会很烫。
关于 Android 的网卡
因为上面的脚本也有其他人在用,每个人的移动网络网卡名都不一样。所以只好让知道作用名字的网卡直接通过,再把其他的都代理。
就像这几个:
- WLAN:wlan0
- 便携式WLAN热点:ap0
- USB网络共享:usb0 rndis0
- 蓝牙网络共享:bt-pan
- VPN:tun0 (shadowsocks VPN模式绕过中国和局域网可以用。