V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wenerme
V2EX  ›  程序员

基于 SNI 的全局代理

  •  
  •   wenerme ·
    wenerme · 2023-06-21 15:19:13 +08:00 · 3035 次点击
    这是一个创建于 555 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主要应对近期针对 docker.io. 的封锁,过于严重,影响面过大,所以做了统一的解决方案。 分享下解决逻辑,目前还没找到更好的解决办法

    1. 路由器上配置 DNS 为局域网内的一个节点
    2. 路由器上配置 路由 172.32.1.1 到内网的一个 IP
    3. DNS 匹配需要代理的路由返回 172.32.1.1
    4. 172.32.1.1 上部署 sni 代理,监听 80 、443

    前置条件

    • 已有相关代理服务

    后置条件

    • 修改路由器配置

    应用场景

    • 家庭
      • 无感
    • 服务器运维 - 云服务器、物理服务器
      • 无感
      • 能支持任意场景
    • 公司局域网
      • 能限制范围

    配置代理节点

    ip addr add 172.32.1.1/32 dev eth0 # 增加 IP
    
    # 安装部署 gost - 提供 SNI 代理
    # ===============
    curl -LO https://github.com/go-gost/gost/releases/download/v3.0.0-rc8/gost_3.0.0-rc8_linux_amd64.tar.gz
    tar zxvf gost*.tar.gz
    # 监听 80, 443 - 上游代理为 192.168.1.2:7890 ,如果在当前节点也可以 127.0.0.1:7890
    ./gost -L sni://:80 -L sni://:443 -F socks5://192.168.1.2:7890
    # 测试 gost 代理是否成功
    curl -H 'Host: google.com' 127.0.0.1
    
    # 安装部署 dnsmasq
    # ===============
    apk add dnsmasq
    # 上游配置
    cat << EOF > /etc/dnsmasq.d/main.conf
    server=223.5.5.5
    log-queries=extra
    EOF
    
    # 配置代理常用的域名
    curl -L https://ghproxy.com/raw.githubusercontent.com/wenerme/wener/master/notes/service/dns/gfwlist.txt \
      | sed -E 's#.+#address=/&/172.32.1.1#' > /etc/dnsmasq.d/gfwlist.conf
    
    # 测试启动
    dnsmasq -d
    # 测试,返回 172.32.1.1 为正常结果
    nslookup google.com 127.0.0.1
    
    # service dnsmasq start # 服务启动
    # rc-update add dnsmasq # 开机自动启动
    
    • 配置路由器
      • DNS
      • 路由 172.32.1.1 到内网节点

    FAQ

    为什么用 172.32.1.1

    • 172.32.1.1 为公网 IP 地址,但这个地址被使用的概率非常低
    • 如果不给代理节点一个公网地址而是使用内网地址,那么 iOS 访问网络时会提示 “是否允许应用访问本地网络”。

    为什么选择 DNS+SNI 作为全局代理

    • 客户端无感,不需要改任何配置
    • 能实现全局 - 例如 docker 不需要就行配置,k8s 不需要就行配置 就能拉取镜像
    • 代理范围易于控制 - DNS 层控制

    能不能不限制域名所有都代理

    • 可以,dnsmasq 默认全部返回固定 ip
    • 确保上游代理支持策略控制即可,例如 clash

    关于上游 DNS

    • 可以选择公共的,例如 223.5.5.5
    • 也可以选择自己部署的 adguard 之类的
      • 支持拦截隐私相关域名
      • 避免 DNS 污染

    其他无感全局代理的方式

    1. 修改网关,tproxy - 无感,但是重新部署 dhcp ,替代路由作为网关
    2. 在 WiFi+Lan 的节点上,将 WiFi 配置为走代理,连 WiFi 则走代理,增加一个 lan 不修改现有。

    博文 https://wener.me/story/sni-proxy 原文 https://github.com/wenerme/wener/blob/master/story/2023/2023-06-21-sni-proxy.md

    23 条回复    2023-06-22 18:30:44 +08:00
    AngryPanda
        1
    AngryPanda  
       2023-06-21 15:27:00 +08:00   ❤️ 16
    国人做点事情太难了
    不是🇺🇸人卡你脖子
    就是🇨🇳人卡你脖子
    iRiven
        2
    iRiven  
       2023-06-21 15:27:28 +08:00
    对于非 80/443 端口的流量,这样子不就变成 DNS 污染了。
    wenerme
        3
    wenerme  
    OP
       2023-06-21 16:35:50 +08:00
    @iRiven 但是需要代理的这些域名一般不会用到非 80 443 ,目前我自己用到了这些域名 https://github.com/wenerme/wener/blob/master/notes/service/dns/gfwlist.txt
    cheng6563
        4
    cheng6563  
       2023-06-21 17:02:45 +08:00
    我是把墙了的镜像搬到 ghcr.io 了,利用 github actions 搞的
    ShareDuck
        5
    ShareDuck  
       2023-06-21 17:09:48 +08:00
    有被墙吗?广东电信和广东广电都能访问。
    liantian
        6
    liantian  
       2023-06-21 17:13:30 +08:00
    用得着那么麻烦么....
    配个代理再拉镜像不就完了...以前又不是没封过了
    realpg
        7
    realpg  
       2023-06-21 17:46:22 +08:00
    封就封呗,无论是服务器还是自己电脑,整个梯子难度都是 0 ,何必瞎鸡儿折腾

    买个锤子看啥都像钉子
    dode
        8
    dode  
       2023-06-21 17:54:57 +08:00 via Android
    很棒
    dode
        9
    dode  
       2023-06-21 17:58:02 +08:00 via Android
    clash 开启 DNS 服务可以提供同等功能吗
    Jirajine
        10
    Jirajine  
       2023-06-21 18:05:58 +08:00   ❤️ 1
    影响面过大为什么不去投诉运营商?真就温水煮青蛙?
    @realpg 等这些能“钻空子”的服务都封了,你还上哪整梯子去?
    IvanLi127
        11
    IvanLi127  
       2023-06-21 18:08:27 +08:00 via Android
    话说为啥不直接在路由上跑 Clash ,除了吃性能外,好像挺方便的
    yuange1975
        12
    yuange1975  
       2023-06-21 18:59:43 +08:00
    fakedns?
    billlee
        13
    billlee  
       2023-06-21 19:46:23 +08:00 via Android
    IP 不如用国防部或 IBM 的网段
    wenerme
        14
    wenerme  
    OP
       2023-06-21 20:35:00 +08:00
    @liantian 一两个可以配置代理,但是整个局域网节点多的时候就很麻烦了,而且不只是 docker.io, 顺便解决 ghcr 、quay 和 k8s.io 镜像问题
    jiulang
        15
    jiulang  
       2023-06-21 20:52:07 +08:00
    Cloudflare 的 IP 都 block 了
    kangyue9999
        16
    kangyue9999  
       2023-06-21 22:52:14 +08:00
    @AngryPanda 剩下人想卡卡不到?
    lovelylain
        17
    lovelylain  
       2023-06-21 23:07:57 +08:00 via Android
    clash fakedns 透明代理 不香吗?
    bugfan
        18
    bugfan  
       2023-06-22 01:19:25 +08:00
    去年做 vpn 时候 ,写过 sni 代理,其实还是挺好用的。代码量也不大,只不过当时只实现了 ipv4,没做 ipv6.

    这玩意好处就是客户端只需要配置个 dns 就行了,别的都不用动。
    wwbfred
        19
    wwbfred  
       2023-06-22 01:28:02 +08:00
    七层代理在中国泛用度肯定不如四层代理。使用代理的需求肯定不仅是 HTTP 和 HTTPS ,这个方案的适用度有限。这个方案我在家里也有些类似的应用,但主要用途是中间人攻击,另外对于部分限制 IP 的服务也有效果。
    xxcheng
        20
    xxcheng  
       2023-06-22 12:01:20 +08:00
    奈飞的 DNS 解锁是这个原理吗
    bugfan
        21
    bugfan  
       2023-06-22 12:33:47 +08:00
    @xxcheng
    huahsiung
        22
    huahsiung  
       2023-06-22 17:23:24 +08:00
    这个方法我都用了好久了,但是我不是用 gost

    gost 太重了,直接把 sniproxy 用 proxychain 代理出去就行,我就是这样用的。都用了好久了

    自己的服务器或者电脑上其实不用 dnsmasq ,adguard 。把 /etc/hosts 添加一条记录就行,反正有控制权

    172.32.1.1 docker.io

    还可以添加多条 host 记录

    172.32.1.1 docker.io
    172.32.1.1 www.google.com
    172.32.1.1 chat.opanai.com

    解锁 chatGPT 等服务
    wenerme
        23
    wenerme  
    OP
       2023-06-22 18:30:44 +08:00
    增加了 Docker, 简化部署

    ```bash
    # --network=host or -p 80:80 -p 443:443 -p 53:53/udp
    # -e FAKEIP=172.32.1.1
    docker run --rm -it -e PROXY=socks5://192.168.66.1:7890 -p 80:80 -p 443:443 -p 53:53/udp --name proxy wener/sni-rev-proxy

    nslookup google.com 127.0.0.1
    curl --resolve google.com:80:127.0.0.1 google.com

    # 添加 FAKEIP
    ip addr add 172.32.1.1/32 dev eth0
    ```

    - Dockerfile https://github.com/wenerme/dockerfiles/tree/master/sni-rev-proxy
    - https://github.com/wenerme/wener/blob/master/story/2023/2023-06-21-sni-proxy.md
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:08 · PVG 13:08 · LAX 21:08 · JFK 00:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.