v2ray介紹
參考這兩篇
第二篇適合小白,從未接觸過v2ray,第一篇適合玩會一點v2ray, 想了解更多。
自己的文章記錄自己實踐過程,主要內容:
- 下載安裝及基本配置
- 路由功能區別內外流量
- DNS按需解析
- 相容酸酸乳
- websocket
- 流量統計
下載安裝
wget https://install.direct/go.sh sudo bash go.sh
或者直接去https://github.com/v2ray/v2ray-core/releases 下載
(直接下載的,要把v2ray及v2ctl增加執行許可權,不然會出現permission denied
)
兩種方式差不多,指令碼的方式把v2ray安裝成服務。配置檔案在/etc/v2ray目錄下
測試配置檔案是否有效:
v2ray -test -config /etc/v2ray/config.json
啟動:
sudo systemctl start v2ray
其中uuid是自動生成,可以用命令uuidgen
生成
基本的配置
伺服器與客戶端都是同一套軟體,只是應用的配置不同
服務端的最小化配置
{ "inbounds": [ { "port": 1234, "protocol": "vmess", "settings": { "clients": [ { "id": "7d66acdb-5491-4d0e-a894-024bdcbd8e28", "level": 1, "alterId": 64 }] } }], "outbounds": [ { "protocol": "freedom", "settings": {} }] }
客戶端的最小化配置
{ "inbounds": [ { "port": 1087, "protocol": "socks" }], "outbounds": [ { "protocol": "vmess", "settings": { "vnext": [ { "address": "serverip", "port": 1234, "users": [ { "id": "7d66acdb-5491-4d0e-a894-024bdcbd8e28", "alterId": 64 }] }] } }] }
解釋
這只是一個最小的化的配置,幫助理解這其中的通訊過程。
-
每個節點(客戶端,或者服務端)都最小有一個
inbound
和一個outbound
- 資料流量從inbound進,從outbound出,配置中指定了inbound和outbound的進出協議。
-
vmess
是v2ray自定義的協議,freedom
是什麼都不幹,直接交付的協議,socks
就是普通的socks代理協議 - 瀏覽器–(socks)–>v2ray客戶端的inbound—->v2ray客戶端的outbound–(vmess)–>v2ary服務端的inbound–>v2ary服務端的outbound–(freedom)–>目標站點
- v2ray客戶端要與v2ary服務端達成協議,需要統一id及埠,id是由uuid生成的。
-
如果配置中出現未知錯誤,可以把日誌開啟
"log": { "access": "log/access.log", "error": "log/error.log", "loglevel": "info" }
協議列表
- Blackhole 它會阻礙所有資料的出站,配合路由(Routing)一起使用,可以達到禁止訪問某些網站的效果
- Dokodemo-door (任意門)是一個入站資料協議,它可以監聽一個本地埠,並把所有進入此埠的資料傳送至指定伺服器的一個埠,從而達到埠對映的效果。
- Freedom是一個出站協議,可以用來向任意網路傳送(正常的) TCP 或 UDP 資料。
- HTTP 是一個入站資料協議,相容 HTTP 1.x 代理。
- MTProto 是一個 Telegram 專用的代理協議
- Shadowsocks 包含入站和出站兩部分,相容大部分其它版本的實現
- Socks 標準 Socks 協議實現,相容 Socks 4、Socks 4a 和 Socks 5
- VMess 是一個加密傳輸協議,依賴於系統時間
路由功能
上面只是一個簡單的加密代理功能,在它的基礎之上再增加配置,可以增加更多實用的功能。
考慮到場景:
- 瀏覽器在代理的時候,不希望把本地的地址如192.168.2.x的請求也轉發到遠端伺服器。
- 瀏覽器在代理的時候,不希望把國內的域名站點的請求轉發到遠端伺服器。
在這裡就需要根據ip/域名,把不同的流量轉發到不同的出口。v2ray就提供這樣的功能。
(其它的代理軟體一般是用pac方式)
要根據ip/域名轉發,首先要解析出當前流量的ip/域名。
需要在inbounds中開啟sniffing嗅探。
"inbounds": [ { "port": 1085, "listen": "127.0.0.1", "protocol": "socks", "sniffing": { "enabled": true, "destOverride": ["http", "tls"] } } ],
在outbounds中再增加幾個出口,新增標籤,供路由選擇。
{ "protocol": "freedom", "settings": {}, "tag": "direct" }, { "protocol": "blackhole", "settings": {}, "tag": "blocked" }
增加路由配置
"routing": { "domainStrategy": "IPOnDemand", "rules": [ { "type": "field", "ip": ["geoip:private", "geoip:cn"], "outboundTag": "direct" }, { "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" }, { "type": "field", "domain": ["geosite:category-ads"], "outboundTag": "blocked" }] },
上面配置的含義是
*ip在geoip:private(私有網段)及geoip:cn(中國網段),進行直聯。
- 域名在geosite:cn(國內常用域名),進行直聯
- 域名在geosite:category-ads(常見的廣告域名),進行攔截
- 沒有匹配到的域名與ip,就預設走outbounds中的第一項,就是vmess協議。
這樣就實現國內外流量的分流。可以認為是白名單走國內。其它走代理。
這裡只對客戶端進行配置。
domainStrategy 域名解析策略
目前只有三個可以取的值。”AsIs” | “IPIfNonMatch” | “IPOnDemand”
- “AsIs”: 只使用域名進行路由選擇。預設值。
-
“IPIfNonMatch”: 當域名沒有匹配任何規則時,將域名解析成 IP(A 記錄或 AAAA 記錄)再次進行匹配;
- 當一個域名有多個 A 記錄時,會嘗試匹配所有的 A 記錄,直到其中一個與某個規則匹配為止;
- 解析後的 IP 僅在路由選擇時起作用,轉發的資料包中依然使用原始域名;
- “IPOnDemand”: 當匹配時碰到任何基於 IP 的規則,將域名立即解析為 IP 進行匹配;
關於DNS的配置
"dns":{ "servers":[ { "address":"114.114.114.114", "port":53, "domains":[ "geosite:cn" ] }, "1.1.1.1", "8.8.8.8", "localhost" ] }
這裡的配置是讓geosite:cn中的域名,使用114進行解析。別的域名使用1.1.1.1進行解析。
因為1.1.1.1所屬ip不在cn中,根據路由規則,直接使用預設代理。相關的dns解析會到遠端伺服器上。
驗證工具 curl
socks5h會使用代理伺服器的dns,而socks5會使用本地的dns。會存在被汙染的可能。
curl -x socks5h://127.0.0.1:1087 www.google.com
如何驗證上面的dns是按相應的規則進行解析
首先把服務端及客戶端log的級別開啟到debug。
如果是國內域名,可能會出現如下日誌。
[Debug] v2ray.com/core/app/dns: querying DNS for: xx.example.com.
[Debug] v2ray.com/core/transport/internet/udp: dispatch request to: udp:114.114.114.114:53
如果是國外域名,客戶端可能出現如下日誌。
[Debug] v2ray.com/core/app/dns: updating IP records for domain:xx.example.com
服務端:accepted udp:1.1.1.1:53
相容酸酸乳
把預設的outbound替換下協議
{ "protocol": "shadowsocks", "settings": { "servers": [ { "address": "server.com", "method": "chacha20", "ota": false, "password": "password", "port": 1234 } ] } },
以閘道器方式做透明代理
-
風關機開啟ip轉發,編輯/etc/sysctl.conf新增一行net.ipv4.ip_forward1。再執行
sysctl -p
使之生校。 - 讓區域網的機器的閘道器ip指向閘道器機
- 閘道器機配置好 v2ray
-
新增v2ray配置
{ "routing": {...}, "inbounds": [ { ... }, { "port": 12345, //開放的埠號 "protocol": "dokodemo-door", "settings": { "network": "tcp,udp", "followRedirect": true // 這裡要為 true 才能接受來自 iptables 的流量 }, "sniffing": { "enabled": true, "destOverride": ["http", "tls"] } } ], "outbounds": [ { ... "streamSettings": { ... "sockopt": { "mark": 255//這裡是 SO_MARK,用於 iptables 識別,每個 outbound 都要配置;255可以改成其他數值,但要與下面的 iptables 規則對應;如果有多個 outbound,最好獎所有 outbound 的 SO_MARK 都設定成一樣的數值 } } } ... ] }
-
設定tcp透明代理的iptables規則
iptables -t nat -N V2RAY # 新建一個名為 V2RAY 的鏈 iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN # 直連 192.168.0.0/16 iptables -t nat -A V2RAY -p tcp -j RETURN -m mark --mark 0xff # 直連 SO_MARK 為 0xff 的流量(0xff 是 16 進位制數,數值上等同與上面配置的 255),此規則目的是避免代理本機(閘道器)流量出現迴環問題 iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345 # 其餘流量轉發到 12345 埠(即 V2Ray) iptables -t nat -A PREROUTING -p tcp -j V2RAY # 對區域網其他裝置進行透明代理 iptables -t nat -A OUTPUT -p tcp -j V2RAY # 對本機進行透明代理
-
設定udp透明代理的iptables規則
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
注意事項且
上面的設定,如果訪問國外的網站,依舊會使用系統的dns進行查詢。可能有些網站會補汙染。所以需要自己在客戶端使用指定dns。這一步也可以由dhcp伺服器來處理。
websocket方式
流量統計
grpc來獲取
附錄配置
這是用指令碼安裝後,伺服器預設配置:
{ "inbounds": [{ "port": 14321, "protocol": "vmess", "settings": { "clients": [ { "id": "7d66acdb-5491-4d0e-a894-024bdcbd8e28", "level": 1, "alterId": 64 } ] } }], "outbounds": [{ "protocol": "freedom", "settings": {} },{ "protocol": "blackhole", "settings": {}, "tag": "blocked" }], "routing": { "rules": [ { "type": "field", "ip": ["geoip:private"], "outboundTag": "blocked" } ] } }
客戶端的配置:
{ "inbounds": [ { "port": 1080, "protocol": "socks", "sniffing": { "enabled": true, "destOverride": ["http", "tls"] }, "settings": { "auth": "noauth" } }], "outbounds": [ { "protocol": "vmess", "settings": { "vnext": [ { "address": "serveraddr.com", "port": 16823, "users": [ { "id": "b831381d-6324-4d53-ad4f-8cda48b30811", "alterId": 64 }] }] } }] }