5911


こんにちは。

私は、sudoしていないnginxでport 80を受け付けるため、xinetdでポートフォワーディングを行っています。

[code]

    service nginx
    {
      disable = no
      type = UNLISTED
      socket_type = stream
      protocol = tcp
      wait = no
      user = root
      port = 80
      redirect = 127.0.0.1 8000
      log_type = FILE /var/log/xinetdlog
    }
    
[/code]

xinetd.d 内の設定は以上のように行いました。  
この設定で、ポートフォワーディング 80->8000 はうまく成されました。

しかし、8000で受け取っているnginx側のlogのアクセス元IPがすべて127.0.0.1となってしまいます。  
これを、実体IP(xinetdのport 80にアクセスしてきたユーザーのIP)にしたいと考えています。

nginx.confにおける $proxy_add_x_forwarded_for にX-Forwarded-
ForのIPが記録されているのではないかと期待しましたが、nginx側のlog formatに指定したところ、中身は127.0.0.1となっていました。

XinetdにはX-Forwarded-Forを出力する機構は備わっていないのでしょうか？


CC BY-SA 3.0
2015-02-03T03:18:09.130
5821
2015-02-04T02:46:34.460
2015-02-03T03:51:20.577
8050
8050
question
nginx
xinetdでポートフォワーディングした後、nginxで実体IPを受け取りたい


`xinetd` を通して redirect した場合、redirect 先のプロセスは接続元の IP
を直接知ることはできません。透過的に接続させたい場合は、`xinetd` を使わず `iptables` 使用するのが良いでしょう。
`X-Forwarded-For` ヘッダを付加するなどして、 HTTP プロトコルの範囲でクライアント IP
を知らせたければ、最低リバースプロキシを用意する必要があります。

プロキシを使用したいとなれば、 nginx が軽くてよいです。別ポートを受付にして、以下のように [`proxy_pass`
ディレクティブ](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass)付きで立ち上げる設定をします。

[code]

    # /etc/nginx/conf.d/proxy-80-to-8000.conf
    
    server {
        listen       80;
        location / {
            proxy_pass              http://127.0.0.1:8000;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Client-IP     $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    
[/code]

ローカルの別ポートを向いたプロキシとして nginx を使うとなると、根本的なこととして「なぜ HTTP サーバ側があらかじめポート 80
を開けていないのか」という疑問が発生しますが、アクセスログが分けられますし、[ロードバランシング](http://nginx.org/en/docs/http/load_balancing.html)用途に簡単に切り替えられるので、その辺で意味があるのかなと思います。


CC BY-SA 3.0
2015-02-04T02:46:34.460
5911
2015-02-04T02:46:34.460
4978
5821
answer