前言

我踩了很多坑,我一开始使用的是cloudflare warp 香港服务器依旧不行,

cloudflare worker 香港服务器依旧会因为cloudflare自动分配最近的网络导致依旧使用的还是香港ip,导致无法正常的访问,

使用了全局代理环境变量也解决不了

又使用了nginx反向代理,一直陷入了逻辑误区,

最后通过ai帮助分析了解到透明代理的方式,尝试后,并成功的解决服务器无法访问googleAI的API的问题,因此记录下来

我遇到的问题

  • 一台香港的linux服务器无法正常访问谷歌的api

  • 使用mihomo作为服务器的全局代理

    • 通过流量转发的方式可以有效的解决这个问题

  • mihomo(米哈油)是什么就不多做介绍了

    • 需要其他可正常访问谷歌ai的服务器或网络搭建节点给此服务使用

    • 或者自行购买(此问题请自行解决,不做探讨)

架构实现

一台linux服务器(任何地方的服务器,可以访问到你架设或购买的代理地址)

  • 编排mihomo docker版本

    • 编辑config.yaml

    • 开启tun透明代理,dns劫持的方案,让全局流量都走规则分流,多代理模式统一端口为7890{sk5 http(s)},不要使用fakeip,会导致域名分流失效,他会导致域名转换成ip

    • 使用代理规则分流

      • 谷歌AI api走代理地址

      • 其他则根据分流走本地

  • 服务器内搭建nginx反向代理

    • 域名解析到ip地址

    • 创建一个反向代理

      • 反向代理的地址则为谷歌AI的api

  • 务器内测试是否成功

    • curl 谷歌AI api地址 走代理

    • ping 域名,任何域名都无法ping通

      • ping ip,不走代理,可ping通

      • ping 属于ICMP,因此问题出现在环境变量上,但无所谓

    • dokcer下载镜像 走代理(比如拉取什么的)

      • 创建好容器后的 容器 不走代理

    • 证书服务 走代理

    • 1panel内部更新 走代理

    • 网站方面

      • 静态网站 不走代理

      • 一键安装的应用 不走代理

      • nginx反向代理本服务器地址 走代理

      • nginx反向代理本服务器地址 不走代理

    • 总结:docker内的服务不走因为默认不继承宿主机,一些本机的服务使用的是127.0.0.1:xxx,由于使用的是本地的host,是不会到达mihomo 层

反向代理的外部网络是会被服务器mihomo 劫持dns,走分流,判断是否是谷歌,走对应的线路的

延迟高低取决于你连接你服务器的延迟,服务器使用的代理地址的延迟,代理地址到谷歌api地址的延迟

教程开始

先curl一下googleAI的API(key去后台自己申请,我测试完后会删除key,不要直接套用我的)

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=AIzaSyD25UFVg1EKYFtH7cUxRHf-Np9mjn-uoxU"   -H "Content-Type: application/json"   -X POST   -d '{"contents": [{"parts":[{"text": "Explain how AI works"}]}]}'

676ca78433566.webp

提示为当前地区不可使用

服务器无安全组或者ssh默认是22端口,

为了安全和方便可以选择安装面板操作,

因本教程基本围绕docker和反代,使用1panel作为操作面板

安装1panel面板

https://1panel.cn/docs/installation/online_installation/

我使用的服务器为debain12,先通过ssh安装它

curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh
  • 选择你喜欢的语言:2

  • 默认 opt

  • 设置端口

  • 设置安全入口

  • 设置账号

  • 设置密码

安装防火墙

https://1panel.cn/docs/user_manual/hosts/firewall/

更新软件包

sudo apt update

安装 UFW

sudo apt install ufw

放开 1Panel 系统端口

sudo ufw allow 8090/tcp

上述命令中的 8090 端口需要替换为安装 1Panel 系统时自定义的端口

因还是需要通过命令,后续的所有操作由1panel内置终端操作

启动 UFW

sudo ufw enable

不放行22端口

为了安全着想

如果你的ssh非标准也不需要放开,请注意,如果你没有放开1panel,将无法在访问,则需要服务商提供通过vnc或控制台放开端口

搭建mihomo

使用编排docker

需要注意的是,如果需管理面板这一块,我这里没有,请自行添加,或者你其他地方有面板也可以使用放开9090端口即可,设置完使用完请及时关闭端口。

  • 我只应用于本地,请注意

    • 没有设置9090端口访问的密码

    • 不要轻易的防火墙放开7890 9090 等端口

version: '3'

services:
  mihomo:
    container_name: mihomo #名称
    image: docker.io/metacubex/mihomo:Alpha #容器镜像
    pull_policy: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
    restart: always
    pid: host
    ipc: host
    cap_add:
      - ALL
    security_opt:
      - apparmor=unconfined
    network_mode: host #网络使用本地的host的地址,用的是主机的地址和端口,请注意端口的冲突问题
    privileged: true #特权模式,权限不够则无法正常使用tun劫持dns
    volumes:
      - ./clash_meta/clash:/root/.config/mihomo #映射目录,此目录下的config.yaml 为配置文件
      - /dev/net/tun:/dev/net/tun

676cafe534e43.webp

编辑config.yaml

这是你映射的目录下的配置文件,也是最主要的

注意不要使用fakeip,它会导致域名分流失效。

mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '0.0.0.0:9090'

tun:
  enable: true
  stack: mixed
  dns-hijack:
    - "any:53"
    - "tcp://any:53"
  auto-route: true
  auto-redirect: true
  auto-detect-interface: true

dns:
  enable: true
  ipv6: false
  respect-rules: true
  nameserver:
    - https://120.53.53.53/dns-query
    - https://223.5.5.5/dns-query
  proxy-server-nameserver:
    - https://120.53.53.53/dns-query
    - https://223.5.5.5/dns-query
  nameserver-policy:
    "geosite:cn,private":
      - https://120.53.53.53/dns-query
      - https://223.5.5.5/dns-query
    "geosite:geolocation-!cn":
      - "https://dns.cloudflare.com/dns-query"
      - "https://dns.google/dns-query"
####################################################################################下面自己填写,上面的可复制黏贴
proxy-providers:
  <节点提供者名称>:
    url: "<节点订阅链接>"
    type: http
    interval: 86400
    health-check: {enable: true,url: "https://www.gstatic.com/generate_204", interval: 300}
    override:
      additional-prefix: "<节点名称前缀>"

proxies: 
  - name: "直连"
    type: direct
    udp: true

geodata-mode: true
geox-url:
  geoip: "https://mirror.ghproxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat"
  geosite: "https://mirror.ghproxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat"
  mmdb: "https://mirror.ghproxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb"
  asn: "https://mirror.ghproxy.com/https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"


proxy-groups:

  - name: 默认
    type: select
    proxies: [自动选择,直连,香港,台湾,日本,新加坡,美国,其它地区,全部节点]

  - name: Google
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Telegram
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Twitter
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 哔哩哔哩
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 巴哈姆特
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: YouTube
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: NETFLIX
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Spotify
    type: select
    proxies:  [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Github
    type: select
    proxies:  [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 国内
    type: select
    proxies:  [直连,默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择]

  - name: 其他
    type: select
    proxies:  [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  #分隔,下面是地区分组
  - name: 香港
    type: select
    include-all: true
    filter: "(?i)港|hk|hongkong|hong kong"

  - name: 台湾
    type: select
    include-all: true
    filter: "(?i)台|tw|taiwan"

  - name: 日本
    type: select
    include-all: true
    filter: "(?i)日|jp|japan"

  - name: 美国
    type: select
    include-all: true
    filter: "(?i)美|us|unitedstates|united states"

  - name: 新加坡
    type: select
    include-all: true
    filter: "(?i)(新|sg|singapore)"

  - name: 其它地区
    type: select
    include-all: true
    filter: "(?i)^(?!.*(?:🇭🇰|🇯🇵|🇺🇸|🇸🇬|🇨🇳|港|hk|hongkong|台|tw|taiwan|日|jp|japan|新|sg|singapore|美|us|unitedstates)).*"

  - name: 全部节点
    type: select
    include-all: true

  - name: 自动选择
    type: url-test
    include-all: true
    tolerance: 10
#####################################################################################################上面自己填写
rules:
  - DOMAIN-SUFFIX,googleapis.com,默认
  - MATCH,直连
  #只有访问google地址使用默认,其他都是直连,有其他需求请自行设置

查看容器日志


tun 正常,无错误,并且已经成功代理google的dns

测试一下

已经可以了

通过1panel去搭建了一下证书,可以看到流量自动分流到了直连

1panel搭建反向代理谷歌API地址

虽然说本地使用curl可以正确的访问到googleAI 的API地址,如何解决你其他位置需要调用googleAI的API呢

根据现有的环境,通过反向代理,即可实现其他网络访问到googleAPI 地址,

妈妈再也不用担心cf的高延迟和cf worker 免费的限制次数了

这个linux服务器可以为任意地区,可以连接代理即可,代理可以访问googleapi即可

反向代理服务通过服务器内部的架构图

graph TD; subgraph 其他网络; A[客户端]; end; subgraph Linux 服务器; B{mihomo Docker}; C[Nginx 反向代理]; A --> C; C -- 请求地址非本地Host --> B; B -- DNS 劫持 & 分流: 谷歌域名 --> D; style B fill:#f9f,stroke:#333,stroke-width:2px; end; subgraph 互联网; D[代理服务器]; E[其它地址]; F([谷歌 AI API地址]); G([默认地址]); D --> F; C -- 请求地址为本地Host --> G; B -- DNS 劫持 & 分流: 其它域名 --> E; end;

新建一个反向代理

前提是域名解析到当前服务器IP地址

开启https

反向代理源文件

location ^~ / {
    proxy_pass https://generativelanguage.googleapis.com; 
    proxy_set_header Host generativelanguage.googleapis.com; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name on; 
}

调用api测试

676d094a4c334.webp