前幾天在「TVBS 的 CloudFlare 客製化...」這邊提到這件事情,當天就先隨手測了一些東西。
首先是 CloudFlare 的服務 IP 是互通的,也就是說,我就算拿其他人的 CNAME mapping 來用,只要有送出對應的 Host:
或是 SNI (for HTTPS) 就會通,而 TVBS 當時的 IP address (以及網段) 對於台灣 HiNet 使用者剛好會導到美國機房,還算可以用。
另外 CloudFlare 有提供列表 (文字格式,一行一個網段),分別是 IPv4 的 https://www.cloudflare.com/ips-v4 以及 IPv6 的 https://www.cloudflare.com/ips-v6。
所以就有幾種組合了,一種是寫 Google Chrome 的 extension 直接改 IP address,不過看了看 JavaScript APIs - Google Chrome 想不出來怎麼寫。
另外一個是先用 iptables 把這些網段的流量導去美國的 CloudFlare 機房。結果這時候發現 HiNet 到 TVBS 已經改回到香港機房了 orz
實際抓了一下發現 188.114.97.100 在巴西機房 (GRU 是 IATA 代碼),就變成只是測試看看這有沒有用了:
$ curl -x http://188.114.97.100:80/ http://s.plurk.com/cdn-cgi/trace fl=42f16 h=s.plurk.com ip=114.32.152.63 ts=1441004146.723 visit_scheme=http uag=curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 colo=GRU spdy=off
由於是自己機器出去的封包,不能用 PREROUTING
做,要用 OUTPUT
做:
iptables -t nat -A OUTPUT -d 190.93.240.0/20 -j DNAT --to-destination 188.114.97.100
然後再直接連到 s.plurk.com 就可以看到:
$ curl http://s.plurk.com/cdn-cgi/trace fl=42f16 h=s.plurk.com ip=114.32.152.63 ts=1441004011.195 visit_scheme=http uag=curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 colo=GRU spdy=off
不過巴西也太遠了點,而且不知道哪天這段 IP 又會被 anycast 進去... orz