web-dev-qa-db-ja.com

nginx:範囲内のランダムなIPアドレスへのproxy_bind

プロキシされたすべてのリクエストを特定の範囲のランダムなIPアドレスにバインドするプロキシをnginxで構成しようとしています。プロキシされたすべてのリクエストは、異なるIPアドレスから発信されます。

現在、以下に構成を掲載しています。ただし、何らかの理由で、構成が正常に読み込まれたとしても、nginxはポート80でリッスンしていません。サーバーにアクセスしようとすると接続が拒否されます。

私はこれについて間違っていますか?

server {
  listen 80;
  listen [::]:80;

  server_name my.server.name;

  location / {
    # proxy all requests to destination
    proxy_pass https://destination;

    # generate random IPv6 between IPv6Prefix::0 and IPv6Prefix::13
    set_by_lua_block $ip { return 'IPv6Prefix::' .. string.format('%x', math.random(0, 19)) }
    proxy_bind $ip;

    # keep connections alive
    proxy_http_version 1.1;
    proxy_set_header Connection '';
  }
}
2
Steffan Long

Nginxが同じサーバー上のポート80でリッスンしているかどうかをテストするには、次のコマンドを実行します。

Sudo netstat -nlp | grep nginx

Nginxに一致する結果が返され、ポート80でリッスンしていることが報告されます。それが機能する場合、次のテストはサーバー内からHTTP経由でNginxにアクセスすることです。

curl http://127.0.0.1

それが機能する場合、問題はファイアウォールまたはその他のネットワークの問題です。サーバー上のファイアウォールが着信HTTPを許可していることを確認します(実行している場合)。 AWSのような環境を使用している場合は、セキュリティグループルールがホストへの着信HTTPリクエストも許可していることを確認する必要がある場合もあります。

プロキシコードに関しては、プロキシバインドはローカル IPアドレスにバインドするためのものであることに注意してください。つまり、マシンにすでに割り当てられているIPアドレスです。これを機能させるには、Nginxを起動する前に実行する追加のコードが必要なようです。これは、OSとネットワークハードウェアがサポートしていると仮定して、ターゲット範囲内のすべてのIPアドレスをマシンに割り当てます。

それが安全な操作であるためには、同じIPアドレスを持つ2つのマシンブロードキャストが問題を引き起こす可能性があるため、すべてのIPアドレスも未使用である必要があります。

2
Mark Stosberg