V2ray配置Telegram的MTProto协议

前言

V2ray 是继 ShadowSocks 后又一个蓬勃发展、欣欣向荣的代理利器,目前支持多种传输协议。现在可以使用它设置 MTProto 协议,搭建 Telegram 的内部代理服务器,实现无需打开其他突破网络封锁的客户端即可正常通讯的目的。

V2ray 的代理原理

v2ray 的代理原理和配置项的关系如下图:
v2ray原理图及配置关系

p.s.上图为 v2ray v4.0 之前的代理原理图。v2ray v4.1+ 合并了输入输出配置项:

  • inbounds = inbound + inboundDetour
  • outbounds = outbound + outboundDetour
  • 为便于理解,你可以将上图 inboundinboundDetour 视为各种不同的代理方式,全部定义在新版配置文件的 inbounds 配置项中,outbounds 亦同理。

v2ray 的的配置格式都是相同的,理论上不区分客户端和服务端,客户端和服务器通用一种形式,只是实际的配置不一样。v2ray 配置文件的配置项有以下几个部分:

{
"log": {},
"api": {},
"dns": {},
"stats": {},
"routing": {},
"policy": {},
"reverse": {},
"inbounds": [],
"outbounds": [],
"transport": {}
}

我们重点关注其中传入、传出和路由配置,即:inboundsoutboundsrouting

  • inboundsoutbounds 定义多种不同的传入、传出方式。
  • 自定义不同的传入和传出方式,然后用路由(routing)进行绑定,就可以实现定制化代理。

下面举几个栗子:

  1. 仅用来突破网络封锁:客户端 outbounds 设置一个 VMess 协议传出、服务端 inbounds 设置一个 VMess 协议传入,服务端 outbounds 设置一个 freedom 方式传出。这样,客户端与服务端将使用 VMess 协议加密流量突破网络封锁,而服务端访问被封锁网站没有特殊加密,使用正常网络传输协议。
  2. 服务端配置其他的传入、传出协议实现不同于的传输需求。比如服务端添加一组 MTProto 协议对应的传入、传出方式,即可以使用 Telegram 内部代理。或者使用 shadowsocks 协议传入,再用 vmess 协议传出给下一个服务端,实现多级代理等等。
  3. 多种传入、传出方式可以共存,打上标签(tag)以后,用路由(routing)实现自由绑定,所以仅使用 v2ray 就可实现多种方式的传输需求,比如同时支持 VMess、Shadowsocks、MTProto、Socks 协议进行通讯。v2ray 支持多种协议,发挥你的创造性去使用吧。

MTProto 的配置

v2ray 的官方手册提供了不完整的样例配置

传入代理

"inbounds": [
{
"tag": "tg-in",
"port": 443,
"protocol": "mtproto",
"settings": {
"users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
}
}
]

传出代理:

"outbounds": [
{
"tag": "tg-out",
"protocol": "mtproto",
"settings": {}
}
]

路由:

"routing": {
"rules": [
{
"type": "field",
"inboundTag": [
"tg-in"
],
"outboundTag": "tg-out"
}
]
}

配置文件示例

这里提供一个主要使用 VMess 协议突破网络封锁,额外支持 MTProto 协议实现 Telegram 内部代理的配置文件,其中:

  • 服务端设置的端口务必加入服务器防火墙例外,否则可能无法正常连接
  • UUID 可以在 Online UUID Generator 网站生成
  • 用户密钥可以使用命令 openssl rand -hex 16 生成

服务端配置

{
"inbounds": [
{
"port": 填写 VMess 协议监听端口,
,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "填写UUID,不要去掉引号",
"level": 1,
"alterId": 64
}
]
}
},
{
"tag": "tg-in",
"listen": "0.0.0.0",
"port": 填写 MTProto 协议监听端口,
"protocol": "mtproto",
"settings": {
"users": [
{
"secret": "填写用户密钥,不要去掉引号"
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
},
{
"tag": "tg-out",
"protocol": "mtproto",
"settings": {}
}
],
"routing": {
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "blocked"
},
{
"type": "field",
"inboundTag": [
"tg-in"
],
"outboundTag": "tg-out"
}
]
}
}

Telegram 内部代理设置

将服务器的 IP 地址、配置的 MTProto 协议监听端口、用户密钥填入 Telegram 的代理设置中即可使用。或者使用构造链接在 Telegram 内部打开进行自动设置:

https://t.me/proxy?server=服务器IP地址&port=服务器MTProto协议监听端口&secret=用户密钥

客户端配置

{
"inbounds": [
{
"port": 1082,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": false,
"ip": "127.0.0.1"
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"users": [
{
"alterId": 64,
"security": "auto",
"id": "填写 UUID 与服务端一致,不要去掉引号"
}
],
"port": 服务端 VMess 协议监听端口,
"address": "服务端 IP 地址,可以去掉引号",
}
]
}
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
],
"routing": {
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
}
]
},
"log": {
"loglevel": "warning"
}
}

参考链接:
v2ray 配置文件格式
让 Telegram 连接 V2ray 服务端 mtproxy 协议