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

[Feature] 支持 HOST IP 作为出站代理 #1661

Open
3 tasks done
pspmoe opened this issue Nov 19, 2024 · 5 comments
Open
3 tasks done

[Feature] 支持 HOST IP 作为出站代理 #1661

pspmoe opened this issue Nov 19, 2024 · 5 comments
Labels
enhancement New feature or request

Comments

@pspmoe
Copy link

pspmoe commented Nov 19, 2024

验证步骤

  • 我已经阅读了 文档,确认了该功能没有实现
  • 我已在 Issue Tracker 中寻找过我要提出的功能请求,并且没有找到
  • 我是中文用户,而非其他语言用户

描述

通过反向代理服务器可以绕过防火墙访问 Steam、Pixiv、Twitch 等网站,原理为隐藏 SNI

示例:

基于浏览器:https://www.youtube.com/watch?v=kbpxGOKVBSA

基于反向代理服务器:

Caddyfile

{
    local_certs
    ocsp_stapling off
    pki {
        ca {
            # only available after caddy v2.6.3
            intermediate_lifetime 1800d
        }
    }
}

(sign) {
    tls {
        issuer internal {
            lifetime 360d
        }
        # on_demand
    }
}

(rev) {
    lb_policy round_robin
    transport http {
        tls
        tls_insecure_skip_verify
    }
}

# Steam Start
https://steamcommunity.com, https://www.steamcommunity.com, https://cdn.steamcommunity.com, https://store.steampowered.com, https://api.steampowered.com, https://checkout.steampowered.com {
    import sign
    reverse_proxy * https://steamuserimages-a.akamaihd.net.edgesuite.net https://steamstore-a.akamaihd.net.edgesuite.net https://eaassets-a.akamaihd.net.edgesuite.net https://steamcommunity-a.akamaihd.net.edgesuite.net {
        import rev
        fail_duration 10s
        health_timeout 30s
    }
}
# Steam End

# Github Start
https://docs.github.com, https://github.io, https://*.github.io, https://githubusercontent.com, https://*.githubusercontent.com {
    import sign
    reverse_proxy * https://github.map.fastly.net {
        import rev
    }
}

https://gist.github.com, https://github.com {
    import sign
    reverse_proxy * https://140.82.113.3 https://140.82.113.4 https://20.205.243.166 https://20.27.177.113 {
        import rev
    }
}

https://*.github.com {
    import sign
    reverse_proxy * https://140.82.114.5 https://140.82.114.6 https://20.205.243.168 https://20.207.73.85 {
        import rev
    }
}

https://github {
    import sign
    reverse_proxy * https://140.82.113.3 https://140.82.113.4 https://20.205.243.166 https://20.27.177.113 {
        import rev
        header_up Host github.com
    }
}
# Github End

# Common Start
:80 {
    redir https://{host}{uri} temporary
}
# Common End

使用此 Caddy 配置文件可开启本地反代服务器,在 hosts 中将对应域名指向 127.0.0.1 即可成功访问

此方法可使用本机 IP 访问目标网站,有以下优点:

  1. 不容易出现人机验证、IP 封锁、IP 访问频繁限制等
  2. 使目标网站正确识别区域,避免分配错误的 CDN 服务器,比如使用代理后 Steam 会分配其他国家的下载服务器,速度受限
  3. 节省机场流量

但此方法与代理软件配合起来并不方便,以 Steam 举例,正常使用流程:

  1. 启用反代服务器
  2. 在 hosts 中将 Steam 域名指向 127.0.0.1
  3. 在 Mihomo 中设置启用系统 hosts 并将 Steam 域名设为 DIRECT

由于此方法速度较慢且不太稳定,当我们希望快速访问 Steam 时,则需要手动移除 hosts 中的 Steam 域名,域名较多时切换起来比较麻烦

而如果 Mihomo 支持将 HOST IP 设为出站代理,则可以简化为:

  1. 启用反代服务器
  2. 在 Mihomo 中建立 HOST 出站代理 A,指向 127.0.0.1(也可以是其它局域网 IP,比如将反代服务器运行到软路由上)
  3. 为 Steam 域名设置策略组,指向 DIRECT / A / 选择节点

后续切换只需要在 GUI 中选择即可,无需修改配置文件与 hosts 文件

@pspmoe pspmoe added the enhancement New feature or request label Nov 19, 2024
@xaotag
Copy link

xaotag commented Nov 19, 2024

画个网络拓看看流量走向,感觉很有趣

@pspmoe
Copy link
Author

pspmoe commented Nov 21, 2024

画个网络拓看看流量走向,感觉很有趣

没学过这个 XD

大致是将请求发给反代服务器,反代服务器抹除/伪造 SNI 后交给目的 IP,然后目的 IP 根据 Header 中的 Host 进行响应

因为防火墙识别不到 SNI,所以针对 SNI 的封锁会失效

在这个视频里有介绍:https://www.youtube.com/watch?v=kbpxGOKVBSA

类似实现的项目:

@MDZZ-123
Copy link

MDZZ-123 commented Dec 2, 2024

你这设置direct再加host有点多此一举了,直接手动创建一个http节点,地址和端口写本地反代的,再把steam出站设置成这个节点就行了

@pspmoe
Copy link
Author

pspmoe commented Dec 2, 2024

你这设置direct再加host有点多此一举了,直接手动创建一个http节点,地址和端口写本地反代的,再把steam出站设置成这个节点就行了

试了一下这样似乎访问不了

报错日志:[TCP] dial 🎮 Steam 商店 (match DomainSuffix/steampowered.com) 127.0.0.1:8334(chrome.exe) --> store.steampowered.com:443 error: can not connect remote err code: 302

@MDZZ-123
Copy link

MDZZ-123 commented Dec 8, 2024

你这设置direct再加host有点多此一举了,直接手动创建一个http节点,地址和端口写本地反代的,再把steam出站设置成这个节点就行了

试了一下这样似乎访问不了

报错日志:[TCP] dial 🎮 Steam 商店 (match DomainSuffix/steampowered.com) 127.0.0.1:8334(chrome.exe) --> store.steampowered.com:443 error: can not connect remote err code: 302

哦你这个好像是不行,你这个是反代,不是正向代理,你可以试试看Accesser

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

No branches or pull requests

3 participants