Total Pageviews

Tuesday, 15 February 2022

针对 IP 被封的解决方案. 家用透明网关

6. 针对 IP 被封的解决方案

花钱购买的 VPS 即便做了流量伪装依然有很大的几率 IP 被封锁,大多 VPS 服务商并不提供更换 IP 的服务,使用 CDN 可以让被封锁的 VPS 继续发挥翻墙功能。

6.1 Cloudflare

Cloudflare 是一个 CDN 服务商,目前国内依然能正常的访问,可以作为跳板来实现翻墙。

注册 Cloudflare 帐号,并有一个空闲域名(三级域名即可),交给 Cloudflare 托管并将域名指向被封的 VPS IP,注意开启 Proxied 并且 SSL-TLS 使用 Flexible 选项。

Cloudflare 只需免费方案足以,不必花钱。

6.2 V2Ray

VPS 上正常安装并配置好 V2Ray,注意两点:

  1. 传输协议必须要使用 ws
  2. 要使用 80 或者 8080 端口

如果端口有其他用途,那么用 Nginx/Caddy 之类软件,做一个 WebSocket proxy 到 V2Ray 即可。

6.3 补充

客户端注意使用网址来连接。

目前支持 WebSocket 的免费 CDN 似乎只有 Cloudflare 一家,国内 CDN 服务商既不支持也不安全,不要考虑了。如果有更好的服务商欢迎补充。

网络延迟比直连增加不少,如果是频繁操作会很痛苦。网络带宽如果运气好可能比直连还优化了,用来看 Youtube 搞不好更流畅。

7. 家用透明网关

7.1 OpenWRT 路由器

所谓透明网关的意思是,一切都交给网关来做。最好的方式是你需要一个 OpenWRT 的路由器,推荐使用华硕的路由器,贵是贵一些,但是这几年用下来,非常不错。我用的是 华硕(ASUS) RT-AC68U 1900M AC 双频智能无线路由路 。

路由器买来后,要刷一下固件。首先Asuswrt是华硕公司为他的路由器所开发的固件。Asuswrt-merlin是一个对Asuswrt固件二次开发进行各种改进和修正的项目。源代码在这里:https://github.com/RMerl/asuswrt-merlin

不必担心把路由器刷废了,华硕的路由器可以让你一键重置回来

1)下载固件。先到 https://asuswrt.lostrealm.ca/download 下载相应的固件,并解压。(我下载的是 RT-AC68U_380.61_0.zip )

2)升级固件。登录到你的路由器后台 http://192.168.1.1/ ,在 系统管理 -> 固件升级 中上传固件文件(我上传的是:RT-AC68U_380.61_0.trx

3)打开 JFFS 分区系统管理 -> 系统设置 -> Persistent JFFS2 partition

  • Format JFFS partition at next boot - 
  • Enable JFFS custom scripts and configs - 

4)打开 ssh 登录。 系统管理 -> 系统设置 -> SSH Daemon

  • Allow SSH password login - 

7.2 通过树莓派做旁路网关

如果你的路由器不能刷OpenWRT,也就是没发通过SSH登录上去装软件,你就用一个别的设备。比如用一个树莓派。我正好有一个很老旧的树莓派,刷了一个老旧的Debain 7.5的操作系统。

把它连上你的路由器上,然后,

  • 你需要把你设备上的IP地址、网关和DNS服务器都要手动设置到这个树莓派上。
  • 于是,所有的路由就会通过路由器转到树莓派上,再由树莓派决定是否要走代理。

大概的示意图如下所示。

  • 1 --> 2 是设备把所有的请求都发给树莓派。
  • 3 --> 3.1 或 3.2 是由树莓派来决走是否翻墙。
              Phone/PC/Pad
                    +
                    |  1
                    |
            +-------v-------+      2      +--------+
            |               |------------->        |
            |  WiFi 路由器   |             |  树莓派 |
            |               <-------------|        |
            +------+--+-----+      3      +--------+
                   |  |
                3.1|  | 3.2
                   |  +---------->  China LAN
                   v
               +---+---+
               | Proxy |
               +---+---+
                   |
                   |
                   v
             Internet WAN

7.3 安装 Clash

Clash 的 Github项目是:Dreamacro/clash ,在它的 Release 页面上,你可以找到相关的下载。(注:在本文更新的时候,如果你需要支持 Tun,你需要下载 Clash 的 Premium 版本

Clash支持很多翻墙协议:ShadowSocks(R), Vmess, Socks5, HTTP(s),Snell,Trojan。

在你的 OpenWRT 或 树莓派 下用 uname -m 查看一下你的硬件架构是什么的,比如,我的是华硕和树莓派都是 armv7l 的,所以,需要下载 clash-linux-armv7-....的版本。 下载完解压后,加个可执行权限 chmod +x clash 就可以运行了,不过,还差一个界面和两个配置文件,它们的目录关系如下:

├── clash                <- 建一个 clash 的目录
│   ├── clash            <- 运行文件 
│   ├── config.yaml      <- 配置文件 
│   ├── Country.mmdb     <- IP地址库
│   └── ui               <- Clash 的 UI
│       ├── index.html
│       ├── ...
  • UI界面可以到 haishah/yacd 下载。放到clash的配置目录下 ui 目录下

  • 一个是 Country.mmdb 这是IP地址的在哪个国家的数据库。你需要到这里下载 - Country.mmdb (当然,clash启动时,会自动下载,我这里给你一个手动下载的链接)

  • 另一个是 config.yaml 文件,这个文件详细解释可参看 - 官方Wiki

下面是个示例:

port: 7890
socks-port: 7891
redir-port: 7892
mixed-port: 7893
ipv6: false
allow-lan: true
mode: Rule
log-level: info
external-controller: '0.0.0.0:9090'
external-ui: ui
secret: ''
tun:
  enable: true
  stack: system
  dns-hijack:
    - tcp://8.8.8.8:53
    - udp://8.8.8.8:53
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:53
  default-nameserver:
    - 114.114.114.114
  #enhanced-mode: redir-host
  enhanced-mode: fake-ip #如果要玩netflix,需要使用fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 114.114.114.114
    - 223.5.5.5
    - tls://8.8.8.8:853
  fallback:
    - tls://8.8.8.8:853

# 两个代理服务器
proxies:
  # http
  - name: "https01"
    type: http
    server: https.server.domain
    port: 443
    username: user
    password: "password"
    tls: true # https
    skip-cert-verify: true
  - name: "https01"
    type: http
    server: https.server.domain
    port: 443
    username: user
    password: "passowrd"
    tls: true # https
    skip-cert-verify: true

# 配置 Group
proxy-groups:
  # 自动切换
  - name: "auto"
    type: url-test
    proxies:
      - us01_https
      #- us02_https
      #- hk_https
    # tolerance: 150
    url: 'https://www.google.com/'
    interval: 300
  # 按需选择 - 可以在UI上选择
  - name: "netflix"
    type: select
    proxies:
      - us01_https
      - us02_https
      - hk_https

rules:
# LAN
  - DOMAIN-SUFFIX,local,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,172.16.0.0/12,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT

# Netflix
  - DOMAIN-SUFFIX,fast.com,netflix
  - DOMAIN-SUFFIX,api-global.netflix.com,netflix
  - DOMAIN-SUFFIX,netflix.com,netflix
  - DOMAIN-SUFFIX,netflix.net,netflix
  - DOMAIN-SUFFIX,nflxext.com,netflix
  - DOMAIN-SUFFIX,nflximg.com,netflix
  - DOMAIN-SUFFIX,nflximg.net,netflix
  - DOMAIN-SUFFIX,nflxso.net,netflix
  - DOMAIN-SUFFIX,nflxvideo.net,netflix

# 最终规则(除了中国区的IP之外的,全部翻墙)
  - GEOIP,CN,DIRECT 
  - MATCH,auto

更多的规则网上可以找到很多,也可以参看这里:SS-Rule-Snippet/LAZY_RULES/clash.yaml

这个时候你就可以启动 clash 了:

/path/to/clash/cash -d /path/to/clash &

然后,你就可以把你的上网设备上的 路由网关 和 DNS 服务器都手动地配置成这个网关就好了(OpenWRT应该不用配置了,树莓派的方式需要手动配置一下)

7.4 设置 iptables 转发

iptables -t nat -N CLASH
iptables -t nat -A CLASH -d 10.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 127.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 169.254.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 172.16.0.0/12 -j RETURN
iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 224.0.0.0/4 -j RETURN
iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN
iptables -t nat -A CLASH -p tcp -j REDIRECT --to-ports 7892

然后,你可以保存一下这些iptables的规则

 iptables-save > /etc/iptables.up.rules

编辑 //etc/network/if-pre-up.d/iptables,在网卡启动的时候加载这些规则

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

然后,再 chmod +x /etc/network/if-pre-up.d/iptables 加上可执行权限就好了。

8. 数据中心透明网关

这里仅针对 AWS 进行说明,其它云平台应该大同小异,大家可以补充。

8.1 AWS 网络构建

  1. 构建一个 172.20.0.0/16 的 VPC,分成两个子网:

    • 有公网IP的公有子网 - 172.20.1.0/24
    • 无公网IP的私有子网 - 172.20.2.0/24
  2. 在公有子网里创建 EC2 NAT Instance

    • 创建时,指定私网IP为 172.20.1.1
    • (Option)为该实例分配弹性IP,可成为外网访问内网的跳板机
  3. 建立路由规则

    • 创建“互联网网关”,并把“互联网网关”添加到公有子网 172.20.1.0/24 的路由表中
    • 把 EC2 NAT Instance 172.20.1.1 添加到私有子网172.20.2.0/24的路由表中。

于是整个网络就如下所示。

                                    ┌──────────┐
                                    │          │
                                    │          │
                                    └──────────┘
          弹性IP                      互联网网关
        ┌───────────────┐                ▲
        │xxx.xxx.xxx.xxx├─┐              │
        └───────────────┘ │  ┌───────────┘
                          │  │
                  ┌───────┼──┼────────┐       ┌───────────────────┐
                  │       │  │        │       │                   │
                  │     ┌─┴──▼──┐     │       │  ┌─┐ ┌─┐ ┌─┐ ┌─┐  │
  Public Network  │     │       │◄────┼───┬───┼─►└─┘ └─┘ └─┘ └─┘  │  Private Network
                  │     └───────┘     │   │   │                   │
                  │  EC2 NAT Instance │   │   │  ┌─┐ ┌─┐ ┌─┐ ┌─┐  │
                  │    172.20.1.1     │   ├───┼─►└─┘ └─┘ └─┘ └─┘  │
                  │                   │   │   │                   │
                  │   (NAT Instance)  │   │   │    ┌─┐ ┌─┐ ┌─┐    │
                  │                   │   └───┼─►  └─┘ └─┘ └─┘    │
                  │                   │       │                   │
                  └───────────────────┘       └───────────────────┘

                      172.20.1.0/24              172.20.2.0/24
                           ▲                            ▲
                    subnet │                            │ subnet
                           │                            │
                           └──────────  VPC  ───────────┘
                                   172.20.0.0/16

8.2 安装 Clash

在 EC2 NAT Instance 上安装 clash 透明网关,安装配置参看 7.3 安装 Clash ,基本一致。

注:在实际操作中,没有设置 iptables 转发规则

8.3 配置私有子网中的 EC2

只需要配置 /etc/resolv.conf 文件,把 EC2 NAT Instance 加入其中。如:

# /etc/resolv.conf
nameserver 172.20.1.1  #<--- 透明网关 EC2 NAT 实例
nameserver 172.20.0.2  #<--- AWS 的 DNS 服务
search [zone].compute.internal

8.4 私有子网中的 Kubernetes

K8s 里有两组 CoreDNS 部署和配置,一组是边缘的(或是叫本地的),一组是中心的。

  • 边缘的 Pod 名叫 nodelocaldns,侦听在本机。如:169.254.25.10:53
  • 中心的 Pod 名叫 coredns,侦听在 cluster IP 上,如:10.233.0.3:53

边缘的规则会把k8s的域名 cluster.localin-addr.arp ip6.arpa 转给中心的 CoreDNS 处理,其它的交给本地的 /etc/resolv.conf 处理。

Kubernetes 会把如下内容打到 Pod 里的 /etc/resolv.conf

nameserver 169.254.25.10
search default.svc.cluster.local svc.cluster.local cluster.local cn-northwest-1.compute.internal
options ndots:5

查看一下 nodelocaldns 的配置:

$ kubectl get cm nodelocaldns -n kube-system -o yaml

我们可以看到,除了 K8s 自己的域名外,其它的都交给了本机的 /etc/resolv.conf,如下所示:

.:53 {
    errors
    cache 30
    reload
    loop
    bind 169.254.25.10
    forward . /etc/resolv.conf  # <--- 注意这条语句
    prometheus :9253
}

然而,本机的 /etc/resolv.conf 里有两个 DNS,一个是我们的透明网关,一个是AWS的。而 CoreDNS 的 forward 策略是随机挑选,所以,这样的会导致,时而交给AWS处理,时而交给我们自己的clash处理。最终导致IP解析紊乱。

通过以下命令进行修改:

$ kubectl edit cm nodelocaldns -n kube-system

修改如下:(AWS的归 172.20.0.2, 其它的走我们自己的网关)

+    compute.internal:53 {
+        errors
+        cache 30
+        reload
+        loop
+        bind 169.254.25.10
+        forward . 172.20.0.2
+        prometheus :9253
+    }
     .:53 {
         errors
         cache 30
         reload
         loop
         bind 169.254.25.10
-        forward . /etc/resolv.conf
+        forward . /etc/resolv.conf {
+            policy sequential
+        }
         prometheus :9253
     }

退出保存后,等大约30秒左右配置就会生效。

from https://github.com/haoel/haoel.github.io

No comments:

Post a Comment