V2Ray 記錄

本文記錄自V2Ray配置指南,加上一些些個人註解,非常感謝此文的作者。

常用 Linux 指令

查看時間

date -R

更改時區

cp /usr/share/zoneinfo/Asia/Taipei /etc/localtime

查看 CentOS 版本

cat /etc/redhat-release

查看源

cat /etc/apt/sources.list

查看自已的 ip

ifconfig.me

常用 v2ray 指令

編緝設定檔

vi /etc/v2ray/config.json

控制

service v2ray start|stop|status|reload|restart|force-reload

測試設定檔

/usr/bin/v2ray/v2ray -test -config /etc/v2ray/config.json

常用 Nginx 指令

vi /etc/nginx/nginx.conf
nginx -t
systemctl reload nginx

less /var/log/nginx/access.log

參考[^12}


CentOS 7 安裝 V2Ray

一行結束

bash <(curl -L -s https://install.direct/go.sh)

此脚本会自动安装以下文件:

/usr/bin/v2ray/v2ray:V2Ray 程序;
/usr/bin/v2ray/v2ctl:V2Ray 工具;
/etc/v2ray/config.json:配置文件;
/usr/bin/v2ray/geoip.dat:IP 数据文件
/usr/bin/v2ray/geosite.dat:域名数据文件

此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

运行脚本位于系统的以下位置:

/etc/systemd/system/v2ray.service: Systemd
/etc/init.d/v2ray: SysV

脚本运行完成后,你需要:

编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
运行 service v2ray start 来启动 V2Ray 进程;
之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。

將 Clinet 端貼上預設設定即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
"inbound": {
"port": 1080, // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
"listen": "127.0.0.1",
"protocol": "socks",
"domainOverride": ["tls","http"], // “識別相應協定的流量,並根據流量內容重置所請求的目標”,簡單說這東西就是從網路流量中識別出域名。手機用戶無法使用 chinasites 時使用。
"settings": {
"auth": "noauth", //socks的認證設置,noauth 代表不認證,由於 socks 通常在客戶端使用,所以這裡不認證
"udp": true
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "我是SERVER IP", // 服务器地址,请修改为你自己的服务器 ip 或域名
"port": 我是端口, // 服务器端口
"users": [
{
"id": "我是UUID", // 用戶 ID,必須與伺服器端配置相同
"alterID": 64 // 此處的值也應當與伺服器相同,認證用值越大會使用 V2Ray 佔用更多的記憶體。對於一般用戶來說,alterId 的值設為 30 到 100 之間應該是比較合適的。
}
]
}]
}
},
"outboundDetour": [{
"protocol": "freedom",
"tag": "direct", //如果要使用路由,這個 tag 是一定要有的,在這裡 direct 就是 freedom 的一個標號,在路由中說 direct V2Ray 就知道是這裡的 freedom 了
"settings": {}
}],
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "IPOnDemand",
"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": "direct"
}]
}
}
}

Sever 端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{
"log" : {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbound": {
"port": 15674,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "12713195-43cd-4cce-8dd6-739c8244a519",
"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"
}
]
}
}
}

UUID4 生成指令
cat /proc/sys/kernel/random/uuid

多IP

1
2
3
4
"clients": [
{"id": "xxxx", "alterId": 64},
{"id": "yyyy", "alterId": 64}
]

JSON

作者3
JSON 所有標點符號都要用半角符號(英文符號)
所有字串都要加雙引號 “ “,鍵是字串,所以鍵也要加雙引號,數字不用加雙引號
布爾類型也不用加雙引號,布爾值只有兩個就是 true 和 false,意思就是真和假
對象沒有順序,即大括弧 {} 括起來的內容順序是怎麼樣都沒關係


中國地區不翻牆

Client 端的 Route 改為

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"routing": {
"strategy": "rules", //固定格式
"settings": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "chinasites", //中國的網站域名
"outboundTag": "direct"
},
{
"type": "chinaip", //中國的IP
"outboundTag": "direct"
}
]
}
}


廣告過濾

Client 端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"domain": [
"tanx.com",
"googeadsserving.cn",
"baidu.com"
],
"type": "field",
"outboundTag": "adblock"
},
{
"domain": [
"amazon.com",
"microsoft.com",
"jd.com",
"youku.com",
"baidu.com"
],
"type": "field",
"outboundTag": "direct"
},
{
"type": "chinasites",
"outboundTag": "direct"
},
{
"type": "chinaip",
"outboundTag": "direct"
}
]
}
}

在第一個規則中,域名包含有 tanx.com 或 baidu.com 的就會被阻止連接。在第二個規則當中,域名中包含有 amazon.com 或 microsoft.com 或 youku.com 或 baidu.com 的會直連。有一個問題大家發現沒有,兩個規則都有 baidu.com ,那麼會執行哪個呢?答案是只會執行第一個,原因是:

  1. 規則是放在 routing.settings.rules 這個陣列當中,陣列的內容是有順序的,也就是說在這裡規則是有順序的,匹配規則時是從上往下匹配
  2. 當路由匹配到一個規則時就會跳出匹配而不會對之後的規則進行匹配

inbound / outbound 和 inboundDetour / outboundDetour 的區別

inbound 和 inboundDetour 的格式形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
"inbound": {
"port": 1080,
"listen": "127.0.0.1",
"protocol": "協定名稱",
"settings": {},
"streamSettings": {},
"allowPassive": false,
"tag": "標識"
},
"inboundDetour": [
{
"port": 2080,
"listen": "127.0.0.1",
"protocol": "協定名稱",
"settings": {},
"streamSettings": {},
"allowPassive": false,
"tag": "標識",
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
},
{
"port": 3080,
"listen": "127.0.0.1",
"protocol": "協定名稱",
"settings": {},
"streamSettings": {},
"allowPassive": false,
"tag": "標識",
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
}
]

可以很明顯地看出來,inbound 和 inboundDetour 基本是一樣的,只不過 inboundDetour 是 inbound 的集合。還有一點不同的是 inboundDetour 多了一個 allocate 參數,這是只有在動態端口才會用到的參數,如果不配置動態端口 inboundDetour 和 inbound 無異。

即有兩點不同:

配置中 inbound 只能並且必須設置一個傳入的配置,而 inboundDetour 可以設置任意多個傳入配置
inboundDetour 的傳入配置多了一個給動態端口用的 allocate 參數
接著是傳出,outbound 和 outboundDetour 格式形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"outbound": {
"sendThrough": "0.0.0.0",
"protocol": "協定名稱",
"settings": {},
"tag": "標識",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag"
}
},
"outboundDetour": [
{
"sendThrough": "0.0.0.0",
"protocol": "協定名稱",
"settings": {},
"tag": "標識",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag"
}
},
{
"sendThrough": "0.0.0.0",
"protocol": "協定名稱",
"settings": {},
"tag": "標識",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag"
}
}
]

單純從配置格式來看,outbound 和 outboundDetour 沒有任何區別。但是實際上 outbound 和 outboundDetour 也有兩點不同:

配置中 outbound 只能並且必須設置一個傳出的配置,而 outboundDetour 可以設置任意多個傳出配置(實際上不可能任意多)
當沒有配置路由規則或者路由沒有匹配的情況下,默認由 outbound 將資料包發出去。
在上面給出的傳入和傳出配置格式當中,有一些參數不曾提到過,主要是因為一般情況下使用 V2Ray 默認設置即可


V2Ray 高級設置

V2Ray 的相比其他工具有一大優點是可以自行選擇傳輸層6的形式,也就是說 V2Ray 伺服器和客戶端之間的傳輸的流量格式我們是可以選擇的。如我們可以選擇偽裝成 HTTP(TCP) 流量,如果使用了 mKCP 也可以偽裝成 BT 下載、視頻通話、微信視頻通話。也可以選擇使用 WebSokcs 或者 TLS。以上這個都是傳輸層的配置決定的。

V2Ray 中傳輸層配置在 transport 裡設定,也可以在各個 inbound/outbound 中的 streamSettings 設定。這兩者的區別是 inbound/outbound 的 streamSettings 只對當前的 inbound/outbound 有效 (分連接配置),不影響其他的 inbound/outbound 的傳輸層配置,而 transport 是全局的,對整個配置所有的 inbound 和 outbound 都有效 (全局配置),如果一個 inbound/outbound 中設定了 streamSettings,transport 的設定不會影響這個 inbound/outbound。

在本篇當中,大部分內容都涉及到了傳輸層,關於這部分內容使用的是 inbound/outbound 的 streamSettings(分連接配置),同時也建議大家使用分連接配置。因為如果你在全局配置中開啟了偽裝功能,會導致瀏覽器或者其他軟件無法與 V2Ray 通信!這不是 bug,只是因為你設置不當。


Mux 多路復用 (multiplexing)

將多個 TCP 連線合併為一條,可節省資源,提高並發能力。

Mux 只需在客戶端開啟,伺服器會自動識別,所以只給客戶端的配置。只要在 outbound 或 outboundDetour 加入 “mux”: {“enabled”: true} 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"inbound": {
"port": 1080, // 監聽端口
"protocol": "socks", // 入口協定為 SOCKS 5
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth" // 不認證
}
},
"outbound": {
"protocol": "vmess", // 出口協定
"settings": {
"vnext": [
{
"address": "serveraddr.com", // 伺服器位址,請修改為你自己的伺服器 ip 或域名
"port": 16823, // 伺服器端口
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811", // 用戶 ID,必須與伺服器端配置相同
"alterId": 64 // 此處的值也應當與伺服器相同
}
]
}
]
},
"mux": {"enabled": true}
}
}

mKCP

V2Ray 引入了 KCP 傳輸協定,稱為 mKCP,相對於常規的 TCP 來說,mKCP 在某些網路環境下具有更大的優勢,但是 mKCP 有一個很明顯的缺點就是會比 TCP 耗費更多的流量,所以請酌情使用。要瞭解的一點是,mKCP 與 KCPTUN 同樣是 KCP 協定,但兩者並不相容。
KCP 後文會再作介紹

1.1. 配置
mKCP 的配置比較簡單,只需在伺服器的 inbound 和 客戶端的 outbound 添加一個 streamSettings 並設置成 mkcp 即可。

1.1.1. 伺服器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"inbound": {
"port": 16823,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
},
"streamSettings": {
"network": "mkcp", //此處的 mkcp 也可寫成 kcp,兩種寫法是起同樣的效果
"kcpSettings": { //包含一些關於 mKCP 設置的參數
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5, //上行鏈路容量,將決定 V2Ray 向外發送資料包的速率。單位為 MB
"downlinkCapacity": 100, //下行鏈路容量,將決定 V2Ray 接收資料包的速率。單位同樣是 MB
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": { //對於資料包的偽裝
"type": "none" //要偽裝成的資料包類型, 可以設置成 utp、srtp、wechat-video 或者 none,這四個可以分別將 mKCP 資料偽裝成 BT 下載、視頻通話、微信視頻通話以及不進行偽裝。這裡的 type 參數,客戶端與伺服器要一致
}
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

1.1.2. 客戶端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"inbound": {
"port": 1080,
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth"
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "serveraddr.com",
"port": 16823,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "mkcp",
"kcpSettings": {
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 100,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "none"
}
}
}
}
}

1.1.3. 說明
在上面的配置當中,與之前相比主要的變化在於多了一個 streamSettings

客戶端的上行對於伺服器來說是下行,同樣地客戶端的下行是伺服器的上行,mKCP 設置當中伺服器和客戶端都有 uplinkCapacity 和 downlinkCapacity,所以客戶端的上傳速率由伺服器的 downlinkCapacity 和客戶端的 uplinkCapacity 中的最小值決定,客戶端的下載速率也是同樣的道理。因此,建議將伺服器和客戶端的 downlinkCapacity 設成一個很大的值,然後分別修改兩端的 uplinkCapacity 以調整上下行速率。

還有一個 header 參數可以對 mKCP 進行偽裝,這是 mKCP 的一個優勢。具體的偽裝在 type 參數設置,type 可以設置成 utp、srtp、wechat-video 或者 none,這四個可以分別將 mKCP 資料偽裝成 BT 下載、視頻通話、微信視頻通話以及不進行偽裝。這裡的 type 參數,客戶端與伺服器要一致

至於上述配置裡有但是我沒有說明的參數,是 V2Ray 的默認值,我個人建議是保持默認。如果你需要瞭解或者修改,請參考手冊。


動態端口

V2Ray 提供了一個叫動態端口的功能。顧名思義,就是可以動態變化端口,對於對抗封鎖或許有效

伺服器 inbound 的端口作為主端口,在 inboundDetour 開動態監聽的端口,客戶端不用額外設定。

1.1.1. 伺服器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"inbound":{
"port": 37192,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f",
"level": 1,
"alterId": 64
}
],
"detour": {
"to": "dynamicPort"
}
}
},
"inboundDetour":[
{
"protocol": "vmess",
"port": "10000-20000", // 端口範圍
"tag": "dynamicPort",
"settings": {
"default": {
"level": 1,
"alterId": 32
}
},
"allocate": { // 分配模式
"strategy": "random", // 隨機開啟
"concurrency": 2, // 同時開放兩個端口
"refresh": 3 // 每三分鐘刷新一次
}
}
]
}

動態端口使用 mKCP

同 mKCP 章節,在 inbound 和 inboundDetour 加入 streamSettings 並將 network 設置為 kcp 即可。
伺服器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"inbound": {
"port": 37192,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f",
"level": 1,
"alterId": 64
}
],
"detour": {
"to": "dynamicPort"
}
},
"streamSettings": {
"network": "kcp"
}
},
"inboundDetour": [
{
"protocol": "vmess",
"port": "10000-20000", // 端口範圍
"tag": "dynamicPort",
"settings": {
"default": {
"level": 1,
"alterId": 32
}
},
"allocate": { // 分配模式
"strategy": "random", // 隨機開啟
"concurrency": 2, // 同時開放兩個端口
"refresh": 3 // 每三分鐘刷新一次
},
"streamSettings": {
"network": "kcp"
}
}
]
}

傳出代理

V2Ray 提供了傳出代理功能,利用它可以實現中轉(在沒有中轉伺服器操作權限的情況下)。

1.1. 基本傳出代理
使用傳出代理可以實現由一個 Shadowsocks 伺服器或者 V2Ray(VMess) 伺服器來中轉你的網路流量,中轉伺服器只能看到你加密的資料而不知道原始的資料是什麼。

以下面的配置說明,它的工作原理是:

  1. 你在 Twitter 發了個帖子 f**k GFW,由 V2Ray 代理
  2. V2Ray 客戶端收到瀏覽器發出的 f**k GFW 的帖子後,首先由對其進行加密 (VMess,id: b12614c5-5ca4-4eba-a215-c61d642116ce, 目的伺服器: 1.1.1.1:8888)
  3. 加密後資料包將被轉到 transit 這個 outbound 中,在這裡資料包又會加密一次 (Shadowsocks, password: password, 伺服器: 2.2.2.2:1024)
  4. 兩次加密後的資料包被發送到了 Shadowsocks 伺服器,該伺服器收到後解包後得到仍是加密的資料包(步驟 2 中加密後的資料包),然後將資料包發到 VMess 伺服器。即便這個 Shadowsocks 伺服器的主人是個偷窺狂魔,他也沒辦法看到你的原始資料。
  5. VMess 伺服器收到 Shadowsocks 伺服器發來的資料包,解密得到原始的資料包,然後把你這個帖子發到 Twitter 的網站中。

只要第 5 步中的伺服器是自己掌控的就不用擔心別人看到你的上網的內容。

過程說明:
1.我是使用者->2.我是使用者安裝在系統上的 V2Ray 客戶端,加密成 V2Ray 格式→3.V2Ray 客戶端出口再加密成 SS 格式→4.中轉的 SS server 收到後只能解密一次,就再轉送給下一站→5.V2Ray Server 收到,解密後傳出。

客戶端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"outbound": {
"protocol": "vmess",
"settings": { // settings 的根據實際情況修改
"vnext": [
{
"address": "1.1.1.1",
"port": 8888,
"users": [
{
"alterId": 64,
"id": "b12614c5-5ca4-4eba-a215-c61d642116ce"
}
]
}
]
},
"streamSettings": {
"network": "tcp" // 此處不能是 "kcp",設成 "kcp" 將無法聯網
},
"proxySettings": {
"tag": "transit" // 這裡的 tag 必須跟作為代理 VPS 的 tag 一致,這裡設定的是 "transit"
}
},
"outboundDetour": [
{
"protocol": "shadowsocks",
"settings": {
"servers": [
{
"address": "2.2.2.2",
"method": "aes-256-cfb",
"ota": false,
"password": "password",
"port": 1024
}
]
},
"tag": "transit"
}
]
}

1.2. 鏈式傳出代理
如果你有多個 Shadowsocks 或 VMess 賬戶,那麼你可以這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
{
"outbound": {
"protocol": "vmess",
"settings": { // settings 的根據實際情況修改
"vnext": [
{
"address": "1.1.1.1",
"port": 8888,
"users": [
{
"alterId": 64,
"id": "b12614c5-5ca4-4eba-a215-c61d642116ce"
}
]
}
]
},
"streamSettings": {
"network": "tcp"
},
"tag": "DOUS",
"proxySettings": {
"tag": "DOSG"
}
},
"outboundDetour": [
{
"protocol": "shadowsocks",
"settings": {
"servers": [
{
"address": "2.2.2.2",
"method": "aes-256-cfb",
"ota": false,
"password": "password",
"port": 1024
}
]
},
"tag": "AliHK"
},
{
"protocol": "shadowsocks",
"settings": {
"servers": [
{
"address": "3.3.3.3",
"method": "aes-256-cfb",
"ota": false,
"password": "password",
"port": 3442
}
]
},
"tag": "AliSG",
"proxySettings": {
"tag": "AliHK"
}
},
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "4.4.4.4",
"port": 8462,
"users": [
{
"alterId": 64,
"id": "b27c24ab-2b5a-433e-902c-33f1168a7902"
}
]
}
]
},
"tag": "DOSG",
"streamSettings": {
"network": "tcp"
},
"proxySettings": {
"tag": "AliSG"
}
},
]
}

那麼資料包經過的節點依次為: PC -> AliHK -> AliSG -> DOSG -> DOUS -> 目標網站

這樣的傳出代理形成了一條鏈條,我稱之為鏈式傳出代理。

注意:如果你打算配置 (動態) 鏈式傳出代理,應當明確幾點:

  • 性能。鏈式代理使用了多個節點,可能會造成延時、帶寬等網路性能問題,並且客戶端對每一個加解密的次數取決於代理鏈的長度,理論上也會有一定的影響。
  • 安全。前文提到,傳出代理會一定程度上提高安全性,但安全取決於最弱一環,並不意味著代理鏈越長就會越安全。如果你需要匿名,請考慮成熟的匿名方案。 另外,使用了傳出代理 streamSettings 會失效。

HTTP 偽裝

(2018-03-16 註:個人建議不要使用 HTTP 偽裝) V2Ray 自 v2.5 版本開始提供 HTTP 偽裝功能,後經作者不斷完善,到現在已經非常成熟穩定了。V2Ray 的 HTTP 偽裝功能可以可以將 V2Ray 的流量偽裝成正常的 HTTP 協定的。這裡給出一個 HTTP 偽裝的伺服器端與客戶端配置文件示例。

配置中關於 HTTP 頭欄位的內容及含義,Wikipedia 有簡要的說明,可參閱。

1.1. 配置

從 V2Ray 的實現角度來說,使用 HTTP 偽裝的同時完全可以使用動態端口。但我個人並不建議這麼做,因為從實際情況來看,基本上不會有人在一個伺服器上開使用多個端口的 Web 服務。如果你覺得 HTTP 偽裝的配置過於複雜不懂得如何修改,那請直接使用下面的配置即可。

1.1.1. 伺服器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
{
"log" : {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbound": {
"port": 80, //推薦80端口,更好地迷惑防火牆(好吧實際上並沒有什麼卵用
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"level": 1,
"alterId": 64
}
]
},
"streamSettings": {
"network": "tcp",
"tcpSettings": {
"header": { // header 這一項是關於資料包偽裝的設置,可自定義合理的內容,但要確保伺服器與客戶端一致
"type": "http",
"response": {
"version": "1.1",
"status": "200",
"reason": "OK",
"headers": {
"Content-Type": ["application/octet-stream", "application/x-msdownload", "text/html", "application/x-shockwave-flash"],
"Transfer-Encoding": ["chunked"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
}
}
}
},
"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"
}
]
}
}
}

1.1.2. 客戶端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
{
"log": {
"loglevel": "warning"
},
"inbound": {
"port": 1080,
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth"
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "serveraddr.com",
"port": 80,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"tcpSettings": {
"header": { //這裡的 header 要與伺服器保持一致
"type": "http",
"request": {
"version": "1.1",
"method": "GET",
"path": ["/"],
"headers": {
"Host": ["www.cloudflare.com", "www.amazon.com"],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
],
"Accept-Encoding": ["gzip, deflate"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
}
}
}
},
"outboundDetour": [
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
],
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "IPIfNonMatch",
"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": "direct"
},
{
"type": "chinasites",
"outboundTag": "direct"
},
{
"type": "chinaip",
"outboundTag": "direct"
}
]
}
}
}

TLS

從 v1.19 起引入了 TLS,TLS 中文譯名是傳輸層安全,如果你沒聽說過,請 Google 瞭解一下。以下給出些我認為介紹較好的文章鏈結:

SSL/TLS 協定運行機制的概述
傳輸層安全協定

1.1. 註冊一個域名

如果已經註冊有域名了可以跳過。 TLS 需要一個域名,域名有免費的和有付費的,如果你不捨得為一個域名每年花點錢,用個免費域名也可以,但總體來說付費的會優於免費的。為了方便,在本文中我就忽略如何註冊購買域名了。關於如何獲取域名,具體搜索相關文章教程。

註冊好域名之後務必記得添加一個 A 記錄指向你的 VPS!

以下假設註冊的域名為 mydomain.me,請將之替換成自己的域名。

1.2. 證書生成

TLS 是證書認證機制,所以使用 TLS 需要證書,證書也有免費付費的,同樣的這裡使用免費證書,證書認證機構為 Let’s Encrypt。 證書的生成有許多方法,這裡使用的是比較簡單的方法:使用 acme.sh 腳本生成,本部分說明部分內容參考於 acme.sh README。

證書有兩種,一種是 ECC 證書(內置公鑰是 ECDSA 公鑰),一種是 RSA 證書(內置 RSA 公鑰)。簡單來說,同等長度 ECC 比 RSA 更安全, 也就是說在具有同樣安全性的情況下,ECC 的密鑰長度比 RSA 短得多(加密解密會更快)。但問題是 ECC 的相容性會差一些,Android 4.x 以下和 Windows XP 不支援。只要您的設備不是非常老的老古董,強烈建議使用 ECC 證書。

以下將給出這兩類證書的生成方法,請大家根據自身的情況自行選擇其中一種證書類型。

證書生成只需在伺服器上操作。

1.2.1. 安裝 acme.sh

安裝 EPEL 軟體擴充資源庫:

yum install epel-release

Let’s Encrypt 憑證取得方式不同與其他網站是在網頁上手動填寫申請資料的,而是須在 Server 上安裝一個 Client(python 寫的),這種作法所帶來的好處是可全自動化,這裡使用 Let’s Encrypt 官方推薦的 Certbot Client,來自動取得、部署和更新 SSL 憑證:

yum install certbot

執行以下命令,acme.sh 會安裝到 ~/.acme.sh 目錄下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ curl https://get.acme.sh | sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 671 100 671 0 0 680 0 --:--:-- --:--:-- --:--:-- 679
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 112k 100 112k 0 0 690k 0 --:--:-- --:--:-- --:--:-- 693k
[Fri 30 Dec 01:03:32 GMT 2016] Installing from online archive.
[Fri 30 Dec 01:03:32 GMT 2016] Downloading https://github.com/Neilpang/acme.sh/archive/master.tar.gz
[Fri 30 Dec 01:03:33 GMT 2016] Extracting master.tar.gz
[Fri 30 Dec 01:03:33 GMT 2016] Installing to /home/user/.acme.sh
[Fri 30 Dec 01:03:33 GMT 2016] Installed to /home/user/.acme.sh/acme.sh
[Fri 30 Dec 01:03:33 GMT 2016] Installing alias to '/home/user/.profile'
[Fri 30 Dec 01:03:33 GMT 2016] OK, Close and reopen your terminal to start using acme.sh
[Fri 30 Dec 01:03:33 GMT 2016] Installing cron job
no crontab for user
no crontab for user
[Fri 30 Dec 01:03:33 GMT 2016] Good, bash is found, so change the shebang to use bash as preferred.
[Fri 30 Dec 01:03:33 GMT 2016] OK
[Fri 30 Dec 01:03:33 GMT 2016] Install success!

安裝成功後執行 source ~/.bashrc 以確保腳本所設置的命令別名生效。

如果安裝報錯,那麼可能是因為系統缺少 acme.sh 所需要的依賴項,acme.sh 的依賴項主要是 netcat(nc),我們通過以下命令來安裝這些依賴項,然後重新安裝一遍 acme.sh:

sudo apt-get -y install netcat
1.2.2. 使用 acme.sh 生成證書

證書生成
執行以下命令生成證書:

以下的命令會臨時監聽 80 端口,請確保執行該命令前 80 端口沒有使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ sudo ~/.acme.sh/acme.sh --issue -d mydomain.me --standalone -k ec-256
[Fri Dec 30 08:59:12 HKT 2016] Standalone mode.
[Fri Dec 30 08:59:12 HKT 2016] Single domain='mydomain.me'
[Fri Dec 30 08:59:12 HKT 2016] Getting domain auth token for each domain
[Fri Dec 30 08:59:12 HKT 2016] Getting webroot for domain='mydomain.me'
[Fri Dec 30 08:59:12 HKT 2016] _w='no'
[Fri Dec 30 08:59:12 HKT 2016] Getting new-authz for domain='mydomain.me'
[Fri Dec 30 08:59:14 HKT 2016] The new-authz request is ok.
[Fri Dec 30 08:59:14 HKT 2016] mydomain.me is already verified, skip.
[Fri Dec 30 08:59:14 HKT 2016] mydomain.me is already verified, skip http-01.
[Fri Dec 30 08:59:14 HKT 2016] mydomain.me is already verified, skip http-01.
[Fri Dec 30 08:59:14 HKT 2016] Verify finished, start to sign.
[Fri Dec 30 08:59:16 HKT 2016] Cert success.
-----BEGIN CERTIFICATE-----
MIIEMTCCAxmgAwIBAgISA1+gJF5zwUDjNX/6Xzz5fo3lMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjEyMjkyMzU5MDBaFw0x
NzAzMjkyMzU5MDBaMBcxFTATBgNVBAMTDHdlYWtzYW5kLmNvbTBZMBMGByqGSM49
****************************************************************
4p40tm0aMB837XQ9jeAXvXulhVH/7/wWZ8/vkUUvuHSCYHagENiq/3DYj4a85Iw9
+6u1r7atYHJ2VwqSamiyTGDQuhc5wdXIQxY/YQQqkAmn5tLsTZnnOavc4plANT40
zweiG8vcIvMVnnkM0TSz8G1yzv1nOkruN3ozQkLMu6YS7lk/ENBN7DBtYVSmJeU2
VAXE+zgRaP7JFOqK6DrOwhyE2LSgae83Wq/XgXxjfIo1Zmn2UmlE0sbdNKBasnf9
gPUI45eltrjcv8FCSTOUcT7PWCa3
-----END CERTIFICATE-----
[Fri Dec 30 08:59:16 HKT 2016] Your cert is in /root/.acme.sh/mydomain.me_ecc/mydomain.me.cer
[Fri Dec 30 08:59:16 HKT 2016] Your cert key is in /root/.acme.sh/mydomain.me_ecc/mydomain.me.key
[Fri Dec 30 08:59:16 HKT 2016] The intermediate CA cert is in /root/.acme.sh/mydomain.me_ecc/ca.cer
[Fri Dec 30 08:59:16 HKT 2016] And the full chain certs is there: /root/.acme.sh/mydomain.me_ecc/fullchain.cer

-k 表示密鑰長度,後面的值可以是 ec-256 、ec-384、2048、3072、4096、8192,帶有 ec 表示生成的是 ECC 證書,沒有則是 RSA 證書。在安全性上 256 位的 ECC 證書等同於 3072 位的 RSA 證書。

證書更新

由於 Let’s Encrypt 的證書有效期只有 3 個月,因此需要 90 天至少要更新一次證書,acme.sh 腳本會每 60 天自動更新證書。也可以手動更新。

手動更新 ECC 證書,執行:

sudo ~/.acme.sh/acme.sh --renew -d mydomain.com --force --ecc

如果是 RSA 證書則執行:

sudo ~/.acme.sh/acme.sh --renew -d mydomain.com --force

由於本例中將證書生成到 /etc/v2ray/ 文件夾,更新證書之後還得把新證書生成到 /etc/v2ray。

1.2.3. 安裝證書和密鑰

ECC 證書
將證書和密鑰安裝到 /etc/v2ray 中:

sudo ~/.acme.sh/acme.sh --installcert -d mydomain.me --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key --ecc

RSA 證書

sudo ~/.acme.sh/acme.sh --installcert -d mydomain.me --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key

注意:無論什麼情況,密鑰 (即上面的 v2ray.key) 都不能洩漏,如果你不幸洩漏了密鑰,可以使用 acme.sh 將原證書吊銷,再生成新的證書,吊銷方法請自行參考 acme.sh 的手冊

1.3. 配置 V2Ray

1.3.1. 伺服器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"inbound": {
"port": 443, // 建議使用 443 端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",
"alterId": 64
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls", // security 要設置為 tls 才會啟用 TLS
"tlsSettings": {
"certificates": [
{
"certificateFile": "/etc/v2ray/v2ray.crt", // 證書文件
"keyFile": "/etc/v2ray/v2ray.key" // 密鑰文件
}
]
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

1.3.2. 客戶端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"inbound": {
"port": 1080,
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth"
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "mydomain.me", // tls 需要域名,所以這裡應該填自己的域名
"port": 443,
"users": [
{
"id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls" // 客戶端的 security 也要設置為 tls
}
}
}

1.4. 驗證

一般來說,按照以上步驟操作完成,V2Ray 客戶端能夠正常聯網說明 TLS 已經成功啟用。但要是有個可靠的方法來驗證是否正常開啟 TLS 無疑更令人放心。 驗證的方法有很多,我僅介紹一種小白化一點的,便是 Qualys SSL Labs’s SSL Server Test。

注意:使用 Qualys SSL Labs’s SSL Server Test 要求使用 443 端口,意味著你伺服器配置的 inbound.port 應當是 443

打開 Qualys SSL Labs’s SSL Server Test,在 Hostname 中輸入你的域名,點提交,過一會結果就出來了。


WebSocket

WebSocket 的配置其實很簡單,就跟 mKCP 一樣把 network 一改就行了。話不多說,直接上配置。

1.1. 配置
1.1.1. 伺服器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"inbound": {
"port": 16823,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
},
"streamSettings": {
"network":"ws"
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

1.1.2. 客戶端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"inbound": {
"port": 1080,
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth"
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "serveraddr.com",
"port": 16823,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
}
]
},
"streamSettings":{
"network":"ws"
}
}
}

WebSocket+TLS+Web

前文分別提到過 TLS 和 WebSocket 的配置方法,而本文搭配 Web 服務並同時實現 TLS 和 WebSocket。關於 Web 的軟件本文給出了 Nginx 和 Caddy 兩個例子,二選一即可,也可以選用其他的軟件(如 Apache)。

很多新手一接觸 V2Ray 就想搞 WebSocket+TLS+Web 或 WebSocket+TLS+Web+CDN,我就想問 ssh 和 vim/nano 用利索了沒,步子這麼大不怕扯到蛋嗎?使用 Nginx/Caddy 是因為 VPS 已經有 Nginx/Caddy 可以將 V2Ray 稍作隱藏,使用 WebSocket 是因為搭配 Nginx/Caddy 只能用 WebSocket,使用 TLS 是因為可以流量加密,看起來更像 HTTPS。 也許 WebSocket+TLS+Web 的配置組合相對較好,但不意味著這樣的配置適合任何人。因為本節涉及 Nginx 和 Caddy,只給出了配置示例而不講具體使用方法,也就是說你在閱讀本節內容前得會使用這兩個軟件的其中之一,如果你還不會,請自行 Google。

注意: V2Ray 的 Websocket+TLS 配置組合並不依賴 Nginx 或 Caddy,只是能與其搭配使用而已,沒有它們也可以正常使用。

1.1. 配置
這次 TLS 的配置將寫入 Nginx 或者 Caddy 配置中,由這些軟件來監聽 443 端口,然後將其轉發到 V2Ray 的 WebSocket 所監聽的內網端口,V2Ray 伺服器端不需要配置 TLS。

1.1.1. 伺服器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"inbound": {
"port": 10000,
"listen":"127.0.0.1",//只監聽 127.0.0.1,避免除本機外的機器探測到開放了 10000 端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/ray"
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

1.1.2. Nginx 配置
配置中使用的是域名和證書使用 TLS 小節的舉例,請替換成自己的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/v2ray/v2ray.crt;
ssl_certificate_key /etc/v2ray/v2ray.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name mydomain.me;
location /ray {
proxy_redirect off;
proxy_pass http://127.0.0.1:10000;#假設WebSocket監聽在環回位址的10000端口上
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}

1.1.3. Caddy 配置
因為 Caddy 會自動申請證書並自動更新,所以使用 Caddy 不用指定證書、密鑰。

1
2
3
4
5
6
7
8
mydomain.me
{
log ./caddy.log
proxy /ray localhost:10000 {
websocket
header_upstream -Origin
}
}

1.1.4. 客戶端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"inbound": {
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth",
"udp": false
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "mydomain.me",
"port": 443,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"path": "/ray"
}
}
}
}

1.1.5. 注意事項

  • 較低版本的 nginx 的 location 需要寫為 /ray/ 才能正常工作
  • 如果在設置完成之後不能成功使用,可能是由於 SElinux 機制 (如果你是 CentOS 7 的用戶請特別留意 SElinux 這一機制) 阻止了 Nginx 轉發向內網的資料。如果是這樣的話,在 V2Ray 的日誌裡不會有訪問資訊,在 Nginx 的日誌裡會出現大量的 “Permission Denied” 欄位,要解決這一問題需要在終端下鍵入以下命令:
    setsebool -P httpd_can_network_connect 1
  • 請保持伺服器和客戶端的 wsSettings 嚴格一致,對於 V2Ray,/ray 和 /ray/ 是不一樣的

1.1.6. 其他的話

  1. 開啟了 TLS 之後 path 參數是被加密的,GFW 看不到;
  2. 主動探測一個 path 產生 Bad request 不能證明是 V2Ray;
  3. 不安全的因素在於人,自己的問題就不要甩鍋,哪怕我把示例中的 path 改成一個 UUID,依然有不少人原封不動地 COPY;
  4. 使用 Header 分流並不比 path 安全, 不要迷信。

HTTP/2

簡單地說 HTTP/2 是 HTTP/1.1 的升級版(目前大多數網頁還是 HTTP/1.1),點擊這裡可以直觀地體會到 HTTP/2 相比於 HTTP/1.1 的提升(不代表 V2Ray 中 HTTP/2 相對於 TCP 的提升就是這樣的)。

在 V2Ray 的手冊中並沒有 HTTP/2 的相關內容,而且 V2Ray 的 HTTP/2 還處於測試階段。

1.1. 配置
最近幾版的 V2Ray 已經開始支援 HTTP/2,可能 v3.12 就支援了,實測 v3.14 能夠使用 HTTP/2 了。與其他的傳輸層協定一樣在 streamSettings 中配置。

1.1.1. 伺服器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"inbound": {
"port": 443,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
},
"streamSettings": {
"network": "h2", // h2 也可寫成 http,效果一樣
"httpSettings": { //此項是關於 HTTP/2 的設置
"path": "/ray"
},
"security": "tls", // 配置tls
"tlsSettings": {
"certificates": [
{
"certificateFile": "/etc/v2ray/v2ray.crt", // 證書文件,詳見 tls 小節
"keyFile": "/etc/v2ray/v2ray.key" // 密鑰文件
}
]
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

1.1.2. 客戶端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"inbound": {
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth",
"udp": false
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "mydomain.me",
"port": 443,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "h2",
"httpSettings": { //此項是關於 HTTP/2 的設置
"path": "/ray"
},
"security": "tls"
}
}
}


不推薦的配置

也許有一部分朋友發現了,高級篇的內容關於傳輸層的,各種配置的組合,可以搭配出非常多的配置。但是,有一些組合是我認為不值得或者是冗餘的(僅代表個人意見),以下給出。

  • TLS+KCP
    這是相當一部分人喜歡的組合,不推薦的原因是 vmess 本身的加密方式已經足夠,加 TLS 只是多消耗設備算力,尤其是移動設備,TLS 也不在最外層,已經失去大部分人使用 TLS 的初衷。

  • TLS+HTTP 偽裝
    這並沒有什麼卵用,這樣的組合不是 HTTPS。

  • 單純使用 Websocket
    理論上,使用 Websocket 會比 TCP 性能差一些,所以如果不是搭配 CDN、nginx 或者在 PaaS 上使用,那還是使用 TCP 吧。


透明代理

透明代理是什麼意思請自行 Google,在這兒指使用 V2Ray 做透明代理實現路由器翻牆。然而,我個人認為路由器翻牆的說法並不準確,應該叫閘道翻牆。所以本例實際上是關於閘道翻牆的內容。當然了,單純使用路由器翻牆也是可以的,因為普通的家用路由器本就是一個閘道。使用閘道翻牆可以使局域網內的所有設備都具有直接翻牆的能力,並且能夠全局代理,而不必每台設備都安裝 V2Ray,配置更新時只需在閘道修改配置,用一些網友的話說就是就感覺沒有牆一樣。但是,有意上透明代理的同學請評估一下透明代理是否合適自己,而不要盲目跟風。

透明代理適用於以下情況:

  • 局域網設備較多,比如說辦公室、實驗室、子孫滿堂的家庭等;
  • 設備 (的軟件) 無法 / 不方便設置代理,比如說 chromecast、電視盒子等;
  • 希望設備的所有軟件都走代理。
    不適用於:

  • 隨便拿個垃圾路由器就想上的

1.1. 優點
其實,V2Ray 早就可以作透明代理,當時我也研究了好一段時間,最終是折騰出來了。但是由於 DNS 的問題,我用著總感覺不太舒服。雖然有 ChinaDNS 這類的解決方案,但個人主觀上並不喜歡。 不過嘛,現在就不一樣了。就目前來說,使用 V2Ray 透明代理:

  1. 解決了牆外 DNS 污染問題;
  2. 在解決了 1 的情況下國內域名的即能夠解析到國內 CDN;
  3. 不需要外部軟件或自建 DNS 就可決絕 1 和 2 的問題,只要系統支援 V2Ray 和 iptables;
  4. 能夠完美利用 V2Ray 強大而靈活的路由功能,而不必額外維護一個路由表;

1.2. 軟硬體準備

  • 一台已經搭建 V2Ray 並能正常使用的 VPS ,本文假設 IP 為 110.231.43.65;
  • 一台帶 iptables、有 root 權限並且系統為 Linux 的設備,假設位址為 192.168.1.22,已經配置好 V2Ray 作為客戶端。這個設備可以是路由器、開發板、個人電腦、虛擬機和 Android 設備等,更具普適性地稱之為閘道。我個人非常不建議使用 MT7620 系路由器開透明代理,性能太差了,很多固件也沒有開啟 FPU 。要是真不願意出這點錢,用電腦開個虛擬機吧 (我就是這麼幹的),VirtualBox、Hyper 之類的都可以,但是別忘了網路模式用網橋。

1.3. 設置步驟

設置步驟如下,假設使用 root。

  1. 閘道開啟 IP 轉發。在 /etc/sysctl.conf 文件添加一行 net.ipv4.ip_forward=1 ,執行下列命令生效:
    sysctl -p

  2. 路由器 DHCP 設定閘道位址為閘道設備的 IP,本例為 192.168.1.22,或者電腦手機等設備單獨設置閘道位址,但閘道設備必須指定閘道位址為路由器的 IP,然後電腦 / 手機測試是不是可以正常上網 (這時還不能翻牆),如果不能上網先去學習一個把這個搞定,否則接下來再怎麼也同樣上不了網。

  3. 在伺服器和閘道安裝 V2Ray(如果不會就參照前面的教程,由於 GFW 會惡化 GitHub Releases 的流量,閘道直接運行腳本幾乎無法安裝,建議從 https://v2ray.com/download 下載然後使用 –local 參數進行安裝),並配置好配置文件。一定要確定搭建的 V2Ray 能夠正常使用。在閘道執行 curl -x socks5://127.0.0.1:1080 google.com測試配置的 V2Ray 是否可以翻牆 (命令中 socks5 指 inbound 為 socks,1080 指該 inbound 端口是 1080)。如果出現類似下面的輸出則可以翻牆,如果沒有出現就說明翻不了,你得仔細檢查以下哪步操作不對或漏了。

1
2
3
4
5
6
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

在閘道的配置,添加 dokodemo ,並開啟 domain override(注意不要寫錯配置)。配置形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"inbound": {...},
"outbound": {...},
"inboundDetour": [
{
"domainOverride": ["tls","http"],
"port": 12345,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true
}
},
...
],
"outboundDetour": [...],
"routing": {...}
}

設定 iptables 規則,命令如下

1
2
3
4
iptables -t nat -N V2RAY
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A PREROUTING -p tcp -j V2RAY

UDP 流量透明代理的 iptables 規則,命令如下

1
2
3
4
5
6
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -N V2RAY_MASK
iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A V2RAY_MASK -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -j V2RAY_MASK
  1. 使用電腦 / 手機直接訪問被牆網站,這時應當可以訪問的(如果不能,你可能得請教大神手把手指導了)。

  2. 寫腳本開機載入上述的 iptables,或者使用第三方軟件 (如 iptables-persistent),否則閘道重啟後 iptables 會失效 (即透明代理會失效)。

1.4. 注意事項

  • 在上面的設置中,假設訪問了國外網站,如 Google 等,閘道依然會使用的系統 DNS 進行查詢,只不過返回的結果是污染過的,而 V2Ray 提供的 domain override 能夠從流量中提取域名資訊交由 VPS 解析。也就是說,每次打算訪問被牆的網站,DNS 提供商都知道,鑑於國內企業尿性,也許 GFW 也都知道,會不會將這些資料收集喂 AI 也未可知。解決辦法是建一個 DNS,不向上級查詢,直接返回一個錯誤的 IP,反正 V2Ray 能夠解決污染問題。如果有朋友知道有什麼這樣的軟件,請告之 (可以使用 dnsmasq 實現)。
  • domain override 目前只能從 TLS 和 HTTP 流量中提取域名,如果上網流量有非這兩種類型的慎用 domain override 解決 DNS 污染。
  • 由於對 iptables 不熟,我省略掉了對 UDP 流量的透明代理的設置,請精通此道的朋友補充一下 (目前 V2Ray 對 UDP 透明代理的實現有些問題,網路流量有大量 UDP 的網友請慎用)。
  • V2Ray 只能代理 TCP/UDP 的流量,ICMP 不支援,即就算透明代理成功了之後 ping Google 這類網站也是不通的。
  • 最好設定閘道的位址為靜態 IP,否則閘道重啟後換了 IP 上不了網會很尷尬
  • 上述的 iptables 配置只能使局域網內的其他設備翻牆,閘道本身是無法翻牆的,如果要閘道也能翻牆,要使用 iptables 的 owener 模組直連 V2Ray 發出的流量,然後執行 iptables -t nat -A OUTPUT -p tcp -j V2RAY。
  • 按照網上的透明代理教程,設置 iptables 肯定要 RETURN 127.0.0.0/8 這類私有位址,但我個人觀點是放到 V2Ray 的路由裡好一些。

Docker 部署 V2Ray

Docker 技術是一種新的虛擬化技術,和傳統的虛擬化技術不同。V2Ray 同樣提供 Docker 部署方式,並且通過 Docker 來部署 V2Ray 會非常輕鬆高效。

Docker 只能部署在 KVM 或者 XEN 架構的 VPS 中

首先安裝 Docker:

sudo apt-get install -y docker

安裝完 Docker 後我們從 DockerHub 通過搜索找到 V2Ray 官方提供的鏡像, 鏈結在此. 找到拉取鏡像的的命令並複製下來,在網頁右側我們可以看到命令為 docker pull v2ray/official ,我們將其複製下來回到命令行中粘貼並執行:

sudo docker pull v2ray/official

待 V2Ray 的 Docker 鏡像拉取完成後就可以進入下一個部署階段. 在此之前,你需要在 /etc 目錄下新建一個文件夾 v2ray, 並把你的配置寫好後命名為 config.json 放入 v2ray 文件夾內. 待配置文件準備就緒後鍵入以下命令進行部署,部署前請記下配置文件中你所設置的端口號,在部署時需要將其映射到宿主機上. 否則將無法訪問. 此處假設設定的端口號為 8888,需要映射到宿主機的 8888 端口上. 則命令為:

sudo docker run -d --name v2ray -v /etc/v2ray:/etc/v2ray -p 8888:8888 v2ray/official  v2ray -config=/etc/v2ray/config.json

鍵入以上命令後,命令行會出現一串字符,代表容器部署成功,可以立即通過客戶端連接並開始使用了. 如果還不放心,鍵入以下命令來查看容器的運行狀態:

sudo docker container ls

如果看到輸出的結果中有以下欄位代表容器成功運行:

1
2
3
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a7sdo87kdf3 v2ray/official "v2ray -config=/et..." 3 minutes ago Up 3 minutes 0.0.0.0:8888->8888/tcp v2ray

通過以下命令來啟動 V2Ray:

sudo docker container start v2ray

停止 V2Ray:

sudo docker container stop v2ray

重啟 V2Ray:

sudo docker container restart v2ray

查看日誌:

sudo docker container log  v2ray

更新配置後,需要重新部署容器,命令如下:

sudo docker container stop v2ray
sudo docker container rm v2ray
sudo docker run -d --name v2ray -v /etc/v2ray:/etc/v2ray -p 8888:8888 v2ray/official  v2ray -config=/etc/v2ray/config.json

假如你的配置換了端口號,那麼相應的端口映射也要更改,假如你在配置文件中把監聽端口改為了 9999,則’-p’參數應該這樣寫:

-p  9999:9999

假如你想將容器中的端口映射到本機的端口,則命令應該這樣寫

-p 127.0.0.1:端口號:端口號

除非你打算使用 Nginx 來轉發 Websocket 否則不需要映射到本地,直接填寫端口號:端口號的形式即可

另外,如果開啟了動態端口,-p 標記可以多次使用來綁定多個端口. 具體用法是在指令中再加上多個 -p 標記即可。

更新 V2Ray 的 Docker 鏡像:

docker pull v2ray/official

更新完之後,你需要重新部署容器,方法見上。


BBR

需注意此方法無法和 WebSock 轉發併用

作者5
網上限定說記憶體需要 1G 大小,最小也需要 128M,經過我的折騰發現,128M 小記憶體 VPS 有時候並不如意,即使安裝好了 UML 也進不去系統,這就很讓人捉急,但是還好有了 LKL,比 UML 更加的方便,今天的教程就是教大家使用小記憶體 VPS 安裝 LKL+v2ray 體驗極速上網。

開始
首先還是一點,你需要 VPS,本次教程環境是 openvz,如果你沒有,那就可以去買個 KVM 框架的 VPS,免去折騰
推薦 BBR 一鍵安裝 + 小白翻牆教程
服務搭建已經寫在教程中。

本次教程環境
debian8 mini

128M 記憶體 + 20 端口轉發 NET

連接 SSH
Windows 推薦使用 putty 或者 Xshell,這裡不多贅述。

安裝 LKL
wget –no-check-certificate https://github.com/91yun/uml/raw/master/lkl/install.sh && bash install.sh

判斷是否安裝成功

ping 10.0.0.2 如果能 ping 通就說明安裝成功,否則失敗

修改轉發端口
修改 /root/lkl/run.sh ,查找 9000-9999 ,改成你想要的端口段

修改 /root/lkl/haproxy.cfg 查找 9000-9999 ,改成你想要的端口段

重啟 vps

安裝 v2ray
這裡要注意一下,安裝 v2ray 的端口要在 LKL 轉發的端口範圍內,否則安裝 LKL 也無用。


Nginx 安裝

參考78

service httpd stop
yum install epel-release
yum -y install nginx
service nginx start

設定位置

nano /etc/nginx/nginx.conf


mkdir -p /var/www/yourdomain.com/public_html

Let’s create a test index.html in this directory so that we have something to look at when we test the configuration later:

nano /var/www/yourdomain.com/public_html/index.html

All we need is a simple line of text to show that the connection is working:

Hello world!

Close and save the index.html file.

We need to set permissions for this folder so that it can be viewed by the outside world:

chmod 755 /var/www/yourdomain.com/public_html

更改設定檔中的 location / { 為

/var/www/yourdomain.com/public_html


Let’s Encrypt 安裝

參考910
yum install epel-release
yum install certbot
yum -y install yum-utils
yum-config-manager –enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
certbot –nginx
certbot –nginx certonly

certbot renew --dry-run

證書儲存在:
ssl_certificate: /etc/letsencrypt/live/你的網域/fullchain.pem;
ssl_certificate_key: /etc/letsencrypt/live/你的網域/privkey.pem

NGINX SSL/TLS 設定:

可使用 Security/Server Side TLS – MozillaWiki 提供的介面,自動產生 Apache、NGINX HTTP 網頁伺服器的設定檔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@img ~]# vi /etc/nginx/conf.d/default.conf
... 以上省略 ...
server {
# 使用 https 和 http/2 協定
listen 443 ssl http2;
# 上述的 IPv6 方式
listen [::]:443 ssl http2;
# 網站網址
server_name img.yummygo.com.tw;
# 網站根目錄
root /var/nginx/html;
#
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
#
# SSL 憑證證書路徑
ssl_certificate /etc/letsencrypt/live/img.yummygo.com.tw/fullchain.pem;
# 私鑰路徑
ssl_certificate_key /etc/letsencrypt/live/img.yummygo.com.tw/privkey.pem;
# 緩存有效期
ssl_session_timeout 1d;
# 緩存憑證類型和大小
ssl_session_cache shared:SSL:50m;
#
# intermediate configuration. tweak to your needs.
#
# 使用的加密協定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 加密演演算法,越前面的優先級越高
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
# 交握過程使用 Server 的首選加演演算法,這裡使用 Client 為首選
ssl_prefer_server_ciphers on;
#
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
#
# 增加 http header
add_header Strict-Transport-Security max-age=15768000;
}

重新啟動 NGINX:

[root@img ~]# systemctl restart nginx

防火牆設定

設定 firewall 允許 https service(Posr 443):
[root@img ~]# firewall-cmd –permanent –add-service=https –zone=public
[root@img ~]# firewall-cmd –reload

自動續期憑證

Let’s Encrypt 免費 SSL/TLS 憑證有效期僅有三個月,因此設定排程來自動續期:

[root@img ~]# vi /etc/crontab
1
2
# 每月 1 日 03:00 續期憑證,並重啟 Nginx
00 03 1 * * root /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

Proxifier

全局代理


KCP介紹

轉自官方,參考11

KCP 是一個快速可靠協定,能以比 TCP 浪費 10%-20% 的帶寬的代價,換取平均延遲降低 30%-40%,且最大延遲降低三倍的傳輸效果。純演算法實現,並不負責底層協定(如 UDP)的收發。

技術特性
TCP 是為流量設計的(每秒內可以傳輸多少 KB 的資料),講究的是充分利用帶寬。而 KCP 是為流速設計的(單個資料包從一端發送到一端需要多少時間),以 10%-20% 帶寬浪費的代價換取了比 TCP 快 30%-40% 的傳輸速度。TCP 通道是一條流速很慢,但每秒流量很大的大運河,而 KCP 是水流湍急的小激流。KCP 有正常模式和快速模式兩種,通過以下策略達到提高流速的結果:

RTO 翻倍 vs 不翻倍:
TCP 超時計算是 RTOx2,這樣連續丟三次包就變成 RTOx8 了,十分恐怖,而 KCP 啟動快速模式後不 x2,只是 x1.5(實驗證明 1.5 這個值相對比較好),提高了傳輸速度。

選擇性重傳 vs 全部重傳:
TCP 丟包時會全部重傳從丟的那個包開始以後的資料,KCP 是選擇性重傳,只重傳真正丟失的資料包。

快速重傳:
發送端發送了 1,2,3,4,5 幾個包,然後收到遠端的 ACK: 1, 3, 4, 5,當收到 ACK3 時,KCP 知道 2 被跳過 1 次,收到 ACK4 時,知道 2 被跳過了 2 次,此時可以認為 2 號丟失,不用等超時,直接重傳 2 號包,大大改善了丟包時的傳輸速度。

延遲 ACK vs 非延遲 ACK:
TCP 為了充分利用帶寬,延遲發送 ACK(NODELAY 都沒用),這樣超時計算會算出較大 RTT 時間,延長了丟包時的判斷過程。KCP 的 ACK 是否延遲發送可以調節。

UNA vs ACK+UNA:
ARQ 模型回應有兩種,UNA(此編號前所有包已收到,如 TCP)和 ACK(該編號包已收到),光用 UNA 將導致全部重傳,光用 ACK 則丟失成本太高,以往協定都是二選其一,而 KCP 協定中,除去單獨的 ACK 包外,所有包都有 UNA 資訊。

非退讓流控:
KCP 正常模式同 TCP 一樣使用公平退讓法則,即發送視窗大小由:發送緩存大小、接收端剩餘接收緩存大小、丟包退讓及慢啟動這四要素決定。但傳送及時性要求很高的小資料時,可選擇通過配置跳過後兩步,僅用前兩項來控制發送頻率。以犧牲部分公平性及帶寬利用率之代價,換取了開著 BT 都能流暢傳輸的效果。


DNS CAA

以後有機會再使用
給你的站點添加 DNS CAA 保護


現用設定

Server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
{
"log" : {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbound": {
"port": 15674,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "---",
"alterId": 64
},
{
"id": "---",
"alterId": 64
},
{
"id": "---",
"alterId": 64
},
{
"id": "---",
"alterId": 64
},
{
"id": "---",
"alterId": 64
},
{
"id": "---",
"alterId": 64
}
]
},
"streamSettings": {
"network": "mkcp",
"kcpSettings": {
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 100,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "none"
}
}
}
},
"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"
}
]
}
}
}
Client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{
"inbound": {
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"domainOverride": ["tls","http"],
"settings": {
"auth": "noauth",
"udp": true
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "---",
"port": 15674,
"users": [
{
"id": "---",
"alterID": 64
}
]
}]
},
"streamSettings": {
"network": "mkcp",
"kcpSettings": {
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 100,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "srtp"
}
}
}
},
"outboundDetour": [{
"protocol": "freedom",
"tag": "direct",
"settings": {}
}],
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "IPOnDemand",
"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": "direct"
}]
}
}
}

記錄:
OpenConnet Server (ocserv) 通過實現 Cisco 的 AnyConnect 協議,用 DTLS 作為主無協議,UPD DTLS 失敗時會轉用 TCP TLS。1
購買 BanwagonHOST VPS 自建 Shadowsocks 記錄

------ THE END ------