しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Windows Server 2016 で ARR Helper が動かなくて困った話

以前に Windows 10 というか IIS 10 に対応した ARR Helper が ARR 3.0 に含まれていると書きました。

実際にレジストリを弄るハックをしなくてもすんなりとインストールは出来ますが、タイトルの通り思った通りに動かなかったのでメモとして残します。地味にはまりました。

以前は ARR Helper が ARR 3.0 に含まれていることを知らなかったので、オリジナルのブログで配布されていたバージョンを使っていました。今は ARR に同梱されているバージョンを使いましょうね。

このバージョンではデフォルト値が以下のようになってます。

f:id:shiba-yan:20180216000014p:plain

デフォルトで trustUnlisted = True となっているので、trustedProxies に何も書かなくてもデフォルトで X-Forwarded-For にある IP アドレスを使って REMOTE_ADDR などを上書きしてくれます。

これが ARR に同梱されているバージョンではデフォルト値が変わっています。

f:id:shiba-yan:20180215235102p:plain

明示的に 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 が有効化されています。

f:id:shiba-yan:20180215235237p:plain

リバースプロキシが複数あって X-Forwarded-For に IP アドレスが複数付いてくる場合には挙動が変わるので、このあたりの設定は注意した方がよさそうです。

当然ながら不正な形で X-Forwarded-For が渡された場合に trustUnlisted を True にしていると問題になるので、NSG などで接続元を絞る制限が無いまま設定するのはやめましょう。