sysctl コマンドはLinuxのカーネルパラメータをリアルタイムで確認・変更できるコマンドです。ネットワークのバッファサイズやTCPの挙動、セキュリティ設定まで、OSの動作を細かく制御できます。ただし、正しく永続化しないと再起動のたびに設定がリセットされるという落とし穴があります。
この記事では、sysctl コマンドの基本的な使い方から、/etc/sysctl.conf と /etc/sysctl.d/ を使った永続化の方法、セキュリティ強化のための実践設定まで解説します。実行環境はRHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・sysctl -a で現在のカーネルパラメータを全件確認できる
・一時変更は sysctl -w、永続化は /etc/sysctl.d/ への記述が正解
・sysctl --system で設定ファイルを即時反映できる
・IPフォワーディングやICMPリダイレクト無効化などセキュリティ設定は必須
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
sysctlとは何か?カーネルパラメータを動的に変更できる仕組み
Linuxカーネルは起動後も /proc/sys/ 以下のファイルを通じてパラメータを動的に変更できます。sysctl コマンドはこの /proc/sys/ へのアクセスをラップした便利なインタフェースです。たとえば、ネットワークのTCPバッファサイズを増やしてスループットを上げたり、IPv4フォワーディングを有効にしてルーター機能を持たせたりといったことが、OS再起動なしに実行できます。
ただし、/proc/sys/ への直接書き込みや sysctl -w での変更は「一時的」です。再起動すると元の値に戻ります。永続化するには設定ファイルに記述する必要があります。この区別をきちんと理解することが、sysctl を現場で正しく使うための第一歩です。
基本的な使い方
1. 現在のカーネルパラメータを確認する
全パラメータの一覧を表示するには -a オプションを使います。# 全パラメータを表示(出力が多いのでlessと組み合わせるのが実用的) sysctl -a | less # キーワードで絞り込む sysctl -a | grep tcp # 特定パラメータを直接確認 sysctl net.ipv4.ip_forward
# net.ipv4.ip_forward の確認 $ sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 # TCPウィンドウスケーリング関連を確認 $ sysctl -a | grep tcp_window net.ipv4.tcp_window_scaling = 1
2. カーネルパラメータを一時的に変更する(sysctl -w)
-w オプションで値を変更できます。この変更は即座に反映されますが、再起動すると元に戻ります。動作確認やトラブルシューティング時に便利です。# IPv4フォワーディングを有効化(ルーター機能が必要な場合) sysctl -w net.ipv4.ip_forward=1 # 確認 sysctl net.ipv4.ip_forward # 出力例: net.ipv4.ip_forward = 1 # TCPの最大バックログを変更 sysctl -w net.core.somaxconn=1024
# sysctl -w と同等の操作(直接書き込み) echo 1 > /proc/sys/net/ipv4/ip_forward # ドット区切りと / の関係 # sysctl のキー: net.ipv4.ip_forward # proc パス: /proc/sys/net/ipv4/ip_forward
3. カーネルパラメータを永続化する(/etc/sysctl.d/)
設定を再起動後も維持するには、設定ファイルに記述します。RHEL 9系 / Ubuntu 24.04 どちらでも /etc/sysctl.d/ 配下に独自ファイルを作るのが推奨の方法です。# /etc/sysctl.d/ に設定ファイルを作成(ファイル名は数字プレフィックスで読み込み順を制御) vi /etc/sysctl.d/99-custom.conf # 記述例 net.ipv4.ip_forward = 1 net.core.somaxconn = 1024 vm.swappiness = 10
# /etc/sysctl.d/ と /etc/sysctl.conf の内容を全て読み込んで反映 sysctl --system # 特定のファイルだけ反映したい場合 sysctl -p /etc/sysctl.d/99-custom.conf # 出力例(反映されたパラメータが表示される) net.ipv4.ip_forward = 1 net.core.somaxconn = 1024 vm.swappiness = 10
従来は /etc/sysctl.conf に書くのが一般的でしたが、現在は /etc/sysctl.d/ 配下にファイル名をつけて管理するほうが、OS標準設定との分離が明確になるためおすすめです。/etc/sysctl.conf を使っても問題ありませんが、/etc/sysctl.d/ のファイルは後から読み込まれるため優先度が高くなります。
実務でよく使うカーネルパラメータの設定例
1. ネットワークパフォーマンスの改善
Webサーバーやデータベースサーバーで高負荷時のコネクション問題を改善するための設定です。# TCPの接続キュー長を拡張(デフォルト128はWebサーバーには不足) net.core.somaxconn = 65535 # SYN接続のバックログを拡張 net.ipv4.tcp_max_syn_backlog = 65535 # TCPの再利用を許可(TIME_WAIT状態のコネクションを再利用) net.ipv4.tcp_tw_reuse = 1 # 受信・送信バッファの最大サイズ(バイト単位) net.core.rmem_max = 16777216 net.core.wmem_max = 16777216
2. セキュリティ強化のための設定
サーバーのセキュリティハードニングで必ず設定するパラメータ群です。# ICMPリダイレクトを無視(中間者攻撃対策) net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # ICMPリダイレクトを送信しない net.ipv4.conf.all.send_redirects = 0 # IPスプーフィング対策(逆方向パス検証を有効) net.ipv4.conf.all.rp_filter = 1 # SYNフラッド攻撃対策(SYN Cookies を有効) net.ipv4.tcp_syncookies = 1 # ブロードキャストへのICMPに応答しない(Smurfアタック対策) net.ipv4.icmp_echo_ignore_broadcasts = 1 # ルーターでない場合はIPフォワーディングを無効に保つ net.ipv4.ip_forward = 0
3. メモリとスワップの調整
# swappiness(スワップへの積極度。0=なるべく使わない、100=積極的に使う) # デフォルト60。データベースサーバーでは10以下が推奨 vm.swappiness = 10 # ダーティページをディスクに書き出す割合(デフォルト20) vm.dirty_ratio = 10 # OOM Killerの対象から重要プロセスを外す(プロセスのPIDで指定) # 例: mysqld を OOM Killer の対象外にする # echo -1000 > /proc/$(pgrep -f mysqld)/oom_score_adj
4. カーネル起動パラメータの確認(起動時のログから追う)
sysctlで変更できるのは起動後のパラメータです。起動時のカーネルパラメータ(GRUBで渡すもの)とは別物です。起動時間の分析にはsystemd-analyze で起動時間計測が役立ちます。# 現在の起動パラメータを確認(GRUBから渡されたもの) cat /proc/cmdline # 出力例(Rocky Linux 9の場合) BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-427.13.1.el9_4.x86_64 root=/dev/mapper/rl-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet
トラブルシュート・エラー対処
「sysctl: setting key "xxx": Read-only file system」が出た場合
コンテナ環境(Docker / LXC)や制限されたnamespace内では一部のカーネルパラメータが変更できません。# エラー例 $ sysctl -w net.ipv4.ip_forward=1 sysctl: setting key "net.ipv4.ip_forward": Read-only file system # 原因確認: コンテナ内かどうかチェック systemd-detect-virt # 出力例(Dockerコンテナ内の場合) docker
「sysctl --system」で設定が反映されない場合
# ファイルの読み込み順を確認(数字の大きいファイルが後から読まれ優先される) ls /etc/sysctl.d/ # 出力例 10-default.conf 99-custom.conf # 設定ファイルの書式エラーを確認 sysctl -p /etc/sysctl.d/99-custom.conf # エラー例(等号前後にスペースがない場合は問題なし。コロンは使えない) # sysctl: cannot stat /proc/sys/net/ipv4/ip_forward_wrong: No such file or directory # 設定が現在反映されているか確認 sysctl net.ipv4.ip_forward
設定変更後にネットワーク通信が不安定になった場合
# 現在値を確認してデフォルト値と比較 sysctl -a | grep net.core # デフォルト値の参考(カーネルバージョンで異なる) # net.core.somaxconn = 4096 (RHEL 9のデフォルト) # net.core.rmem_max = 212992 (デフォルト) # 一時的な変更を即座に元に戻す sysctl -w net.core.somaxconn=4096
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 全パラメータを確認 | sysctl -a |
| 特定パラメータを確認 | sysctl net.ipv4.ip_forward |
| 一時的に値を変更 | sysctl -w net.ipv4.ip_forward=1 |
| 設定ファイルを即時反映 | sysctl --system |
| 特定ファイルを反映 | sysctl -p /etc/sysctl.d/99-custom.conf |
| キーワードで絞り込み | sysctl -a | grep tcp |
sysctlを理解しても「設定が怖い」と感じていませんか?
カーネルパラメータは触り方を誤るとサーバーが不安定になります。正しい確認手順と変更の「型」を知っていれば安全に運用できますが、独学では落とし穴に気づきにくいものです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:typeコマンドでシェル組み込みと外部コマンドを区別する方法|whichとの違いやalias確認も
- 前のページへ:hostnamectlコマンドでLinuxのホスト名を変更する方法|static・transient・prettyの使い分けも
- この記事の属するカテゴリ:Linuxtips・Linuxコマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます