本文适用于:路由器无法刷第三方ROM,但局域网中存在任意一台*nix设备时的使用方法
原理
原理是更改所需的目标地址的默认网关,改为在*nix设备上进行转发,从而在任意的普通设备(主要指Windows系统设备及其它无法运行iptables的设备)上达到最简化配置甚至零配置的效果。
先看下物理层拓扑:
这是网络层拓扑(IP):
简要地来说,主要是两处操作(以请求74.125.224.55:443为例):
- 想办法更改普通设备(即图中任意设备)的路由表,使请求74.125.224.55:443的数据包发往局域网中的*nix设备
- *nix设备进行目标地址转换,将数据包发往66.66.66.66:44300;并在拿到响应后进行源地址转换,返回给目标设备
步骤
- 在普通设备上写入前文使用的hosts
- 由于希望实现接入局域网的普通设备的零配置,在路由器上设置静态路由。假设路由器的地址为1.1.1.1,*nix设备的地址为1.1.1.10;以TP-LINK的经典配置界面为例,在路由功能–静态路由表中添加一项:
- 在*nix设备上执行:
123sudo iptables -t nat -A PREROUTING -p tcp -d 74.125.224.55 --dport 443 -j DNAT --to-destination 66.66.66.66:44300sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -d 66.66.66.66 -j SNAT --to-source 74.125.224.55sudo sysctl net.ipv4.ip_forward=1
备注
由于普通设备的默认网关为路由器(1.1.1.1),在路由器上设置了静态路由后,普通设备在请求目标74.125.224.55时,会先收到路由器的一个ICMP redirect (redirect for host)包,普通设备上的操作系统因此更新路由表,将请求发往新的网关(1.1.1.50)。但是由于收到ICMP包在尝试建立连接之后,而上一次建立连接是通过默认网关(1.1.1.1)进行的,被墙,因此普通设备会经历一次连接超时(或者reset)。
如果需要减少这种错误,可以在普通设备上设置路由表,以Windows为例,在管理员权限下执行:
1 |
route add 74.125.224.55 mask 255.255.255.255 1.1.1.50 metric 1 |
metric可以为任意值,但应尽量小,这样操作系统才会得到这是一条最优路由的结果而去使用它
我就看看……可惜我并不能用
方法二门槛很低了啊 有个vps就能play了
好厉害的样子!!!(可能是我无知)
好厉害的样子!!!(可能是我无知)
这个相对于socks代理有什么优势吗。。?
这能比嘛
开门,查水表
水表已拆
送咖啡。。
只喝可乐
from: 使用非443端口转发https流量扶墙(一) ; 论野生技术&二次元
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -d 66.66.66.66 -j SNAT –to-source 74.125.224.55这句是什么意思, 目标地址是VPS,源地址是谷歌的,到达VPS之后,VPS一看源地址是谷歌的,就转发给了谷歌。理解的对吗?
不,这句是在局域网内的*nix设备A上运行的,不是在vps上。 没有这句话的话,你从电脑上发出的包可以经过A然后到你的VPS再到google,但是从A到你电脑回来的路是不通的。这种方法里74.125.224.55这个地址其实相当于打了个标记,并不是真的去访问这个IP,所以理论上可以用任何IP,只要DNAT、SNAT和本地的hosts里一致就可以了
from: 使用非443端口转发https流量扶墙(一) ; 论野生技术&二次元