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,注意两点:
- 传输协议必须要使用 ws
- 要使用 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 网络构建
构建一个
172.20.0.0/16的 VPC,分成两个子网:- 有公网IP的公有子网 -
172.20.1.0/24 - 无公网IP的私有子网 -
172.20.2.0/24
- 有公网IP的公有子网 -
在公有子网里创建 EC2 NAT Instance
- 创建时,指定私网IP为
172.20.1.1 - (Option)为该实例分配弹性IP,可成为外网访问内网的跳板机
- 创建时,指定私网IP为
建立路由规则
- 创建“互联网网关”,并把“互联网网关”添加到公有子网
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.local, in-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