オンプレ環境でWebサーバをリバースプロキシやロードバランサーで運用しているとき,Webサーバやリバースプロキシ・ロードバランサーのネットワーク配置的にワンアーム型になってしまうときがあります.BIG-IPのような高級なロードバランサーなどを利用している場合は,ソースナット(SNAT)とX-Forward-For 設定で解決してきました(その他の方法もあります)が,Linuxのnginxのリバースプロキシを利用していてワンアームになったらどのような設定が必要なのでしょうか?
ちょっとネットを探ってみましたが簡単に見つからなかったので解決策を探してみます.
サーバ構成
リバースプロキシ1台,Webサーバ2台,同一のサブネットワーク上に存在することとします.
基本的なアイデア
基本的なアイデアは以下のとおりです.
- DSRは利用しない
- リバースプロキシが動作しているサーバでSNATを行う
- X-Forward-For ヘッダを付加する
- HTTPSの終端はリバースプロキシで行う
- サーバサイドHTTPS通信もできたら行う
運用中のサーバを移行してみた(2023/09/04追記)
リバースプロキシ(nginx)、Webサーバ、およびフォワードプロキシ(squid)を同一セグメントに設置した。当然のとこながらWebサーバへのアクセスはリバースプロキシを通して行うように設定しておく(名前関連も含めて)。その他リバプロの下に置くときに注意が必要なアプリケーション(WordPressなど)があるのでそれらも設定しておく。
クライアントは別セグメントにいるがフォワードプロキシ経由でアクセスすることでワンアーム環境を実現する。
結果
クライアント→フォワードプロキシ→リバースプロキシ→Webサーバでのアクセスを行ったときのログは、リバースプロキシのアドレスからアクセスされているように記録される。X-Forward-For ヘッダによってアクセス元アドレス(ほんもののアクセス元かどうかはわからないが)を記録することは可能。
とりあえず、ロードバランサーや他のリバプロとの違いは今のところわからないが、nginxのリバプロ機能を利用する場合はワンアーム型でもSNAT不要でただしく動作するということがわかったので満足。
コメント