因長期在大陸出差,除了 Android 手機可以完美翻牆,Windows 電腦(Windows 10 APP 和某些軟體會忽略系統 Proxy 設定) 和 iPhone 手機 都無法完美翻牆,所以需要製作一個翻牆路由器,來滿足翻牆需求,之前有拿一個隨便撿的路由器成功製作翻牆,但遇到很多雷(e.g. 因為記憶體不足、儲存容量不足),所以這次打算做一個筆記,紀錄建議需求和安裝方式

首先你要到 https://openwrt.org/toh/views/toh_fwdownload 了解 OpenWRT 支援的路由器有哪些(如果你願意自行編譯就跳過)

選擇一台符合你預算和建議需求的路由器 (FLASH >= 16MB,RAM >= 64MB)

後來我發現了這台 https://openwrt.org/toh/hwdata/tp-link/tp-link_archer_c7_v5 ,其中記憶體和儲存空間都符合建議需求,接下來就可以開始製作翻牆路由器拉

1. 找到 Firmware OpenWrt Install URL 右邊的連結下載韌體檔,使用路由器內建的韌體升級功能刷入 OpenWRT 第三方韌體

2. 刷完後預設 WIFI 不會開啟,要使用有線網路連進去管理界面 http://192.168.1.1,設定一組密碼並啟用 SSH 登入(這裡建議把LAN網段改掉,不然 192.168.1.0/24 太容易跟數據機衝突),並接上網際網路

3.  加入第三方 opkg 安裝包來源(這邊的 mips_24kc 必須視你的路由器的 Package architecture 而定)

wget http://openwrt-dist.sourceforge.net/packages/openwrt-dist.pub
opkg-key add openwrt-dist.pub
rm openwrt-dist.pub
echo src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/mips_24kc >>/etc/opkg/customfeeds.conf
echo src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci >>/etc/opkg/customfeeds.conf

4. 安裝翻牆必要套件

opkg update
opkg install iptables-mod-tproxy
opkg install shadowsocks-libev
opkg install luci-app-shadowsocks
opkg install ChinaDNS
opkg install luci-app-chinadns
opkg install dns-forwarder
opkg install luci-app-dns-forwarder

安裝好後會有這些東西

5. 取得中國 IP 清單 /etc/chinadns_chnroute.txt 供 shadowsocks-libev 的 Access Control 和 ChinaDNS 使用

wget -O /tmp/delegated-apnic-latest 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' && awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' /tmp/delegated-apnic-latest > /etc/chinadns_chnroute.txt

或是

wget --no-check-certificate https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt -O /tmp/china_ip_list.txt && mv /tmp/china_ip_list.txt /etc/chinadns_chnroute.txt

並且可搭配 crontab 排程自動更新(有使用 crontab 記得去 系統 > 系統 修改時區!)

crontab -e
#mean    minute  hour   date   month   week
#range   0-59    0-23   1-31   1-12    0-7
# 例如:每天早上 05:10 執行一次
10 5 * * *  your command
# 例如:每 5 分鐘執行一次
*/5 * * * * your command
service cron start
service cron enable

6. 透過網頁連進 OpenWRT 管理界面設定翻牆伺服器參數

ServicesShadowSocksServers Manage  設定一組 Shadowsocks 伺服器

ServicesShadowSocksAccess Control 設定 Zone WAN.Bypassed IP List 為  ChinaDNS CHNRoute

ServicesShadowSocksGeneral Settings 設定 Transparent Proxy.Main Server 為你剛剛設定的  Shadowsocks 伺服器

ServicesShadowSocksGeneral Settings 設定 Transparent Proxy.UDP-Relay Server 為 Same as Main Server

註:這裡的 ServicesShadowSocks > Port Forward 完全沒用,所以另外安裝 dns-forwarder 代替 DNS 查詢轉送功能,避開中國 DNS 污染問題

Services >  DNS-Forwarder 設定你想要的 DNS Server 後勾選 Enable,並記住 Listen Port(我設定為5301)

NetworkDHCP and DNS > General Settings > DNS forwardings 設定為 127.0.0.1#<DNS-Forwarder 的 Listen Port>,我這邊是設定為 127.0.0.1#5301

NetworkDHCP and DNS > Resolv and Hosts Files > 勾選 Ignore resolve file

7. 重啟路由器測試翻牆囉~

 

說明:

1. ChinaDNS 怪怪的我後來沒啟用它,直接使用 dns-forwarder 解析 DNS ,這篇文章還是留下安裝方式如果下次改版正常後可以使用,如果想要使用 ChinaDNS 要設定為 114.114.114.114,127.0.0.1:5301,Network >  DHCP and DNS > General Settings > DNS forwardings 要設定為 127.0.0.1#5353

2. 如何自己架設 Shadowsocks Server,我 這篇文章 有教學,可以參考

3. Services >  ShadowSocks >  Servers Manage 下的伺服器位置目前只支援輸入 IP Address,不支援使用 Domain,解決方式可以自行透過 crontab 寫一個排程來檢查並修改 IP 位置

4. 如果想搭配 KCPTun 使用可以安裝下列兩個套件進行設定

opkg install kcptun
opkg install luci-app-kcptun

5. 如何實現 Point-to-Site ?

假如 Server 端的 IP 網段為 192.168.0.0/24,當 Opwrt 翻牆路由器在存取這類 Private IP 時會忽略 Shadowsocks,是因為 OpenWRT 在開機時會載入 /var/etc/shadowsocks.include 設定這些 Private IP 要跳過 shadowsocks,而這個檔案又是開機時自動生成的,所以無法透過修改這個檔案來實現 Point-to-Site,這時候只要修改 /usr/bin/ss-rules 這個 rules 生成器即可。

找到 gen_special_purpose_ip() 這段 code,並把你需要連線的 Private IP 網段刪除後重開機即可!

6. 透過網頁介面改 LAN 網段常常失敗(超時自動回朔),可透過指令修改介面位置:

# 修改 config interface 'lan' 的 option ipaddr
vim /etc/config/network
# 重啟服務
service network restart

或是透過 UCI System

uci set network.lan.ipaddr='192.168.8.1'
uci commit
service network restart

7. 我看不懂英文介面,有中文或其他語言嗎?

有,下面示範安裝繁體中文介面的方法,其他語言可參考

opkg update
opkg install luci-i18n-base-zh-tw

8. shadowsocks 不能設定 domain 嗎?

目前版本的 luci-app-shadowsocks & shadowsocks-libev 不支援使用 domain,但可以透過以下這個 shell script 搭配 crontab 排程實現

註:記得把網址改成你自己的 domain

如果你的DNS有被污染,可以把下方的 nslookup $DOMAIN 改成 nslookup $DOMAIN 127.0.0.1,透過 DNS-Forwarder 轉成 TCP 查詢避開污染

#!/bin/bash
# Author: AwEi
# 2019/01/14
# https://awei791129.pixnet.net/blog/post/67514073
DOMAIN='your.domain'

current_ip_addr="$(uci get shadowsocks.@servers[0].server)"
ip_addr="$(nslookup $DOMAIN | awk '/^Address 1:/ { print $3 }' | grep -E '([0-9]{1,3}[\.]){3}[0-9]{1,3}')"
echo "Setting shadowsocks server IP. please wait..."
echo "New IP address is $ip_addr"
if [ ! -z $ip_addr ]; then
    if [ ! $ip_addr == $current_ip_addr ]; then
        uci set shadowsocks.@servers[0].server="$ip_addr"
        uci commit
        service shadowsocks restart
        echo "Reset shadowsocks server IP finish!"
    else
        echo "Shadowsocks IP does not need to change."
    fi
else
    echo "IP address resolve fail!"
fi

9. 如何驗證 crontab 狀態?

logread | grep "cron."

10. TP-Link Archer C7 v5 安裝 Openwrt 後燈號都不亮?

這是這版本韌體的 Bug,目前網友已提出解決方法( USB 和 WPS 燈還是沒作用.....,有網友有解可提供給我嗎?):

# 把下面設定附加在這個檔案後面
vim /etc/config/system
config led
option default '0'
option name 'wlan2g'
option sysfs 'archer-c7-v5:green:wlan2g'
option trigger 'phy1tpt'

config led
option default '0'
option name 'wlan5g'
option sysfs 'archer-c7-v5:green:wlan5g'
option trigger 'phy0tpt'

config led
option default '0'
option name 'wan'
option sysfs 'archer-c7-v5:green:wan'
option trigger 'switch0'
option port_mask '0x2'

config led
option default '0'
option name 'lan1'
option sysfs 'archer-c7-v5:green:lan1'
option trigger 'switch0'
option port_mask '0x4'

config led
option default '0'
option name 'lan2'
option sysfs 'archer-c7-v5:green:lan2'
option trigger 'switch0'
option port_mask '0x8'

config led
option default '0'
option name 'lan3'
option sysfs 'archer-c7-v5:green:lan3'
option trigger 'switch0'
option port_mask '0x10'

config led
option default '0'
option name 'lan4'
option sysfs 'archer-c7-v5:green:lan4'
option trigger 'switch0'
option port_mask '0x20'

 

參考來源:

https://v2mm.tech/topic/711/抛弃-udp-用-tcp-查询-dns

https://alalin.me/archives/805 (參考中國IP清單的取得方法)

如果遇到 opkg update 記憶體不足的解決方法:

https://stackoverflow.com/questions/34112053/openwrt-cant-install-packages-memory-issue

AwEi 發表在 痞客邦 留言(0) 人氣()