執行 V2Ray(基本篇)

聖經馬太福音常說 XX 的人有福了;但企企會說:用華碩 router 的人有福了。
當然這句是開玩笑不必認真,華碩 router 功能多但亦有缺點,不在此詳述了。
華碩 router 最大好處是有 Merlin 非官方版本(大陸稱為梅林版),功能更多,速度更快,而且 bug fix 亦比官方更快,它還可以繼續使用硬件 NAT 加速,是其他非官方 firmware 沒有此功能。
所以對電腦有一定知識的人都會用 Merlin 版本。

V2Ray 是新一代翻牆工具,隱密性較高而且暫時比起 SS / SSR 來說都是少人用,所以未被重點招呼,即使濕鳩大舉行期間都依然用到。
之前寫了一篇介紹完美摸礙 HTTPS 連線的設定,以 V2Ray + NGINX + TLS 來實現,不過這個方法只適用於性能較強勁的 VPS 或家中的 NAS。
相較起來華碩 router 性能較弱,但如果只使用 V2ray 的話還是可行的。

同樣地,今次教學依然會由最簡單開始,如果已經懂了的部份請自行跳過。

註:Asuswrt-Merlin 是非官方版本,如因為任何原因而令到設備損壞,本人並不會負上任何責任。
(頭盔 mode ON)

安裝 Asuswrt-Merlin

其實安裝 Merlin 版 firmware 非常簡單,和升級官方 firmware 過程完全一樣。

首先到 Merlin 官方網站下載最新的 firmware 並解壓。

asuswrt-merlin download
進入 merlin 官網並到 main dowload site 下載
asuswrt-merlin download
選擇自己路由器的型號
asuswrt-merlin download
最底那一個就是最新

基本上最底那一個 firmware 就是最新型號,執筆之時 RT-AC87U_380.68_4 就是最新。
下載後解壓,會看到一個 trx 檔案。

之後登入華碩 router,如無更改的話 IP 應該是 http://192.168.1.1
預設使用者和密碼都是 admin

asus router upgrade merlin firmware
在上方按下 firmware version 的連結
asus router upgrade merlin firmware
按下選擇檔案
asus router upgrade merlin firmware
選擇 firmware 和按開啓
asus router upgrade merlin firmware
再按 upload 就會更新
asus router upgrade merlin firmware
等待更新完成
asus router upgrade merlin firmware
完成後 reboot 多一次

建立 JFFS partition 和開啓 SSH

華碩 router 的 rom 都比較大,所以可以制作一個 partition 用來放運行的 script 等資料,這個功能亦是 Merlin 版 firmware 最重要的功能。
按下左邊的 Administration,再進入 System 版面,就會看到

  • Format JFFS partition at next boot
  • Enable JFFS custom scripts and configs

第一次啓動請將這兩個都轉為 Yes.

另外,Enable SSH 請設定為 LAN .
SSH service port 設定為 22 .
Allow SSH password login 如無意外預設應該是 Yes,不用更改。

asuswrt merlin jffs setup
開啓 JFFS 和 SSH

儲存後重啓,應該已經可以正常使用了。

準備域名

大部份家中的寬頻都是浮動 IP,所以都需要一個域名來指向這個 IP。
華碩 router 都會內置 asuscomm.com 域名的 DDNS,可以使用這個,大家亦可以使用 Dyndns 這類域名,隨大家喜歡。
(不過要留意這些免費域名有機會時不時被 GFW 封鎖,尤其是類似濕鳩大這類重點維穩時期,被封鎖的機會較大,所以會建議購買域名。)

只要到 WAN –> DDNS.
開啓 DDNS 並選擇 www.asus.com 作供應商,再填上的想要的域名就可以。
如果無其他人登記的話就會告訴你成功登記並可以開始使用。

asus router ddns
順利登記了

現在,華碩 router 已經可以使用 SSH 連線並上傳檔案了。
首先,到 V2ray core 網站下載最新的版本,執筆之時最新版本是 2.41。
華碩 router 都是使用 ARM CPU 的,所以下載 ARM 版本就可以了。

v2ray core download
下載 ARM 版本 V2Ray

下載完解壓,不用詳細解說吧。

上載 V2Ray

由於華碩 router 不支援直接 unzip,所以我們需要解壓後使用 WinSCP 上載到華碩 router.
首先到 WinSCP 網站下載,基本上 protable 版本已經可以了。

winscp download
下載 protable 版本
winscp run
解壓後執行 WinSCP.exe

如果依照之前設定,那麽 router 的 IP 是 192.168.1.1,port 是 22,而 username 和 password 是 admin / admin
在 file protocol 選擇 SCP .

留意第一次連上去時會問你是否信任 router,當然要答 YES.

winscp connect information
之著之前的設定填寫資料

按 login 後應該能成功登入,按「回上一層」直到 /root 見到 jffs folder 為止,之後進入。

winscp connection scussess
按回上一層
winscp go to jffs
直到見到 jffs,之後進入 jffs folder

在 jffs 入面,建立一個 v2ray 的 folder.

winscp create v2ray folder
按 New –> folder
winscp create v2ray folder
輸入 v2ray

在左手邊 Window 選擇解壓後的 V2ray folder,之後將所以檔案拖去右手邊上載。

winscp upload files
將 V2Ray 檔案拖去右手邊上載,按下 OK 就會開始
winscp upload files status
上載中

上載後,要將 V2Ray 轉為可執行狀態。
Right Click v2ray,按 Properties.
之後將 Permissions 3 個 X 都剔,之後按 OK。

winscp v2ray properties
right click -> properties
winscp v2ray excute
將 3 個 X 都剔

現在已經安裝完成。

現在,首先要下載 Putty 來連線到 router.
Putty 下載網址
執筆之時最新版本是 0.7 .

現在大部份電腦都是 64bit OS,所以揀 64bit 都沒有錯
putty all programs
雖然有數個檔案但我們只需要 PuTTY
putty login asus router
IP address 填上 192.168.1.1
putty login asus router
username 和 password 都是 admin
putty login asus router
成功登入

vi 教學

雖然企企 merlin 有 nano,但好像不是所有人都有。
如果沒有的話,就需要使用 Linux 最基本的編輯器 – vi

vi 是所有 Linux 版本都必定會有,用法亦不難,只要將 vi 取代 nano, 例如:

vi /jffs/scripts/v2ray.sh

進入編輯器後,按一下 i,進入輸入模式。

輸入完畢後,按一下 Esc 退出輯輯模式,再打「:wq」
就可以儲存並離開。

如出錯不想儲存的話,按 Esc 退出編輯模式後,就可以打「:q!」離開。

V2ray 設定

現在,首先令 V2ray 開機時自動啓動。
並每分鐘檢查一次 V2ray 有否正常運作,如果沒有運行的話就重新啓動。

nano /jffs/scripts/v2ray-check.sh

複制 & 貼上

#! /bin/sh
case "$(pidof v2ray | wc -w)" in
0)  echo "Restarting V2ray:     $(date)" >> /var/log/v2ray/v2ray-status.log
    nohup /jffs/v2ray/v2ray --config=/jffs/v2ray/config.json >/dev/null 2>&1 &
    ;;
1)  # all ok
    ;;
*)  echo "Removed double V2ray: $(date)" >> /var/log/v2ray/v2ray-status.log
    kill $(pidof v2ray | awk '{print $1}')
    ;;
esac

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

這段 script 的意思是檢查 v2ray 有沒有運行,有運行的話就繼續,如果沒有運行的話就再次啓動,如果同時運行 2 個或以上的話就關閉多出的程序。

再將 v2ray-check.sh 加入 services-start

nano /jffs/scripts/services-start

將以下內容複制 & 貼上
(如果已經有內容的話,可以將除 #!/bin/sh 外的內容貼在最底)

#!/bin/sh
#v2ray start
mkdir /var/log/v2ray/
#舊型號router比較慢
#可以設定等待5分鐘以確保網絡起動後才啓動V2ray
#如果新型號的話,60s已經可以了
sleep 300
nohup /jffs/v2ray/v2ray --config=/jffs/v2ray/config.json > /dev/null 2>&1 &
#check v2ray every 15 minute
cru a check-v2ray "*/15 * * * * /jffs/scripts/v2ray-check.sh > /dev/null"

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

再在 firewall 開啓 port 10086

nano /jffs/scripts/firewall-start

將以下內容複制 & 貼上

#!/bin/sh

iptables -I INPUT -p tcp --dport 10086 -j ACCEPT

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

再輸入以下指令將所有 script 進入可執行狀態。

chmod a+rx /jffs/scripts/*

另外 v2ray 的執行檔亦需要設定為可執行狀態。

cd /jffs/v2ray/
chmod a+rx v2ctl v2ray

V2ray 設定檔

現在設定 V2Ray 的設定檔。

當然又要重覆多次,大家請自行更改 ID。
如果不知如何產生一個新的 UUID 的話,到這個網站抄一個就可以了,它會 rendom 產生一個出來。

cp /jffs/v2ray/vpoint_vmess_freedom.json /jffs/v2ray/config.json
nano /jffs/v2ray/config.json

之後應該可以看到以下內容,只要將 id 更改就可以了。
(大家亦可改用其他 port,不一定需要使用 10086,只要大家設定 client 時使用相同的 port,firewall 亦打開相同的 port 就可以了。)

{
  "log" : {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "warning"
  },
  "inbound": {
    "port": 10086,
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",
          "level": 1,
          "alterId": 64
        }
      ]
    }
  },
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  },
  "outboundDetour": [
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    }
  ],
  "routing": {
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "blocked"
        }
      ]
    }
  }
}

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

這個設定檔是最基本的 V2Ray 設定,在防火牆會看到是一個 TCP 連線,雖然暫時仍能翻牆但並非一個較好的方案,最好依然是使用 NGINX + V2Ray。

無錯,本文明顯是標題黨,世界無完全免費的午餐。iOS 暫時未有免費的 V2ray client,暫時有 Shadowrocket, Shadowray, Kitsunebi 等,全部都是付費 app,由 $15 到 $23 不等。

今次示範以Shadowrocket 為例,其他 client 都大同小異。

shadowrocket base settings
沒有太多特喇的設定

可以看到這次沒有太多地方需要設定,只要最基本的 IP / domain,port,UUID 就可以了。

Android 的話有數種免費的 client,今次使用 V2rayNG 示範。

v2rayng base settings
和 iOS 一樣,只需輸入基本資料
v2rayng base settings
其他只有 「tcp」 比較需要留意

同樣地,沒有太多需要設定。

如果使用 Actinium,可以將以下 config 儲成 client.json 來滙入。

{
    "log": {
        "loglevel": "warning"
    },
    "inbound": {
        "port": 1080,
        "listen": "127.0.0.1",
        "protocol": "socks",
        "settings": {
            "auth": "noauth",
            "udp": false,
            "ip": "127.0.0.1"
        }
    },
    "outbound": {
        "protocol": "vmess",
        "settings": {
            "vnext": [{
                "address": "ent-home.asuscomm.com",
                "port": 10086,
                "users": [{
                    "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",
                    "alterId": 64,
                    "security": "auto"
                }]
            }]
        },
        "mux": {
            "enabled": true
        }
    },
    "outboundDetour": [{
        "protocol": "freedom",
        "settings": {},
        "tag": "direct"
    }],
    "dns": {
        "servers": [
            "8.8.8.8",
            "8.8.4.4",
            "localhost"
        ]
    },
    "routing": {
        "strategy": "rules",
        "settings": {
            "domainStrategy": "IPIfNonMatch",
            "rules": [{
                    "type": "field",
                    "port": "1-52",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "port": "54-79",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "port": "81-442",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "port": "444-65535",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "domain": ["geosite:cn"],
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "ip": [
                        "0.0.0.0/8",
                        "10.0.0.0/8",
                        "100.64.0.0/10",
                        "127.0.0.0/8",
                        "169.254.0.0/16",
                        "172.16.0.0/12",
                        "192.0.0.0/24",
                        "192.0.2.0/24",
                        "192.168.0.0/16",
                        "198.18.0.0/15",
                        "198.51.100.0/24",
                        "203.0.113.0/24",
                        "::1/128",
                        "fc00::/7",
                        "fe80::/10",
                        "geoip:cn"
                    ],
                    "outboundTag": "direct"
                }
            ]
        }
    }
}

同樣今次未有 Mac機可以嘗試安裝,不過和這個 youtube 教學大同小異,大家要自行摸索了。

至於 Windows,雖然 V2RayW 較新,介面亦比較好,但是不知何解不是所有設定都能連線,所以都和上一篇一樣使用 V2tray 作示範。

首先到這裏下載 V2ray Core Windows 版,再到這裏下載 V2ray 的 GUI 介面 V2tray,將所有檔案放在同一 folder 就可以了。

v2ray core win64 download
相信現在大部份人都是 64bit Windows 吧
v2tray
將所有檔案放在一起
v2tray
按下編輯配置

將以下設定貼上去就可以,亦再次重申,自行更改 ID 和域名。

{
    "log": {
        "loglevel": "warning"
    },
    "inbound": {
        "port": 5000,
        "listen": "127.0.0.1",
        "protocol": "http",
        "settings": {
            "auth": "noauth",
            "udp": false,
        "ip": "127.0.0.1"
        }
    },
    "outbound": {
        "protocol": "vmess",
        "settings": {
            "vnext": [
                {
                    "address": "ent-home.asuscomm.com",
                    "port": 10086,
                    "users": [
                        {
                            "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",
                            "alterId": 64,
                            "security": "auto"
                        }
                    ]
                }
            ]
        },
        "mux": {
        "enabled": true
        }
    },
    "outboundDetour": [
        {
            "protocol": "freedom",
            "settings": {},
            "tag": "direct"
        }
    ],
    "dns": {
        "servers": [
            "8.8.8.8",
            "8.8.4.4",
            "localhost"
        ]
    },
    "routing": {
        "strategy": "rules",
        "settings": {
            "domainStrategy": "IPIfNonMatch",
            "rules": [
                {
                    "type": "field",
                    "port": "1-52",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "port": "54-79",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "port": "81-442",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "port": "444-65535",
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "domain": ["geosite:cn"],
                    "outboundTag": "direct"
                },
                {
                    "type": "field",
                    "ip": [
                        "0.0.0.0/8",
                        "10.0.0.0/8",
                        "100.64.0.0/10",
                        "127.0.0.0/8",
                        "169.254.0.0/16",
                        "172.16.0.0/12",
                        "192.0.0.0/24",
                        "192.0.2.0/24",
                        "192.168.0.0/16",