以前に Windows 10 というか IIS 10 に対応した ARR Helper が ARR 3.0 に含まれていると書きました。
実際にレジストリを弄るハックをしなくてもすんなりとインストールは出来ますが、タイトルの通り思った通りに動かなかったのでメモとして残します。地味にはまりました。
以前は ARR Helper が ARR 3.0 に含まれていることを知らなかったので、オリジナルのブログで配布されていたバージョンを使っていました。今は ARR に同梱されているバージョンを使いましょうね。
このバージョンではデフォルト値が以下のようになってます。
デフォルトで trustUnlisted = True となっているので、trustedProxies に何も書かなくてもデフォルトで X-Forwarded-For にある IP アドレスを使って REMOTE_ADDR などを上書きしてくれます。
これが ARR に同梱されているバージョンではデフォルト値が変わっています。
明示的に appcmd などを使って trustedProxies にリバースプロキシの IP アドレスを指定するか、trustUnlisted を True に設定しないと動作しなくなるという理由でした。
2016 年に公開された ARR の Hotfix でデフォルト値が変更されたようです。
June 2016 hotfix for Microsoft Application Request Routing 3.0
このタイミングで trustImmediateProxy 属性も追加されています。このサポート体制を考えると ARR Helper をコミュニティベースというのはちょっと無理があるのではないかなと、少しだけ思いました。
appcmd を使って trustUnlisted = True にする場合は以下のようなコマンドを打ちます。
appcmd.exe set config -section:system.webServer/proxyHelper /trustedProxies.trustUnlisted:"True" /commit:apphost
これで REMOTE_ADDR などの書き換えが問題なく動作するようになりました。App Service でも使われていることを知っていて安心していたので、地味に気が付くのに時間がかかったです。
ちなみに App Service では trustImmediateProxy が有効化されています。
リバースプロキシが複数あって X-Forwarded-For に IP アドレスが複数付いてくる場合には挙動が変わるので、このあたりの設定は注意した方がよさそうです。
当然ながら不正な形で X-Forwarded-For が渡された場合に trustUnlisted を True にしていると問題になるので、NSG などで接続元を絞る制限が無いまま設定するのはやめましょう。