GNU/Linux >> Linux の 問題 >  >> Linux

高負荷用のsysctl設定とDDoS防止

はじめに

インターネット上には、多数の接続、高負荷の Web プロジェクト、および DDoS 攻撃への対策をサポートする Linux カーネル構成のさまざまな例が数多くあります。これは、私がすでに実際に試すことができた別の例です。私はすぐに言います – それは私を助けた以上のものです.試してみてください。

/etc/sysctl.conf オプション

/etc/sysctl.conf に追加する必要があるオプションのリストがあります :

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.netfilter.ip_conntrack_max = 16777216
net.netfilter.nf_conntrack_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 16777216

次に、各オプションについて詳しく説明します。

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0

ICMP リダイレクト パケットを受け入れたり送信したりしません。 ICMP リダイレクトは、攻撃者がルーティング テーブルを変更するために使用できます。 「0」に設定することをお勧めします。このユニットは、ルーターとして使用されるホストに対してのみ意味があります。

net.ipv4.tcp_max_orphans = 65536

tcp_max_orphans パラメータの整数値は、ユーザー ファイルハンドルによって接続されていない、システム内の有効な TCP ソケットの最大数を決定します。しきい値に達すると、孤立した化合物はすぐにリセットされ、警告が表示されます。このしきい値は、単純な DoS 攻撃のみを防ぐのに役立ちます。しきい値を小さくしないでください (メモリを追加した後など、システムの要件に従って値を大きくする必要があります。各孤立接続は、約 64 キロバイトのスワップ不能メモリを吸収します)。

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 10

tcp_fin_timeout パラメータは、ソケットがローカル側によって閉じられた後、ソケットが FIN-WAIT-2 状態のままになる時間を決定します。パートナーはこの接続を閉じることはできないため、タイムアウト後に自分の意思で閉じる必要があります。デフォルトでは、タイムアウトは 60 秒です。 2.2 シリーズのコアでは、通常 180 秒の値が使用され、この値を保存できますが、ロードされた WEB サーバーでは、半分壊れたデッド接続を保存するために大量のメモリを消費するリスクがあることを忘れないでください。 FIN-WAIT-2 状態のソケットは FIN-WAIT-1 よりも危険性が低くなります。これは、メモリを 1.5 K バイトしか消費しないためですが、より長く持続する可能性があります。

tcp キープアライブ時間

net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5

tcp_keepalive_time 変数は、接続が長期間使用されていない場合に接続をチェックする頻度を決定します。変数の値は、SO_KEEPALIVE フラグで作成されたソケットに対してのみ意味があります。整数変数 tcp_keepalive_intvl は、サンプリング間隔を定義します。製品 tcp_keepalive_probes * tcp_keepalive_intvl は、応答がない場合に接続が切断されるまでの時間を決定します。デフォルトでは、間隔は 75 秒です。つまり、応答がない場合の切断時間は約 11 分です。

net.ipv4.tcp_max_syn_backlog = 4096

tcp_max_syn_backlog ファイルの整数値は、接続しているクライアントから確認を受け取っていない、記憶されている接続要求の最大数を定義します。サーバーで過負荷が発生した場合は、この値を増やしてみてください。

net.ipv4.tcp_synack_retries = 1

整数値 (1 バイト) tcp_synack_retries は、パッシブ TCP 接続の SYNACK パケットを送信するための再試行回数を決定します。試行回数は 255 回を超えてはなりません。値 5 は、接続の確立を試みるための約 180 秒に相当します。

net.ipv4.tcp_mem

net.ipv4.tcp_mem = 50576   64768   98152

tcp_mem ファイルのベクトル (最小、負荷モード、最大) 変数には、TCP プロトコルの一般的なメモリ消費設定が含まれています。この変数は、バイトではなくページ (通常は 4kb) で測定されます。

最小 :TCP プロトコル構造の合計メモリ サイズがこのページ数より少ない間、オペレーティング システムは何もしません。

ロード モード :TCP プロトコルに割り当てられたメモリ ページの数がこの値に達するとすぐに、オペレーティング システムがメモリの割り当てを制限しようとするロード モードがアクティブになります。このモードは、メモリ消費量が再び最小レベルに達するまで維持されます。

最大 :すべての TCP ソケットに許可されるメモリ ページの最大数。

net.ipv4.tcp_rmem

net.ipv4.tcp_rmem = 4096 87380 16777216

tcp_rmem ファイルのベクトル (最小、デフォルト、最大) 変数には、TCP ソケット受信バッファーのサイズを決定する 3 つの整数が含まれています。

最小 :各 TCP ソケットには、作成時にこのメモリを使用する権利があります。このようなバッファを使用する機能は、制限のしきい値 (中程度のメモリ プレッシャ) に達した場合でも保証されます。デフォルトの最小バッファ サイズは 8 KB (8192) です。

デフォルト値 :デフォルトの TCP ソケット転送バッファに許可されるメモリの量。この値は、他のプロトコルで使用される /proc/sys/net/core/rmem_default パラメータの代わりに使用されます。デフォルトのバッファ値 (通常) は 87830 バイトです。これにより、tcp_adv_win_scale のデフォルト値と tcp_app_win =0 で 65535 のウィンドウ サイズが決定され、tcp_app_win のデフォルト値よりも若干小さくなります。

最大 :TCP ソケットを受信するために、最大バッファ サイズを自動的に割り当てることができます。この値は、/proc/sys/net/core/rmem_max ファイルで指定された最大値をキャンセルしません。 SO_RCVBUF を使用した「静的」メモリ割り当てでは、このパラメータは重要ではありません。

net.ipv4.tcp_wmem

net.ipv4.tcp_wmem = 4096 65536 16777216

tcp_wmem ファイルのベクトル変数には、TCP ソケット転送バッファー用に予約されているメモリの最小、デフォルト、および最大量を定義する 3 つの整数値が含まれています。

最小 :各 TCP ソケットには、作成時にこのメモリを使用する権利があります。デフォルトの最小バッファ サイズは 4 KB (4096) です

デフォルト値 :デフォルトの TCP ソケット転送バッファに許可されるメモリの量。この値は、他のプロトコルで使用される /proc/sys/net/core/wmem_default パラメータの代わりに使用され、通常は /proc/sys/net/core/wmem_default より小さくなります。デフォルト バッファのサイズは、通常 (デフォルト) 16 K バイト (16384) です。

最大 :TCP ソケット送信バッファに自動的に割り当てることができるメモリの最大量。この値は、/proc/sys/net/core/wmem_max ファイルで指定された最大値をオーバーライドしません。 SO_SNDBUF を使用した「静的」メモリ割り当てでは、このパラメータは重要ではありません。

net.ipv4.tcp_orphan_retries =0

整数値 tcp_orphan_retries は、失敗した試行の回数を決定します。その後、ローカル側で閉じられた TCP 接続が破棄されます。デフォルト値は 7 です。これは、RTO に応じて、およそ 50 秒から 16 分の期間に相当します。負荷の高い WEB サーバーでは、閉じた接続が多くのリソースを消費する可能性があるため、このパラメーターの値を減らすことは理にかなっています。

net.ipv4.tcp_syncookies =0

カーネル開発者の推奨に関連して、このオプションを無効にすることをお勧めします。

net.ipv4.netfilter.ip_conntrack_max =16777216

接続追跡メカニズムが機能するための接続の最大数 (iptables などを使用)。値が小さすぎる場合、カーネルはシステム ログ内の対応するエントリで受信接続を拒否し始めます。

net.ipv4.tcp_timestamps =1

TCP タイムスタンプを許可します。それらの存在により、深刻な負荷の下でプロトコルの動作を制御できます (tcp_congestion_control を参照してください)。

net.ipv4.tcp_sack = 1

TCPIP サポートの選択的確認を許可します。このオプションは、一部のネットワークで利用可能なすべての帯域幅を効率的に使用するために必要です。

net.ipv4.tcp_congestion_control = htcp

TCP ネットワークでの負荷制御に使用されるプロトコル。 RedHat カーネルとそのクローンのほとんどのバージョンでは、デフォルトの bic および cube 実装にバグが含まれています。 htcp の使用をお勧めします。

net.ipv4.tcp_no_metrics_save = 1

キャッシュが閉じているときに、TCP 接続の測定値をキャッシュに保存しません。場合によっては、生産性の向上に役立ちます。

IP スプーフィングからの防御

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

ソース ルーティングを無効にする

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 1024 65535

発信接続に使用できるローカル ポートの範囲を広げます。

net.ipv4.tcp_tw_reuse = 1

プロトコルがこれを安全と見なす場合、TIME-WAIT ソケットの再利用を許可します。

net.ipv4.tcp_window_scaling = 1

TCP スタック ウィンドウの動的なサイズ変更を許可します。

net.ipv4.tcp_rfc1337 = 1

TIME_WAIT 攻撃からの防御。

net.ipv4.ip_forward = 0

ルーターではないため、パケット転送を禁止します。

net.ipv4.icmp_echo_ignore_broadcasts = 1

ブロードキャスト パケットで送信された ICMP ECHO リクエストには応答しません。

net.ipv4.icmp_echo_ignore_all = 1

ICMP ECHO リクエストにまったく応答できません (サーバーは ping を実行しません)。

net.ipv4.icmp_ignore_bogus_error_responses = 1

誤った形式のメッセージには応答しません。

net.core.somaxconn = 65535

接続を待機しているオープン ソケットの最大数。デフォルト値を増やすことは理にかなっています。

net.core.netdev_max_backlog = 1000

このパラメーターは、カーネルがパケットを処理できるよりも速くインターフェイスがパケットを受信した場合に、処理キュー内のパケットの最大数を決定します。

メモリ最大デフォルト

net.core.rmem_default = 65536

すべての接続のデフォルトのデータ受信バッファ サイズ。

net.core.wmem_default = 65536

すべての接続のデフォルトのデータ転送バッファ サイズ。

net.core.rmem_max = 16777216

すべての接続のデータ受信バッファーの最大サイズ。

net.core.wmem_max = 16777216

すべての接続の最大データ バッファー サイズ。


Linux
  1. LinuxでのGrafanaのインストールとセットアップ

  2. Atlantic.NetFAQのために書く

  3. アプリケーションと負荷テストのガイドライン

  1. ライセンスエラーを防ぐために、Windows2008およびWindows2008R2のクラウドサーバーにライセンスサービスをインストールします

  2. Ubuntu 20.04 での SFTP のセットアップと SSH の防止

  3. Bash の For ループと While ループの例

  1. Oracleasm 用の SELinux モジュールをロードする方法

  2. docker コンテナーの net.core.somaxcomm (または任意の sysctl プロパティ) を更新します。

  3. Linux 上の .NET Core 用 NuGet