用 ss-redir 或 redsocks 搭建透明網關
來源:https://xixitalk.top/blog/2018/08/31/transparent-proxy/
原生的Android刷機后第一次開機系統初始設置要連接谷歌伺服器,如果沒有透明代理就很麻煩,進不了桌面。這裏可以通過一台Linux的機器(我用的是第一代樹莓派)來達到透明代理的作用。平常情況下手機,平板和機頂盒也可以通過透明代理上網,簡化配置。
環境要求
手機和樹莓派在同一個區域網,並且可以相互訪問,手機的WiFi連接,樹莓派可以是無線網路也可以是網線連接(沒有無線網路的第一代樹莓派即可)。有可用的SS / SSR或者SOCKS5代理。
用SS-redir的搭建帶SS代理的埠
如果是SSR用shadowsocksr-libev里的SS-再導向。注意後者多了一個r
。我用的是SSR,在樹莓派上自己編譯的shadowsocksr-libev ,下面以SSR為例,SS類似。
配置ss-redir.json,參數和配置SSR一樣,注意:"local_address":"0.0.0.0"
,這個必須為0.0.0.0。如果同一個機器上也運行SSR,local_port要用不同的埠,如SSR用1081,ss-redir用1088,下面配置里會用到1088這個埠。
運行SS-再導向,-v
會顯示一些日誌信息:
./ss-redir -v -c ss-redir.json
調試完成後,實際運行可以用:
nohup ./ss-redir -c ss-redir.json > /dev/null 2>&1 &
啟用內核轉發
使用iptables的轉發需要打開內核的IPv4轉發功能,編輯/etc/sysctl.conf中,設置把net.ipv4.ip_forward = 1,讓更新實時生效:
sudo sysctl -p /etc/sysctl.conf
設置iptables的,IPSET轉發
設置iptables的的目的是將本機特定IP的流量轉向β-redir的監聽的埠,這個埠是帶代理的,這樣特定IP的流量就自動代理了。可以配置跳過無需代理的中國IP.iptables執行要根許可權,可以切換到根用戶,或者用須藤方式運行。
先獲取中國IP範圍,保存文件是cn.zone。
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
創建china.ipset腳本,內容如下:
# Destroy ipset if it already exists #sudo systemctl stop iptables.service sudo ipset destroy china # Create the ipset list sudo ipset -N china hash:net # remove any old list that might exist from previous runs of this script #rm cn.zone # Pull the latest IP set for China #wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone # Add each IP address from the downloaded list into the ipset 'china' for i in $(cat ./cn.zone ); do ipset -A china $i; done
運行腳本創建中國的IPSET,腳本會把cn.zone文件里的IP段都加到中國的IPSET里。
sudo bash china.ipset
創建的iptables命令腳本
iptables -t nat -N REDSOCKS # 在 nat 表中創建新鏈 iptables -t nat -A REDSOCKS -p tcp --dport 28888 -j RETURN # 28888 是 ss 代理伺服器的埠,即遠程 shadowsocks 伺服器提供服務的埠,如果你有多個 ip 可用,但埠一致,就設置這個 iptables -t nat -A REDSOCKS -d 11.11.11.11 -j RETURN # 11.11.11.11 是 ss 代理伺服器的 ip, 如果你只有一個 ss伺服器的 ip,卻能選擇不同埠,就設置此條 iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN # 過濾區域網IP iptables -t nat -A REDSOCKS -p tcp -m set --match-set china dst -j RETURN # 過濾國內IP段,IP保存在china ipset里 iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 1088 # 1088 是 ss-redir 的監聽埠,ss-local 和 ss-redir 的監聽埠不同,配置文件不同 iptables -t nat -I PREROUTING -p tcp -j REDSOCKS # 在 PREROUTING 鏈前插入 REDSOCKS 鏈,使其生效
把上面的命令保存成iprules.sh文件,運行設置到系統里。
sudo bash iprules.sh
如果設置錯誤,清理iptables的設置用下面的命令:
sudo iptables -t nat -F
手機端設置
手機端WiFi連接,選擇靜態IP,網關填寫樹莓派的IP。如果正常,此時手機不用配置代理即可正常訪問Google伺服器。
驗證國內IP過濾
訪問ip138和淘寶IP,看看IP是不是國內IP,如果是國內IP就說明國內IP過濾成功了,國內IP沒有走代理;相反如果是SSR伺服器的IP,說明國內IP過濾配置失敗了。
用redsocks2替代β-redir的
樹莓派上本來跑了個SSR,環境太惡劣,經常需要tcping找可用的地址,重啟SSR,不想再維護β-再導向的穩定性了,所以切換到redsocks了,redsocks可以直接用SSR提供socks5的代理,只維護SSR穩定可用即可。
沒有用原版的redsocks,使用了修改版的redsocks2,下載源代碼編譯略過。
redsocks2的配置config.json如下。如果socks5的代理是本機,ip = 192.168.1.104;
行改成ip = 0.0.0.0;
。文件配置里log_debug log_info daemon
調試的時候可以根據需要配置上分類中翻譯關閉或者,daemon = on
是後台運行。這裏redsocks監聽的埠也配置成1088。
base { log_debug = off; log_info = off; log = "file:/home/pi/redsocks/log.txt"; daemon = on; redirector = iptables; } redsocks { local_ip = 0.0.0.0; local_port = 1088; listenq = 128; ip = 192.168.1.104; port = 1081; type = socks5; autoproxy = 0; timeout = 10; } ipcache { cache_size = 4; stale_time = 900; port_check = 1; cache_file = "/tmp/ipcache.txt"; autosave_interval = 3600; }
運行redsocks2
sudo ./redsocks2 -c ./config.json
據說redsocks穩定性可能有些問題,配置的cron計劃任務,每天凌晨3點重啟一下好了。
IPSET設置速度優化
用sudo bash china.ipset
設置IPSET后,可以把IPSET設置保存起來,後面再恢復速度就快很多。
sudo ipset save > ipset.save.txt
把下面腳本保存為ipset.restore.sh,每次開機設置一次。sudo iptables -t nat -F
三條的含義是清空iptables nat配置,不然多次執行ipset會提示正在使用,禁止毀滅。建議:每次應該都是先設置ipset,再設置iptables的。
#!/bin/bash sudo iptables -t nat -F sudo iptables -t nat -X sudo iptables -t nat -Z sudo ipset destroy china sudo ipset restore < ipset.save.txt
其他說明
- 不支持UDP流量轉發,DNS污染用其他方法解決。我用的dnsmasq + overture.dnsmasq做緩存,推動做域名翻牆和國內IP分流.overture國內使用dnspod的DNS服務,國外使用8.8.8.8,這兩個DNS服務都支持EDNS。
- iptables的規則可以SH腳本運行,或者iptables-save命令後用的iptables-恢復來載入
參考資料
- ss-redir透明代理
- linux用shadowsocks + iptables + ss-redir實現全局代理
- Ubuntu的編譯運行Redsocks2實現透明代理
- 使用iptables,ipset的全局智能代理
推薦安卓翻牆APP:SpeedUp VPN
Android版SpeedUp VPN,基於ShadowsocksRb,與SSR和Shadowsocks協議兼容,內置免費SSR伺服器。 如果您對內置SSR VPN伺服器不滿意,則可以自行添加或導入任何SSR和Shadowsocks伺服器使用。
- Google Play下載:SpeedUp VPN
- Github下載:SpeedUp VPN