Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

桥接服务器以Shadowsocks入站Vision出站,出现访问受限问题。 #1612

Closed
CwavGuy opened this issue Feb 6, 2023 · 7 comments
Closed

Comments

@CwavGuy
Copy link

CwavGuy commented Feb 6, 2023

简述

最近尝试架设中继/桥接服务器以加速和改善内网访问外网的延迟和线路。结果发现访问体验非但没有改善反而严重下降。分流(从桥接服务器直接访问国内站点)流量体验还算正常。经过代理的流量,网页加载速度非常慢,经常遇到网页的一些内容加载不出来,甚至整个网页打不开。但偶尔一些流媒体加载迅速。经过一系列排查,最终怀疑到桥接服务器SS入站和vision协议出站的代理方式存在未知问题。

使用场景

客户端(Me),桥接服务器(A)和终端服务器(B)的使用场景如下:

{Me} <=====> {(port:23443) A} <=(GFW)=> {(port:24443) B} <=====> (International Internet)
其中,Server A的Inbound是ShadowSocks协议,Outbound是Vision。Server B的Inbound是Vision。A和B都运行Xray-core。

A服务器config.json如下:

// REFERENCE:
// https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/
// 常用的 config 文件,不论服务器端还是客户端,都有 5 个部分。外加小小白解读:
// ┌─ 1*log 日志设置 - 日志写什么,写哪里(出错时有据可查)
// ├─ 2_dns DNS-设置 - DNS 怎么查(防 DNS 污染、防偷窥、避免国内外站匹配到国外服务器等)
// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)
// ├─ 4_inbounds 入站设置 - 什么流量可以流入 Xray
// └─ 5_outbounds 出站设置 - 流出 Xray 的流量往哪里去
{
    // 1\_日志设置
    "log": {
        "loglevel": "error", // 内容从少到多: "none", "error", "warning", "info", "debug"
        "access": "/var/log/xray/access.log", // 访问记录
        "error": "/var/log/xray/error.log" // 错误记录
    },
    // 2_DNS 设置
    "dns": {
        "servers": [
           //"https+local://1.1.1.1/dns-query", // 首选 1.1.1.1 的 DoH 查询,牺牲速度但可防止 ISP 偷窥
            "223.5.5.5",
            "1.1.1.1",
            "localhost"
        ]
    },
    // 3*分流设置
    "routing": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
            // 3.1 通用路由
            // 3.1.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
            {
                "type": "field",
                "ip": ["geoip:private"], // 分流条件:geoip 文件内,名为"private"的规则(本地)
                "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
            },
            // 3.1.2 屏蔽广告
            {
                "type": "field",
                "domain": ["geosite:category-ads-all"], // 分流条件:geosite 文件内,名为"category-ads-all"的规则(各种广告域名)
                "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
            },
            // 3.3 bridge service路由 (桥接到B服务器)
            {
                "type": "field",
                "inboundTag": ["bridge-in-ss"],
                "outboundTag": "bridge-out-vision"
            }
        ]
    },
    // 4*入站设置
    "inbounds": [
        // 4.3 (Bridge Server) ss协议,公网23444入站端口,将来自客户端的流量中继到B服务器。
        {
            "tag": "bridge-in-ss",
            "port": 23443,
            "protocol": "shadowsocks",
            "settings": {
                "method": "2022-blake3-aes-128-gcm",
                "password": "77HQS+ZKlkK2/PVEVfvgTQ==",
                "level": 0,
                "email": "bridge@t.tt",
                "network": "udp,tcp"
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            }
        }
    ],
    // 5*出站设置
    "outbounds": [
        // 默认出站配置
        // 5.1 第一个出站是默认规则,freedom 就是对外直连(vps 已经是外网,所以直连)
        {
            "tag": "direct",
            "protocol": "freedom"
        },
        // 5.2 屏蔽规则,blackhole 协议就是把流量导入到黑洞里(屏蔽)
        {
            "tag": "block",
            "protocol": "blackhole"
        },
        // bridge流量代理出站配置
        // 5.4 (Bridge Client) Vless Vision协议,将流量中继到B服务器。
        {
            "tag": "bridge-out-vision",
            "protocol": "vless",
            "settings": {
                "vnext": [
                {
                    "address": "172.20.0.13", // B机器的IP(docker example)
                    "port": 24443, // VPS的端口
                    "users": [
                    {
                        "id": "UUID", // 和服务器端的一致
                        "flow": "xtls-rprx-vision",
                        "alterId": 0,
                        "security": "auto",
                        "encryption": "none",
                        "level": 1
                    }
                    ]
                }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                "serverName": "test.domain.com", // 替换成你的真实域名
                "allowInsecure": false, // 禁止不安全证书
                "fingerprint": "chrome" // 通过 uTLS 库 模拟 Chrome / Firefox / Safari 或随机生成的指纹
                },
                "sockopt": {
                    "tcpFastOpen": true
                }
            }
        }
    ],
    // 6*Handshake时间限制不要太短,容易断联
    "policy": {
        "levels": {
            "0": {
                "handshake": 6,
                "connIdle": 120
            },
            "1": {
                "handshake": 8,
                "connIdle": 120
            }
        }
    }
}


B服务器config.json如下:

// REFERENCE:
// https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/
// 常用的 config 文件,不论服务器端还是客户端,都有 5 个部分。外加小小白解读:
// ┌─ 1*log 日志设置 - 日志写什么,写哪里(出错时有据可查)
// ├─ 2_dns DNS-设置 - DNS 怎么查(防 DNS 污染、防偷窥、避免国内外站匹配到国外服务器等)
// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)
// ├─ 4_inbounds 入站设置 - 什么流量可以流入 Xray
// └─ 5_outbounds 出站设置 - 流出 Xray 的流量往哪里去
{
    // 1\_日志设置
    "log": {
        "loglevel": "error", // 内容从少到多: "none", "error", "warning", "info", "debug"
        "access": "/var/log/xray/access.log", // 访问记录
        "error": "/var/log/xray/error.log" // 错误记录
    },
    // 2_DNS 设置
    "dns": {
        "servers": [
            "1.1.1.1" ,
            "localhost"
        ]
    },
    // 3*分流设置
    "routing": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
            // 3.1 通用路由
            // 3.1.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
            {
                "type": "field",
                "ip": ["geoip:private"], // 分流条件:geoip 文件内,名为"private"的规则(本地)
                "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
            },
            // 3.1.4 屏蔽广告
            {
                "type": "field",
                "domain": ["geosite:category-ads-all"], // 分流条件:geosite 文件内,名为"category-ads-all"的规则(各种广告域名)
                "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
            }
        ]
    },
    // 4*入站设置
    "inbounds": [
        // 4.1 (End Server) Vless Vision协议,公网24443入站端口,代理服务器终端
        {
            "tag": "end-vision",
            "port": 24443,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "UUID", // 填写你的 UUID
                        "flow": "xtls-rprx-vision",
                        "level": 0,
                        "email": "bridge@t.tt"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    //"rejectUnknownSni": false,
                    //"minVersion": "1.3",
                    // "alpn": "http/1.1",
                    "certificates": [
                        { // Cert
                            "certificateFile": "/var/cert/test_domain_com/cert.pem",
                            "keyFile": "/var/cert/test_domain_com/privkey.key"
                        }
                    ]
                },
                "sockopt": {
                    "tcpFastOpen": true
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            }
        }
    ],
    // 5*出站设置
    "outbounds": [
        // 5.1 第一个出站是默认规则,freedom 就是对外直连(vps 已经是外网,所以直连)
        {
            "tag": "direct",
            "protocol": "freedom"
        },
        // 5.2 屏蔽规则,blackhole 协议就是把流量导入到黑洞里(屏蔽)
        {
            "tag": "block",
            "protocol": "blackhole"
        }
    ],
    // 6*Handshake时间限制不要太短,容易断联
    "policy": {
        "levels": {
            "0": {
                "handshake": 8,
                "connIdle": 120
            }
        }
    }
}


详细问题描述

长话短说,我试过:

  1. 我使用Vision直连B端Xray代理,访问外网:访问正常,网页所有元素都可正常加载。

  2. 我使用SS连接A端,访问国内网站:访问正常;访问外网:访问受阻,部分元素无法加载,部分网站无法建立连接。

  3. 更换A端Inbound为裸socks5配置,客户端使用socks连接A端,访问国内网站:访问正常;访问外网:访问正常。

  4. 更换A端Inbound为vless+tcp,客户端连接A端,访问国内网站:访问正常;访问外网:访问正常,但延迟相比项目3加大。

  5. 更换A端Inbound为vless+tcp+tls,客户端连接A端,访问国内网站:访问正常;访问外网:访问正常,但延迟相比项目4加大。

  6. 更换A端Inbound为vless vision,客户端连接A端,访问国内网站:访问正常;访问外网:访问正常,延迟和项目4差不多。

  7. 转移A服务器到另一国内服务器,重复以上测试,结果不变。

  8. 最后,在电报dalao的建议下,我在一台国内服务器上,同时开了两个Xray docker实例,一个作A Bridge Server,一个作B End Server。也就是说,A和B之间在物理上是本地连接,理论上不存在A和B之间线路问题。客户端连接A端,访问被分流网站,访问正常;访问被代理网站,访问受阻。

至此我怀疑,Xray在作为桥接服务器时,Inbound为Shadowsocks,Outbound为Vision时,可能存在一些数据耦合(不知道能不能这么表达,网络基础并不高)的问题。有什么办法可以较好地处理中转流量?我也是一路摸索到这步的,因为文档配置方法里面关于桥接模式的描述并不多。

@chika0801
Copy link
Contributor

你的VPS A是在国内吧?(没看你明说)

看了下A和B的配置,有个可疑点,建议你把 A和B里面关于这个参数删了测试下

                "sockopt": {
                    "tcpFastOpen": true
                }

@CwavGuy
Copy link
Author

CwavGuy commented Feb 6, 2023

你的VPS A是在国内吧?(没看你明说)

看了下A和B的配置,有个可疑点,建议你把 A和B里面关于这个参数删了测试下

                "sockopt": {
                    "tcpFastOpen": true
                }

已删除相关字眼,情况没有改善。

@RPRX
Copy link
Member

RPRX commented Feb 6, 2023

看来好多人还不知道代码里 Vision 只支持纯净入站或另一个 Vision 入站,当然要改也是不难的

@chika0801
Copy link
Contributor

看来好多人还不知道代码里 Vision 只支持纯净入站或另一个 Vision 入站,当然要改也是不难的

原来如此

建议你的国内vps a,入站开vision就行了,你试试了

@RPRX
Copy link
Member

RPRX commented Feb 6, 2023

其实我早就看到了这个问题 #1500只是不想改
因为根据历史,机场会用 SS 或 VMess 中转 XTLS 出墙,XTLS 把苦力活全干了,还给 GFW 喂了大量数据,却对社区没有任何帮助
我觉得这样并不好,所以我不会去改它,当然 PR is acceptable

@CwavGuy
Copy link
Author

CwavGuy commented Feb 6, 2023

明白,那我自己再试试吧。感谢!

@CwavGuy CwavGuy closed this as completed Feb 6, 2023
@ghost
Copy link

ghost commented Feb 6, 2023

inbound 和 outbound 都新增 http 协议
inbound 的 http 送真实出站协议
outbound 的 http 送 inbound 的 http,桥接作用
真实入站协议送 outbound 的 http
分流之后应该可行

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants