概要

f:id:rarirureluis:20181228214544p:plain

こんなシステムのとき、ユーザーから Cloudflare を通って最上段のリバプロのバックエンドが Cloudflare + proxy:on の環境のとき、「Error 1000: DNS points to prohibited IP」というエラーがでる。

support.cloudflare.com

発生条件

以下のどれかに当てはまるとエラーになる。

  • The IP address that Cloudflare is pointing to is incorrect.
  • Your service is pointing to another proxy in your zone file. Because Cloudflare is also a reverse proxy, enabling our proxy on a record may create a cyclic loop.
  • The request includes an X-Forwarded-For header over 100 characters in length.
  • The request includes two X-Forwarded-For headers.
  • Cloudflare detects a cyclic loop; e.g., Cloudflare is proxying back to Cloudflare. This is detected when your origin responds with a “cf-ray” or “cf-connecting-ip” header.

原因

今回の構成の場合

1. X-Forwarded-For が2つある
2. ユーザーから近いリバプロから Cloudflare に戻るときに cf-ray, cf-connecting-ip を返してる

解決

方法はいくつかある

① ユーザーから近いリバプロで Cloudflare 系のヘッダーを消す

proxy_set_header X-Forwarded-For "";
proxy_set_header cf-ray "";
proxy_set_header cf-connecting-ip "";

② ユーザーから近いリバプロから見てバックエンド側の proxy をオフ
DNS ページから ON/OFF できるやつ

③ ユーザーから近いリバプロの hosts をバックエンド側ドメインの hosts を変える

117.102.xx.xx backend.example.com

②とやってることは一緒

結局、③でキャッシュされなくても、①でキャッシュされるのできちんと HTTP ヘッダが設定されていれば②で対応するのが1番良いと思います。
もし何らかの理由で一番下にあるグローバルIP を隠したければ③が良いと思います。

ハッピーニューイヤー