実現したいこと
ここに実現したいことを箇条書きで書いてください。
- nginxでIP直打ちをアクセス拒否したい
- サイトアクセスでIPアドレス直打ちを拒否したい
前提
使用しているWebサーバーはnginxで、IPアドレス直打ちした際に拒否したい
kusanagiのバージョンは9になります
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード
試したこと
/etc/opt/kusanagi/nginx/の中にある、nginx.default.confに以下実施したが解決せず
https://kamotora.net/system/nginx/nginx-default_server/
https://qiita.com/3S_Laboo/items/56886d2ec6083454a24c
https://supilog.supisupi.com/blog/xt8vj37f3r88/
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
- nginxでIP直打ちをアクセス拒否したい
- サイトアクセスでIPアドレス直打ちを拒否したい
後者の「サイトアクセスで」というのは、KUSANAGIの設定で拒否を実現したいということかと思います (違ったら言ってください)。つまりWAFの設定で拒否できるようにしたいということかと思いますが、nginxだとWAF機能はNAXSIというnginx用のモジュールで実現されているらしく、結局WAFのルールもnginxの設定に記述することになりそうです。拒否を実現するNAXSIルールを書くこともできるのかもしれませんが、ここはシンプルに素のnginxの設定で実現したいと思います。
次に「IP直打ち」とは何か、ですが、次のようなことを指すのではないかと考えます。
- クライアント側でアクセス先のURLを入力する際にホスト部にIPアドレスを指定している (
Host
リクエストヘッダフィールドの値がIPアドレス)。 - クライアントがホスト名を指定しない (
Host
リクエストヘッダフィールドを持たない) リクエストを送信してくる。 - 使用する予定のないホスト名やでたらめなホスト名を指定している。
このうち2.は簡易な実装のボットなどで起きそうですが、そういうクライアントのアクセスを予定していないのなら拒否してもいいでしょう。現在、通常のユーザが使うブラウザがこのようなリクエストを送信してくることはありません。
なお3.はIPアドレスではなくホスト名ではあります。ところが、IPアドレスを逆引きした結果のホスト名 (しばしばサービスに使うホスト名とは異なる) を送ってくるものや、完全によそのサイトのホスト名を送ってくるものもいたりします。まともなクライアントとは思えないので、拒否してもいいと思います。
次に拒否の方法ですが、「nginxでエラーページを表示する」とのことなので、接続を切断したりするのではなく、なんらかのエラーを示すHTTPステータスコードを返すのがよさそうです。
今回の拒否に一番適切なのは421 Misdirected Request
でしょうか。上記の説明には次のように述べられています。
421 Misdirected Request
リクエストは、レスポンスを生成できないサーバーに送られました。 リクエストの URI に含まれているスキームや権限の組み合わせに対してレスポンスを生成するよう設定されていないサーバーが、このコードを送ることがあります。
では、設定を考えていきます。
Host
リクエストヘッダフィールドの値が特定のIPアドレスのものを拒否
既存の設定に、次の設定を追加します。server { listen 80; server_name 203.0.113.1; return 421; }
- 上記1.に加えて、
Host
リクエストヘッダフィールドが指定されないものを拒否
既存の設定に、次の設定を追加します。
上の設定とは、server { listen 80; server_name 203.0.113.1 ""; return 421; }
""
の有無が異なるだけです。「""
」はHost
リクエストヘッダフィールドがないことを意味します。 - 上記1.、2.に加えて、使用しないホスト名を指定しているものも拒否。
既存の設定に、次の設定を追加します。
なお、ポートが同じでserver { listen 80 default_server; server_name _; return 421; }
default_server
になっているserver
節が別にある場合、そちらには明示的にserver_name
を割り振った上でdefault_server
を取り除く必要があります。
server_name _;
はホスト名が「_
」になるという意味ではなく、「その他なんでも」という意味になります。nginxのドキュメントによれば、ホスト名として有効でないものであれば「--
」とか「!@#
」なんかでも同じ意味になるということです。
つまり、クライアントが指定したホスト名をほかのserver
節で見つけられなかった場合、(それがIPアドレスでもそうでなくても) すべてこのserver
節で処理されます。
余談
今回の質問のテーマからやや外れますが、3.には、TLS (https) を使う場合は穴があります。SNI (TLS Server Name Indication) でTLSネゴシエーション中に決まるホスト名と、その後送られたリクエストのホスト名とが異なる場合、nginxでは後者がホスト名として認識されます。つまり、サーバ証明書のホスト名とは異なるホスト名のサービスにアクセスできてしまうおそれがあります。
これを防ぐためには、TLSを提供するserver
節ではSNIホスト名とリクエストのホスト名が一致するかどうかをテストする必要があると思います。
server { listen 443 ssl; ... if ($ssl_server_name != $host) { return 421; } ... }
投稿2023/09/01 03:03
総合スコア4441
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/01 09:19
2023/09/01 23:55 編集
2023/09/07 02:20
0
ポート番号は適宜変更してください。
server {
listen 80 ;
server_name _;
return 444;
}
投稿2023/08/31 11:11
総合スコア39
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/01 02:18
2023/09/01 02:45
2023/09/01 06:39
2023/09/01 11:07
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。