# 一次 CloudFlare 配置阿里云 ALB 源站返回 504 超时的排查记录（用户当地运营商封锁IP）

## 1. 起因

有孟加拉的用户反馈，无法正常登录APP，会提示网络相关的错误提示，开启VPN能够正常使用。  
APP使用的网络组件是okhttp，界面错误信息如下：

```text
failed to connect to app-api.xx.xx/
172.66.xxx.xxx (port 443) from / 192.168.0.101 (port 38784) after
10000ms
```

## 2. 现有架构

域名在Cloud Flare进行解析，解析的CNAME为阿里云的ALB地址，具体的服务在阿里云服务器上。

## 3. 排查步骤

* 与移动端确认错误信息原因，172.66.xxx.xxx (port 443)表示Cloud Flare边缘服务器的IP，有显示表明域名解析成功。192.168.0.101 (port 38784)表示用户IP，配合用户提供的截图是用户有连Wi-Fi。
* 尝试让用户不连Wi-Fi，用手机移动网络是否能正常访问，结果依旧有网络错误。且确认用户不开VPN能够正常访问谷歌商店以及其他APP。
* 本地（国内）ping边缘服务器能够正常ping通，沟通用户用下载网络链路测试APP工具PingTools，显示全链路不通
* 结合网上案例，基本确认是用户本地 ISP 到 Cloudflare 这段路径有问题，当地电信运营商封锁/限制了部分 Cloudflare IP 段。

## 4. 尝试的解决方法

1. 从网上了解到，Cloud Flare有一个路由优化的服务Argo Smart Routing，登录CF的管理后台，发现本来就有开启这个服务。进一步了解，这个玩意主要是优化CF内部链路的，没法解决用户到边缘服务器的链路问题。
2. 老老实实提工单，尝试让CF的技术人员调整下分配的边缘服务器，但结果是让我先提供用户的MTR结果。
3. 时间上已经等不及了，上面已经明确了是用户到CF边缘服务器的链路问题，那么更直接的方法是不用CF的代理，不用CDN加速和WAF，但是这个有暴露源站的风险。原本计划用阿里云的国际加速，但是需要额外费用（固定+按量付费）。后面去AWS问了下，有按量付费的服务，而且AWS有分发策略功能，也有CND加速和AWS，刚好匹配阿里云的ALB。

## 5. 具体实施步骤

1. 登录AWS管理后台，切换到 us-east-1 区域！切换到 us-east-1 区域！！切换到 us-east-1 区域！！！这一步很重要。
2. ACM → 请求证书 → 公有证书
3. 填写之前在CF中解析的域名
4. 验证方式选 DNS 验证
5. 创建后，把给出的 CNAME 记录添加到 DNS
6. 等待状态变为 ISSUED
7. 创建 CloudFront 分发策略
8. 分发创建后会生成一个 dxxxxxx.cloudfront.net 域名
9. 登录CF后台，原本的域名解析由代理（橙色云）模式改为仅解析模式（灰色云），解析值由原来的ALB地址改为分发的AWS域名，这一步我是直接全量切换的，如果有区域需求，可以使用Route53做精细化分流，比如说某些国家还是走CF代理

## 6. 注意事项

1. 创建 CloudFront 分发时，要注意无论是用CLI还是GUI页面创建，PriceClass这个参数要注意下，需要涉及到分发的服务器分布，会影响链路的速度。
2. 另外还有一点要注意的，ViewerProtocolPolicy，如果之前兼容http的话，不要设置为https-only，或者设置为http转https
3. 我这种操作，需要切换到us-east-1 区域，可能是由于当初AWS初始的服务器在这个区域，所以有些服务这个区域才有
4. 另外个人感觉切换为AWS做分发后，虽然据说AWS的边缘服务器比CF的多，但是感觉响应速度没有之前快了，就算PriceClass调整后，效果也不大


---

> 作者: kayoon  
> URL: https://iamky.cn/posts/aws/aws-cloudfront-504-alb-troubleshooting/  

