特定のサーバー名といくつかのロケーションディレクティブで80個のポート要求をリッスンするサーバーブロックがあります。一致しないリクエストをnginxに受信していないかのように処理させるにはどうすればよいですか?つまり、タイムアウトになりますか?現在、これらのリクエストは404エラーで処理されています
3 に答える
すべてのリクエストを無視し、nginxに何も応答しないように指示する方法があります。
server {
listen 80 default_server;
return 444;
}
ここに記載されています:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
非標準コード444は、応答ヘッダーを送信せずに接続を閉じます。
一致しないリクエストをnginxに受信していないかのように処理させるにはどうすればよいですか?つまり、タイムアウトになりますか?
時計をほどくことはできません。(TLS-SNIやHost
ヘッダーから)要求されているサーバー名を見つけるには、nginxが最初accept
に接続する必要があります(これにより、オペレーティングシステムのTCP/IPスタックがSYN-ACKパケットをリクエスターに送り返します。 TCPハンドシェイクを進めるため)。接続が受け入れられると、反対側は何かがリッスンしていることを認識します。したがって、接続タイムアウトの機会はすでに見過ごしています。
その機会を取り返しのつかないほど失ったので、あなたが持っている次の機会は、ソケット受信タイムアウトを打つことです。クライアントはサーバーが何かで応答するのを待っているので、理論的にはまったく応答しないことで受信タイムアウトをトリガーできます。現在、標準のnginxには、そこに座ってしばらく何もしないように指示するメカニズムはありませんが、別のソフトウェアを使用する場合は、proxy_pass
ディレクティブなどを使用して、その責任を別のサーバーにオフロードできます。 。ただし、これにより、接続の存続期間中、サーバーが使用しているオペレーティングシステムリソースの量が維持されることに注意してください。Nginxは生のパケットではなくソケットで動作し、オペレーティングシステムがそれらのソケットを管理します。
質問に答えたので、質問の前提に質問したほうがいいと思います。なぜクライアントをタイムアウトさせたいのですか?悪意のある攻撃者を混乱させる、または「返済」することが目標である場合、nginxは間違ったツールです。これはコンピュータセキュリティの領域であり、ネットワークスタックの下位層で動作するツールを使用する必要があります。Nginxは、ハニーポットではなく、Webサーバーとして設計されています。
サーバーがリッスンしているという事実を単に隠すことが目標である場合、HTTPが現在機能している方法で目標を達成することは不可能です。ファイアウォールは、接続が受け入れられる前に接続を拒否することによってのみ、そのようなゴースティングを実現できます。したがって、TCPハンドシェイクは進行せず、SYN-ACKパケットはクライアントに返送されず、ポート全体がブラックホールであることが誰にでもわかる限りです。ただし、要求されたサーバー名を判別した後でこれを行うことはできません。IPアドレスとポートは、最初のパケットから利用できます。サーバー名はそうではありません。
それほど遠くない将来、HTTPはTCPの代わりにUDPを使用する可能性があり、要求パラメーター(サーバー名など)は最初のパケットで前もって提示される可能性があります。ただし、それが標準にならない限り、上記の状況は維持されます。
悪意のあるリクエストをそらそうとしていると思います。このようなものが機能する可能性があります(テストされていません)。
デフォルトのサーバーをセットアップし(既存のサーバー名と一致しない要求をすべてキャッチします)、クライアントをそれ自体にリダイレクトします。
server {
listen 80 default_server;
rewrite ^ http://127.0.0.1/;
}
有効なサーバーブロック内の無効な場所についても、同様のキャッチオールを設定する必要があります。あなたが望むよりも頭痛の種かもしれません。
これが実際にどれほど役立つかはわかりません。あなたのログを監視し、ファイアウォールでクライアントを禁止することができるfail2banまたは他のツールを検討する方が良いかもしれません。