代理的话,试过 u2nl + dnsp 可是 u2nl 不能转发 https ,dnsp 的话太慢,后来想到了 redsocks ,不过 redsocks 的 dnstc 只能监听一个地址,被共享网络的设备不能解析 DNS 。
  因为联通免流只能通过HTTP(s)代理上网,UDP的包都会费流量。所以就决定直接放个 pdnsd 进去。pdnsd 用来做缓存和把 UDP 的 DNS 查询全部转成 TCP 通过 redsocks 代理出去。(不过这样上网会变慢,感觉得不偿失,不如直接让他通过

本机代理

redsocks 配置可以这么写

redsocks.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
base {
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 规则如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建一个规则。
iptables -t nat -N PROXY
# 指定上网用的网卡并把它加到 OUTPUT 。
iptables -t nat -A OUTPUT -o $interface -j PROXY
# 允许代理地址和本机通过。
iptables -t nat -A PROXY -d 127.0.0.1,HTTP_PROXY -j ACCEPT
# 把 DNS请求 转到 redsocks 。
iptables -t nat -A PROXY -p udp --dport 53 -j REDIRECT --to-port 5353
# HTTP 和 HTTPS 转到 redsocks 。
# iptables -t nat -A PROXY -p tcp --dport 80 -j DNAT --to-destination $HTTP_PROXY:$HTTP_PROXY_PORT
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
# 其他 TCP 流量转到 redsocks 。
iptables -t nat -A PROXY -p tcp -j REDIRECT --to-port 56
# 非 TCP 的流量随便处理一下。这里是直接 DROP 掉。也可以不加这句让它通过。
# iptables -t nat -A PROXY ! -p tcp -j DROP

共享给其他设备

  这样的话就行了。但如果是用数据流量上网要共享给其它手机或电脑的话,被共享的设备不能解析 DNS 。
  这就要用到 pdnsd 了,它可以用 TCP 查询 DNS 。
  需要注意的就是不能用 53 端口,因为会和 Android 自带的 dnsmasq 冲突。
  redsocks 的配置和上面一样。

pdnsd 的配置文件

pdnsd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
global {
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;
# tcp_server = 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 是这样的

上面的规则的后面再加上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
iptables -t nat -N TETHER
# 把来自 192.168.0.0/16 的流量加入规则。
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
# 把 DNS 请求劫持到 pdnsd 。
iptables -t nat -A TETHER -p udp --dport 53 -j REDIRECT --to-port 5354
# HTTP的转到 redsocks 。
iptables -t nat -A TETHER -p tcp --dport 80 -j REDIRECT --to-port 65
# iptables -t nat -A TETHER -p tcp --dport 80 -j DNAT --to-destination $HTTP_PROXY:$PORT
# 其它 TCP 流量还是用 redsocks 。
iptables -t nat -A TETHER -p tcp -j REDIRECT --to-port 56
# 非 TCP 的流量还是看着办。

写个脚本

  然后写个启动脚本。就是下载之类的会很烫。

关于 Android 的网卡

  因为上面的脚本也有其他人在用,每个人的移动网络网卡名都不一样。所以只好让知道作用名字的网卡直接通过,再把其他的都代理。
就像这几个:

  • WLAN:wlan0
  • 便携式WLAN热点:ap0
  • USB网络共享:usb0 rndis0
  • 蓝牙网络共享:bt-pan
  • VPN:tun0 (shadowsocks VPN模式绕过中国和局域网可以用。