Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
多段串(この場合Google Chromeのデータセーバー機能)が使われてもGoogleのIPではなく端末のIPをバックエンドに伝える

Google Chromeのデータセーバー機能による多段串が使われてもGoogleProxyのIPではなく端末のIPをバックエンドに伝える

Google Chromeのデータセーバー機能は透過プロキシとして動作し、Googleの所有する IPアドレスからアクセスされるのだが、サーバ側でリバースプロキシを構築していると、 多段串を使ってアクセスしてるかのような状態になる。

NginxとApacheの間で、リバースプロキシ環境を構築化でクライアントのIPアドレスを 伝える仕組みとして、Apache側に mod_rpaf を入れて、Nginx側でリクエストヘッダ を調整する方法があるのだけれども、データセーバーを使われてしまうと、Apache側 では、GoogleのProxyアクセスのIPアドレスが記録されてしまう。

困ったことに、GeoIPで逆引きすると、 JP ではなくて、 AP と取得されてしまう ので、GeoIPを使ったアクセス制限に支障をきたす。

よって、データセーバーが使われてもGoogleのIPではなく端末のIPをバックエンドに 伝える仕組みを用意する必要がある。

# Nginx(リバースプロキシ)+Apache(バックエンド)mod_rpaf
# 環境において、
# Google Chrome の通信量軽量化機能「データセーバー」を使うと、
# Googleの透過プロキシが設定されて、アクセスがGoogleのIPアド
# レスからとなり、バックエンド側に端末のIPアドレスからのアク
# セスとして記録されなくなるので、Nginx側でヘッダを修正する。
http {
proxy_set_header host $host;
# X-Forwarded-Forは server コンテキストで制御
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection '';
upstream backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
listen 80;
server_name localhost;
## Google Chromeの「データセーバー」で多段Proxyとなるため、
# mod_rpaf用にX-Forwarded-Forを調整
#
# データセーバー使用:$http_x_forwarded_for に端末のIP
# データセーバー不使用:$http_x_forwarded_forが空
# データセーバー不使用ならば、X-Forwarded-For = $proxy_add_x_forwarded_for
# データセーバー使用ならば、 X-Forwarded-For = $http_x_forwarded_for
#
set $xff $http_x_forwarded_for;
if ($http_x_forwarded_for = '') {
set $xff $proxy_add_x_forwarded_for;
}
proxy_set_header X-Forwarded-For $xff;
location / {
proxy_pass http://backend;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment