最近の砂場活動その7: Nginxで特定のパスはVPC内からしか接続できないようにする

しょうもないことですが、Nginx初心者なので自分用メモです。用語とか色々間違ってるかもしれない...。

Client => ALB => Nginx => Appのような構成を考える。ヘルスチェックやサーバーの特定の負荷状況を返すエンドポイント(こういうやつ)が存在し、これはAppから返す。これらは普通のユーザーには見せたくなくて、ALBやVPC内部からのみ参照されたい、というユースケース。ALBで細かいことは難しそうなので、Nginxで制御したい。

VPC範囲内のipからのアクセスであれば拒否すればいいじゃんと思ったけど、Nginxに渡ってくるipは何もしないとALBのipが渡ってきてしまう。このままでは素通ししてしまうので、Clientのipを渡して欲しい。remote_addrというのを変更してあげるようにすればよいらしい。それを実現するNginxの設定は例えばこんな感じ。

server {
    listen 7777 default_server;

    set_real_ip_from 10.0.0.0/16;
    real_ip_header X-Forwarded-For;

    location /api/(server_avail|stats) {
        proxy_pass http://local-backend;
        allow 10.0.0.0/16; # 内部ネットワークのみ許可
        deny all;
    }
}

リバースプロキシってやつだ。

これでALBやVPC内に立てたEC2インスタンスからは/api/statsなどが参照でき、VPC外からは403が返るようになった。ちょいちょい練習して、Nginxのconfファイルを見ても頭が真っ白にならないようにしたい...。

困ったこと

Nginxの設定、自信がないので手元で動作確認をしたりテストを書いたりしたいけど、どうするのがいいのか...。趣味のやつだと気軽に本番をぶっこわすけど、仕事だとそうもいかない。

参考

nginx実践入門 (WEB+DB PRESS plus)

nginx実践入門 (WEB+DB PRESS plus)