リバースプロキシ(reverse proxy)とソースナット(SNAT)

nginx

オンプレ環境で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ヘッダを付加

つづいて、X-Forward-Forをヘッダを付加するように設定すると、X-Forward-For ヘッダによってアクセス元アドレス(ほんもののアクセス元かどうかはわからないが)を記録することは当然ながら可能であった。

暗号化

リバプロでの暗号化、リバプロ・Webサーバ双方での暗号化のどちらでも正常に動作した。

SNATは?

nginxのリバプロではSNAT設定は不要であった。

とりあえず、ロードバランサーや他のリバプロとの違いは今のところわからないが、nginxのリバプロ機能を利用する場合はワンアーム型でもSNAT不要でただしく動作するということがわかったので満足。

コメント

タイトルとURLをコピーしました