安裝(進階篇)

雖然 V2Ray 預設已經可以翻牆,但在牆越來越高的情況下,做多些準備永遠無壞。雖然 Asus Router 性能不足以安多一個 NGINX server,但是如果純 V2ray + TLS 還是可行的。
V2ray 本身是完整支援 TLS,所以 firewall 只會看到一個加密連線,隱密性比較強。
不過首先大家一定需要一支 USB 手指才能安裝。

在大家安裝之前,會假設了大家已經完成了基本篇,亦即時已經建立了 v2ray-check.sh 等等 script.
在此不會再重覆。

安裝 Entware

Entware 必須安裝在 USB 手指,所以需要事前準備。

有師兄留言提醒,Entware 會和 Asus 內置 app 如 Download Master 等相撞,所以記得安 Entware 前要 uninstall 所有華碩 app.
而 Asuswrt-Merlin 已經內置了 Entware 的安裝檔,直接執行就可以了。

entware-setup.sh
asuswrt merlin install entware
選擇你的 USB 手指,今次就是 1
asuswrt merlin install entware
Entware 安裝完成

安裝完要留意,Entware 會覆蓋原本的 services-start 和 post-mount.
所以要重新將內容(除了 #!/bin/sh 這一句)抄進這兩個檔案。

將這句放在 services-start 最底。

#v2ray start
mkdir /var/log/v2ray/
nohup /jffs/v2ray/v2ray --config=/jffs/v2ray/config.json > /dev/null 2>&1 &

將這句放在 post-mount 最底。

#enable swap
swapon /tmp/mnt/sda1/swap.swp
asuswrt merlin entware overwrite script
Entware 將原本的 script overwrite 了

安裝 cert

完整的 TLS 連線意味著雖要完整的證書,自簽證書不太可行(有不少 client 不支援),所以這時候就需要 Let’s Encrypt 這類服務了。Asuswrt-Merlin 現在已經可以使用 Let’s Encrypt,可以直接 create cert,但似乎因為企企本身使用 NameCheap 服務,所以不能使用內置的 Let’s Encrypt,那麽我們需要另一個較簡單的服務 – acme.sh
acme.sh 使用的都是 Let’s Encrypt,不過生成証書過程比較簡單,亦沒有限定一定需要 www 的域名,而且即使沒有 web server 都沒有問題。

asuswrt-merlin build-in letsencrypt
現在 Merlin 版已經內置了 Let’s Encrypt

因為 Asuswrt-Merlin 本身並沒有 Apache 或 NGINX,所以 acme.sh 需要 standalone mode 來運作,而 standalone mode 需要另外安裝 socat 套件才行,entware 就有這套件了。

opkg update && opkg install socat

再執行這句指令就可以安裝:

curl  https://get.acme.sh | sh

acme.sh 會安裝在 root,不過 Asuswrt 的 root 只是暫存性質,建立在 ram 上,一旦 reboot 就會消失不見,所以需要抄到 USB 手指上。

cd /root/.acme.sh
./acme.sh --install --home /mnt/sda1/acme.sh --config-home /mnt/sda1/acme.sh --certhome /mnt/sda1/acme.sh
asuswrt merlin acme install success
成功安裝 acme.sh
asuswrt merlin install socat
acme.sh 需要 socat 才能使用 standalone mode
成功安裝 socat 和相關 library

安裝完後,就可以生成 cert 了。
Standalone mode 會使用 port 80 來驗証域名。
但 Asuswrt 的 webui 會佔據 port 80,所以需要將 webui 設定為 https only,關閉 webui 的 http (port 80) 服務。
並在 firewall 上需要開啓這個 port.

asuswrt merlin webui https
要將 webui 設定為 https only,否則會自動不斷佔據 port 80
kill $(ps w | grep 'httpd -i' | grep -v grep | awk '{print $1}')

然後生成証書:
(提醒大家,需要將 ent-home.asuscomm.com 改成你申請的域名)

/mnt/sda1/acme.sh/acme.sh --home /mnt/sda1/acme.sh --ca-path /mnt/sda1/acme.sh --config-home /mnt/sda1/acme.sh --certhome /mnt/sda1/acme.sh --pre-hook "iptables -I INPUT -p tcp --dport 80 -j ACCEPT" --post-hook "iptables -D INPUT 1" --issue -d ent-home.asuscomm.com --standalone --key-file /jffs/ssl/key.pem --fullchain-file /jffs/ssl/cert.pem

証書會擺放在 /jffs/ssl/ 之內,所以直接使用就可以了。
放在 /jffs/ssl/ 另一個好處是 webui 本身都可以使用這張 ssl cert,一舉兩得。

asuswrt merlin acme created cert
成功產生證書

Let’s Encrypt 的證書有效期是 90 天,所以需要自動更新。

首先建立 acme-issue.sh,將 acme.sh 加入 cron job .

nano /jffs/scripts/acme-issue.sh

將以下內容抄進去:

#!/bin/sh

#kill httpd to release port 80
kill $(ps w | grep 'httpd -i' | grep -v grep | awk '{print $1}')

sleep 10

/mnt/sda1/acme.sh/acme.sh --upgrade --home /mnt/sda1/acme.sh
/mnt/sda1/acme.sh/acme.sh --install-cronjob --home /mnt/sda1/acme.sh --config-home /mnt/sda1/acme.sh --certhome /mnt/sda1/acme.sh

按 Ctrl + X 退出,之後按 Y 確定儲存,再按一下 Enter 確定檔案名。

之後需要更改 services-start,令到每次 reboot 都會載入 acme-issue.sh
但還有其他指令需要加入去,所以先等一等。

只要 router 不關閉,那麽 acme.sh 就會自動更新証書並會抄進 /mnt/sda1/acme.sh/cert 之內。
雖然 cert 會自動更新,但 v2ray 卻不會因為 cert 更新而自動重新載入,所以要再加指令,令 V2ray 定時重新啓動。