nginxで全ポートをlistenする

nginxで全ポートをlistenする方法です。
実験がてら作ってみた方法ですから、実際にこのような事をしたい場合は、
iptablesでREDIRECTする方が良いでしょう。

この手法を取ると、システム全体でネットワーク接続を発生できなくなります。

今回はどうしてもserver_portを利用したかったので、
このような力業を利用しました。

環境

  • Debian 12 Bookworm
  • nginx-full 1.22.1-9+deb12u1 (Debianのパッケージ)

ポート利用状況の確認

下記のコマンドでポートをLISTENしているプロセスが無いか確認します。
もしLISTENしているプロセスがあれば、そのポートを利用しない事を選択するか、
LISTENしているプロセスの停止を検討してください。

lsof -i | grep LISTEN

nginxのインストール

今回は、server_tokenoffにしたいため、nginx-fullをインストールします。

apt install nginx-full

nginxの設定

まず、nginx.confserver_tokens off;をコメントアウトし、
サーバのバージョン情報などを秘匿します。

65535ポートをv4とv6でlistenするため、
worker_connectionsworker_rlimit_nofileを余裕を持って200000に設定します。

worker_rlimit_nofileはファイル先頭のworker_processesあたりに、
worker_connectionseventsセクションに設定します。

limits.confの設定

/etc/security/limits.confwww-dataユーザの最大ファイル数を設定します。
先ほど設定した、worker_rlimit_nofileの値よりも大きい値を設定してください。

www-data soft nofile 200000
www-data hard nofile 200000

sysctlの設定

/etc/sysctl.confに下記の設定を追加します。
先ほどと同じように、fs.file-maxの値は、worker_rlimit_nofileの値よりも大きい値を設定してください。

fs.file-max = 200000

設定変更後、下記のコマンドで適用します。
この後再起動をするので、下記のステップは省略しても良いです。

sysctl -p

systemdの設定

/etc/systemd/system.conf[Manager]セクションにある、DefaultLimitNOFILEを設定します。
この値も、worker_rlimit_nofileの値よりも大きい値を設定してください。

[Manager]
# 省略
DefaultLimitNOFILE=200000

コメントアウトされている行ですから、コメントアウトして編集しても良いですし、
最後の方に追記してもかまいません。

サイトの設定

listenディレクティブは下記のようになります。
この例では、listenしたいインターフェイスのIPアドレスを1.2.3.4cafe::1:2:3:4にしています。
環境に応じて変更してください。

listen 1.2.3.4:1-65535;
listen [cafe::1:2:3:4]:1-65535;

システムの再起動を行う

limites.confsystemdの設定を行ったので、再起動を行います。
デフォルトでnginxが起動するはずですから、動作確認も同時に行ってください。

参考サイト

  • https://www.antitree.com/2017/06/running-nginx-on-all-ports/
  • https://unix.stackexchange.com/questions/366352/etc-security-limits-conf-not-applied
  • https://serverfault.com/questions/279262/nginx-proxy-a-large-port-range-to-equivalent-port-on-a-different-ip-address

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です