2020年7月23日 星期四

在路由器上部署透明proxy

godyarts 2018-04-03 投訴
閱讀數:13989
Across the …, we can reach every corner in the world
​​注意:以下內容在Netgear R7000 xwrt-merlin上經過測試。openwrt類似,還有更易用的LuCI圖形化配置
思路:chinadns作為dnsmasq的上游,通過ss-tunnel查詢國外dns服務器分辨投毒。利用iptables分流請求,ipset中儲存國內IP地址與本地和保留地址,符合條件的直連,其餘通過ss-redir轉發至VPS

1. 配置entware環境

準備一個U盤,格式化為ext3(R7k merlin不支持ext4)。打開路由器的jffs。打開路由器的SSH,登錄後:
entware-setup.sh​

​更新:
opkg update
opkg upgrade
​安裝sftp服務器便於文件傳輸:
opkg install openssh-sftp-server
安裝​lsof用於查看佔用端口:
opkg install lsof
安裝所需軟件:
opkg install shadowsocks-libev-ss-redir
opkg install shadowsocks-libev-ss-tunnel
opkg install simple-obfs
opkg install chinadns
opkg install rng-tools // *obfs插件若提示收集不到足夠的隨機數,可安裝rng-tools包

2. 配置SS​與chinadns

測試redir是否能夠正常工作:
ss-redir -s [VPS的IP地址] -p [服務器端口號,e.g. 8086] -b 0.0.0.0 -l [本地端口號,e.g. 1080] -k [密碼,e.g. pass.123] -m chacha20-ietf-poly1305 -t 60 -u --plugin obfs-local --plugin-opts "obfs=tls;obfs-host=cloudfront.net"

redir​啟動腳本:
安裝後默認生成配置文件 S22shadowsocks 於 /opt/etc/init.d 目錄下,編輯其中內容
PROCS=ss-local 改為 PROCS=ss-redir​
​redir配置json:
{
    "server": "[VPS的IP地址]",
    "server_port": "[服務器端口號,e.g. 8086]",
    "local_address": "0.0.0.0",
    "local_port": "[本地端口號,e.g. 1080]", // 此處監聽端口是轉發流量的,記作portA
    "password": "[密碼,e.g. pass.123]",
    "method": "chacha20-ietf-poly1305",
    "timeout": 60,
    "mode": "tcp_and_udp",
    "plugin": "obfs-local",
    "plugin_opts": "obfs=tls;obfs-host=cloudfront.net"
}

​tunnel​啟動腳本:
直接複製一份 S22shadowsocks 的腳本,編輯其中內容
PROCS=ss-redir 改為 PROCS=ss-tunnel
tunnel​配置json:
{
    "server": "[VPS的IP地址]",
    "server_port": "[服務器端口號,e.g. 8086]",
    "local_address": "0.0.0.0",
    "local_port": "[本地端口號,e.g. 1088]", // 此處監聽端口是為chinadns服務的,記作portB
    "password": "[密碼,e.g. pass.123]",
    "method": "chacha20-ietf-poly1305",
    "tunnel_address": "8.8.8.8:53",
    "mode": "tcp_and_udp",
    "plugin": "obfs-local",
    "plugin_opts": "obfs=tls;obfs-host=cloudfront.net"
}

chinadns啟動腳本:
安裝後默認生成配置文件 S56chinadns 於 /opt/etc/init.d 目錄下,編輯其中內容
在 ARGS= 的後面追加 -s 114.114.114.114,127.0.0.1:[portB] ,114可更換任意國內可用的dns
並記下這裡 -p 後的端口號,記作portC
更新chnroute:
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /opt/etc/chinadns_chnroute.txt

3. 配置iptables分流,儲存ipset列表

*可以用bestroutetb生成一個優化過chnroute,這個步驟需要在本地主機或者VPS上進行:
apt-get install npm
npm install -g bestroutetb
bestroutetb -p custom --rule-format=$'%prefix/%length\n' --group-header=$'---%name-start\n' --group-footer=$'---%name-end\n' --group-gateway -f -o /tmp/chnroutes.txt
sed -e '/---vpn-start/,/---vpn-end/d' -e '/^---/d' /tmp/chnroutes.txt > /tmp/tb.txt
生成的tb.txt備用

​在ipset中生成兩個直連的列表:
ipset create loprivate hash:net
ipset add loprivate 0.0.0.0/8
ipset add loprivate 10.0.0.0/8
ipset add loprivate 127.0.0.0/8
ipset add loprivate 169.254.0.0/16
ipset add loprivate 172.16.0.0/12
ipset add loprivate 192.168.0.0/16
ipset add loprivate 224.0.0.0/4
ipset add loprivate 240.0.0.0/4
以及:
ipset create chnip hash:net
while read rule; do (ipset add chnip $rule); done < /opt/etc/chinadns_chnroute.txt // *或者tb.txt
​並保存:
ipset save > /opt/etc/saved.ipset

​配置iptables:
​iptables -t nat -N SHADOWSOCKS
​iptables -t nat -A SHADOWSOCKS -d [VPS的IP地址] -j RETURN
iptables -t nat -A SHADOWSOCKS -m set --match-set loprivate dst -j RETURN
iptables -t nat -A SHADOWSOCKS -m set --match-set chnip dst -j RETURN
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports [portA]

4. 啟動服務

使用腳本:
/opt/etc/init.d/[ss-redir腳本] start
/opt/etc/init.d/[ss-tunnel腳本] start
/opt/etc/init.d/[chinadns腳本] start
然後分別檢查一下是否報錯:
/opt/etc/init.d/[腳本] check
如果顯示dead,一般是PROCS中名稱有誤,或者是端口被佔用需要更換,也可能是配置文件語法錯(漏了逗號?)
檢查端口:
lsof -i |grep [端口號]

​配置dnsmasq:
編輯 /etc/dnsmasq.conf
最後添加兩行:
no-resolv
server=127.0.0.1#[portC]
並重啟dnsmasq​​

​使更改生效:
iptables -t nat -A PREROUTING -p tcp --dport 21:5000 -j SHADOWSOCKS

至此已實現分流與轉發​

5. 配置路由器的重啟自動恢復

在 /jffs/scripts/ 下的 service-start 腳本最後添加內容:
ipset restore < /opt/etc/saved.ipset
iptables -t nat -N SHADOWSOCKS
​iptables -t nat -A SHADOWSOCKS -d [VPS的IP地址] -j RETURN
iptables -t nat -A SHADOWSOCKS -m set --match-set loprivate dst -j RETURN
iptables -t nat -A SHADOWSOCKS -m set --match-set chnip dst -j RETURN
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports [portA]
iptables -t nat -A PREROUTING -p tcp --dport 21:5000 -j SHADOWSOCKS​

新建 dnsmasq.postconf ,內容:
#!/bin/sh
CONFIG=$1
source /usr/sbin/helper.sh
pc_append "no-resolv" $CONFIG
pc_append "server=127.0.0.1#[portC]" $CONFIG
並賦予權限:
chmod a+rx /jffs/scripts/*


Reference:

https://icymind.com/learn-from-gfw/
https://gist.github.com/wen-long/8644243
https://blog.microdog.me/2016/06/28/Speed-Up-Network-Accessing-To-Overseas-Services-On-Your-Server/
http://www.q2zy.com/articles/2015/11/04/router-configuration-3/
https://xufooo.ml/2016/06/zybo%e5%bc%80%e5%8f%91%e6%9d%bflinux%e4%b8%8b%e9%80%8f%e6%98%8e%e4%bb%a3%e7%90%86fq%e4%bb%a5%e5%8f%8a%e5%8e%bb%e5%9b%bd%e5%86%85%e5%b9%bf%e5%91%8a/
https://zzz.buzz/zh/gfw/2016/02/16/deploy-shadowsocks-on-routers/
https://cokebar.info/archives/664
https://github.com/goodbest/Merlin-SS-config
https://github.com/YtnbFirewings/asus-merlin-cross-the-gfw
https://www.bjwf125.com/?p=9
https://fooy.github.io/blog/2016/06/18/setup-transparent-proxy-on-r7000/
https://www.zfl9.com/ss-redir.html​​​​

2020年7月17日 星期五

製作可開機 USB 隨身碟

製作可開機 USB 隨身碟

電腦會將內建硬碟機和光碟機辨識為電腦上作用中的磁碟機。 依預設,USB 隨身碟會被辨識為卸除式存放裝置。 欲建立可開機隨身碟,USB 隨身碟必須被配置為電腦上作用中的磁碟機。 您將需要進行下列作業。
  • 準備一個 USB 隨身碟 (4GB 以上) 來接收作業系統。
  • 將檔案從原版的可開機 Windows OS 光碟複製到隨身碟。
  • 從 USB 隨身碟開機,以修復或安裝作業系統。
這個作業需要您使用 Windows 命令視窗,而非標準的 Windows 桌面環境。 欲執行需要的指令,您必須鍵入每個指令,後面跟著一個您電腦特定的變數,然後再按下 Enter 鍵來執行指令。
附註: 
本文件中所使用的磁碟機代碼為:變數 C: 代表內建磁碟機,E: 代表光碟機,而 G 代表 USB 隨身碟。 請視您電腦所指定的磁碟機代碼來變更這些變數來。 
在電腦上的命令視窗中,範例的預設 C 磁碟機命令提示字元是顯示為 C:\>。 當您輸入反映現行磁碟機和目錄的一些指令時,命令提示字元就會改變; 亦即,E:\boot> 是在 E: 磁碟機上的 boot 目錄所顯示的命令提示字元。 指令會以大寫文字顯示。

準備一個隨身碟

您必須執行下列指令,電腦才能將 USB 隨身碟辨識為有效的磁碟機。
  1. 將空白的 USB 隨身碟插入作用中的 USB 連接埠。 隨身碟的容量應為 4 GB 以上。 如果 USB 上有任何資料,您應將其備份,因為當隨身碟經過格式化使其可開機時,所有的檔案都會被刪除。
  2. 按一下開始,在搜尋欄位中輸入 CMD,然後按下 enter 鍵來開啟 Windows 命令視窗。 預設的命令提示字元應為 C:\>
    針對下列每個指令,在命令視窗中,鍵入指令 (以大寫顯示) 及變數,然後按下 enter 鍵。 指令的輸出,或其解說文字將會顯示在下一列。
    C:\>SAMPLE COMMAND
    範例解說
  3. C:\User> DISKPART
    提示字元會變更,以反應 DISKPART 指令中所完成的動作,DISKPART>
  4. DISKPART> LIST DISK
    (這個指令回報數字 0 代表硬碟機,而數字 1 是指派給 USB 隨身碟)。
  5. DISKPART> SELECT DISK 1
    Disk 1 現為已選定的磁碟
    (請將數字 1 替換成前一個指令中指派給 USB 隨身碟的變數)。
  6. C:\> CLEAN
    DiskPart 成功清理磁碟。
  7. C:\> CREATE PARTITION PRIMARY
    DiskPart 成功建立指定的磁碟分區。
  8. C:\> SELECT PARTITION 1
    Partition 1 現為已選定的磁碟分區。
  9. C:\> ACTIVE
    DiskPart 標示現行磁碟分區為作用中。
  10. C:\> FORMAT FS=NTFS
    格式化程序可能會花費幾分鐘。
  11. C:\> ASSIGN
    DISKPART 成功指定磁碟機代碼或掛接點。
  12. C:\> EXIT
    (這個指令會使您結束 DISKPART 函式並讓命令視窗持續開啟, 請勿關閉命令視窗)。
USB 隨身碟現為作用中的磁碟,並已格式化且已指派,您便可將作業系統複製或安裝到隨身碟

將作業系統檔案複製到 USB 隨身碟

USB 隨身碟現為作用中的磁碟,並已格式化且已指派,您便可將作業系統複製到隨身碟。
使用 COPY 或 XCOPY 指令,將檔案從可開機光碟或 DVD 光碟複製到 USB 隨身碟。 這可以讓您使用 USB 隨身碟來使電腦開機,以修復現存的 Windows 執行個體,或在硬碟機上安裝 Windows 新執行個體。 確切的複製指令和選項需視使用的 OS 而定。 下列是複製 Windows Vista 檔案所用的指令。
  1. 插入 Windows 光碟或 DVD 光碟,並關上光碟機門 (假設光碟機是 E 槽,而 USB 隨身碟是 G 槽)。
    如果光碟上的安裝程式嘗試開始,請取消該作業。
  2. DISKPART\>E:
    變更路徑到磁碟機 E:
  3. E\>CD BOOT
    變更路徑到開機目錄。
  4. E:\BOOT\>BOOTSECT NT60 G:
    NTFS 檔案系統啟動碼更新成功。
  5. E:\BOOT\>CD \
    將目錄變更為 E 磁碟機的根目錄。
  6. E:\>xcopy E:\*.* G:\*.* /S/H/E/V
    將所有 Windows 檔案及資料夾複製到 USB 隨身碟。
    或者,您也可以結束命令視窗,改用 Windows 檔案總管,來將所有 Windows 檔案及資料夾從光碟或 DVD 光碟複製到 USB 隨身碟。
  7. 複製完成後,請將控制權變更回硬碟機。
    E:\>C:
  8. DISKPART:\>EXIT
    結束並關閉命令視窗。
USB 隨身碟已就緒可供使用

從 USB 隨身碟開機並安裝作業系統

當您需要使用 USB 隨身碟來開機,請執行下列動作。
  1. 關閉電腦電源。
  2. 連接 USB 隨身碟。
  3. 連接 AC 電源變壓器,然後按下電源按鈕使電腦開機,並重複地按下 f9 鍵來選擇 Change Boot Device Order (變更開機裝置順序) 選項。
  4. 在開機管理程式中,使用 向上鍵向下鍵 來選擇 USB 隨身碟,然後按下 enter 鍵以開始開機程序。
  5. 遵循相關提示,並讓電腦載入所需檔案。
  6. 提示時,請針對修復或安裝程序確認 Language (語言) 或其他喜好設定,並按一下 Next (下一步)
  7. 提示時,請選取修復您的電腦立即安裝選項,並遵循相關提示執行。