本文適用於:路由器無法刷第三方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流量扶牆(一) ; 論野生技術&二次元