イントロダクション
ポートノッキングとは、昔のギャング映画で「ノックの合図」で扉を開ける仕組みに似ています。外部から見えるポートを閉じたままにしておき、事前に決めたポート列への接続(ノック)を正しい順序で行ったクライアントのIPだけを一時的に許可する方法です。
定義(1行): ポートノッキングは、シーケンス化されたポート接続をトリガーとしてファイアウォールルールを変更する認証補助手法です。
対象: Ubuntu / Debian 系サーバー(本文のコマンドは root 権限で実行します)。
重要: ポートノッキングは単独で万能ではありません。公開鍵認証やファイアウォールの基本設定と組み合わせて使うことを推奨します。
目次
- 必要条件と準備
- インストール手順(knockd, openssh-server, iptables)
- iptables ルールの作成と永続化
- knockd の設定と起動
- 接続テスト(telnet を用いたノック)
- 運用のベストプラクティスとセキュリティ強化
- 失敗パターンと代替アプローチ
- トラブルシューティングとロックアウト時の復旧手順
- テストケース、受け入れ基準、チェックリスト
- 用語集とまとめ
必要条件と準備
前提:
- Ubuntu または Debian 8 相当以上の環境
- root 権限または sudo が使えるユーザー
- サーバーへの物理アクセスまたはコンソールアクセスがあると安全
まず root に切り替えます。すべてのコマンドは root で実行してください。
sudo su
パッケージリストを更新します。
apt-get update
SSH が未インストールなら導入します。
apt-get install openssh-server
knockd をインストールします。
apt-get install knockd
(パッケージインストール中の標準出力例は本文に残しています。省略可能です。)
Alt: knockd のインストール中に表示される apt 出力のスクリーンショット
最後に iptables を導入します。
apt-get install iptables
iptables にルールを追加する手順
既存のファイアウォールルールをクリアしてから作業します。現在のSSH接続が切断されないように、既存の確立済み接続は許可します。
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPT
確立済みの接続を許可するルールを追加します。
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
注意: 上記のカンマ区切りの部分にはスペースを入れないでください。
次に、SSH(デフォルトのポート22)への直接接続をブロックします。
iptables -A INPUT -p tcp --destination-port 22 -j DROP
この時点で既存のSSHセッションは維持されますが、新しい直接接続は遮断されます。
iptables のルールを再起動後も維持するには iptables-persistent を導入して保存します。
apt-get install iptables-persistent
インストール中に IPv4 / IPv6 のルールを保存するか尋ねられるので、両方とも Yes を選択してください。
Alt: iptables-persistent インストール時に IPv4 保存を促すダイアログのスクリーンショット
Alt: iptables-persistent インストール時に IPv6 保存を促すダイアログのスクリーンショット
保存後、現在のルールセットをファイルにエクスポートして確認できます。
iptables-save
出力例(代表):
# Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1976]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Tue Feb 23 04:59:28 2016
knockd の設定方法
knockd の設定ファイルを編集します。
nano /etc/knockd.conf
Alt: nano で /etc/knockd.conf を開いたスクリーンショット
設定例:
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
各項目の説明:
- UseSyslog: knockd がシステムログへ書き込むようにします。
- sequence: ノックするポート列。上記は 7000 → 8000 → 9000 の順。
- seq_timeout: シーケンス完了までの許容時間(秒)。
- command: 正しいノックが完了した際に実行されるコマンド。%IP% はノッカーのIPに置換されます。
- tcpflags: 対象とする TCP フラグを指定。通常は syn が使われます。
セキュリティ上のポイント:
- デフォルトのポート列は攻撃者に知られている可能性があるため、必ず変更してください。
- シーケンスのポートはランダム化し、よく使われるサービスのポートと衝突しないようにします。
- seq_timeout を短くし過ぎると、ネットワーク遅延で失敗することがあります。自動化ツールを使う場合は 5~10 秒を目安に調整します。
knockd を自動起動する設定を行います。
nano /etc/default/knockd
以下を編集します。
START_KNOCKD=0
を
START_KNOCKD=1
に変更します。複数インターフェースがある場合は KNOCKD_OPTS で監視するインターフェースを指定できます。
手動で起動します。
service knockd start
これでノックによる iptables ルールの変更が有効になります。
ノックでサーバーへアクセスする方法
knockd を設定し、SSH を iptables でブロックしている場合、直接の SSH 接続はタイムアウトまたは接続拒否になります。ノックを実行してポートを一時的に開放してから SSH 接続します。
telnet を使ったノックの例
Linux では telnet をインストールします。
Windows では「プログラムと機能」から Telnet Client を有効化してください。
コマンド例(自分の IP とポート列に置き換えて実行):
telnet youripaddress 7000
telnet youripaddress 8000
telnet youripaddress 9000
seq_timeout が 5 秒ならば全てのノックを 5 秒以内に実行する必要があります。ノック成功後に SSH 接続を試みると接続できるはずです。
閉じるときは逆順でノックします。
telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000
重要: ノックスクリプトを自動化する場合、タイミングやパケットの内容に注意してください。単純な TCP ハンドシェイクだけでなく、UDP / ICMP を使う方法や単一パケットの認証(SPA)を使う実装も存在します。
運用上のベストプラクティス
- SSH は公開鍵認証のみに限定する。パスワード認証は無効化する。
- knockd のログを定期的に確認し、未知のノック試行を監視する。
- ノックに使うポートはランダム化し、頻繁に変更する運用ルールを検討する。
- ファイアウォールのバックアップ手順と、knockd が動作しない場合のフォールバック手順を用意する。
- 複数の管理者がいる環境では、ノックシークレット(ポート列)を安全に共有する仕組みを用意する。
失敗パターンと代替アプローチ
いつポートノッキングが機能しないか:
- パケットロスや遅延でシーケンスが時間内に完了しない。
- NAT やプロキシ越しの接続でクライアント IP が変わると %IP% が不正確になる。
- 攻撃者がノック列を観測して再利用できる場合(ノックは秘匿であることが前提)。
代替策:
- Single Packet Authorization(SPA): 一度に署名された単一パケットで認証する手法。より解析に強い。
- port knocking を補完する IDS/IPS や Fail2ban などの導入。
- VPN 経由で管理用ネットワークにのみ管理ポートを露出する方法。
利点の比較簡易表:
- ポートノッキング: 実装が容易で軽量。盗聴で列が漏れやすい。
- SPA: 安全性が高いが実装とキー管理が必要。
- VPN: 強力だが運用コストとインフラが増える。
トラブルシューティングとロックアウト時の復旧手順
緊急時の一般的なランブック:
- 別コンソールまたはホストの KVM/コンソールアクセスでログインする。
- iptables のルールを確認する。
iptables -L -n --line-numbers
- 誤った DROP ルールを削除する(該当ルール番号を指定)。
iptables -D INPUT <番号>
- 永続化されたファイルを修正する。
nano /etc/iptables/rules.v4
- knockd の設定を一時的に無効にするには /etc/default/knockd の START_KNOCKD を 0 に戻して再起動。
service knockd stop
重要: リモートでの作業時は常に別の管理セッションを開いてテストし、ロックアウトのリスクを軽減してください。
テストケースと受け入れ基準
テストケース例:
- 正常系1: 正しいポート列を 5 秒以内にノック → SSH に接続できる。
- 正常系2: 正しいポート列でノック後、指定時間だけ IP が許可されている(タイムアウトを設定する場合)。
- 異常系1: ポート列が間違っている場合は SSH に接続できない。
- 異常系2: seq_timeout を越えた場合は許可されない。
受け入れ基準:
- ノック成功時に /sbin/iptables のルールが追加されること。
- 不正なノックでは iptables のルールが変化しないこと。
- 永続化後にサーバー再起動しても基本構成が維持されること。
ロール別チェックリスト
管理者:
- knockd 設定ファイルのバックアップを作成する。
- シーケンスとタイムアウトを文書化する。
- シークレットの配布経路を暗号化する。
運用担当:
- knockd と iptables のログを週次で確認する。
- 定期的にノックのテストを行い、運用手順を検証する。
開発者:
- ノックを自動化するスクリプトを作成する場合はリトライと遅延を実装する。
インシデントランブック(ロックアウト復旧の手順)
短い手順:
- 物理コンソールまたはクラウドの緊急コンソールで接続。
- iptables の現状を保存してから問題のルールを一時削除。
iptables-save > /root/iptables-backup-$(date +%F-%T).txt
iptables -D INPUT -p tcp --destination-port 22 -j DROP
- knockd 設定を修正し、動作確認後にルールを再適用。
セキュリティ強化の提案
- knockd のログを rsyslog や外部ログサーバーへ転送して相関分析を行う。
- ノックの監査ログに基づくアラートを設定する(例: 短時間に多数のノック試行がある場合)。
- knockd の代わりに SPA ベースのソリューション(例: fwknop)を検討する。
- 管理アクセスは可能であれば VPN と併用する。
互換性と移行の注意点
- Debian 8 以降、Ubuntu の各バージョンで基本的な手順は同じです。ただしパッケージ名や systemd のサービス名が異なる場合があります。
- systemd 環境では service コマンドの代わりに systemctl を使うことがあります。
例:
systemctl start knockd
systemctl enable knockd
簡易フローチャート
以下は運用判断の簡易フローです。
graph TD
A[SSH がタイムアウトする] --> B{knockd が有効か}
B -- はい --> C{正しいノックを行ったか}
B -- いいえ --> D[knockd を有効にして再試行]
C -- はい --> E[SSH 接続成功]
C -- いいえ --> F[ノック列を確認し再試行]
D --> F
1行用語集
- knockd: ポートノッキングを実現するデーモン。
- SPA: Single Packet Authorization。単一パケットで認証を行う手法。
- iptables-persistent: iptables ルールを起動時に自動復元するパッケージ。
まとめ
ポートノッキングは比較的簡単に導入できる追加的なセキュリティ層です。しかし単独では限界があり、公開鍵認証、ログ監視、VPN、SPA の導入などと組み合わせることで実用的な防御となります。運用面ではバックアップ、テスト、緊急復旧手順の整備が重要です。
重要: 重要な運用変更をリモートで行う際は、常に復旧用の代替アクセス手段を確保してください。
短い告知文(運用向け):
ポートノッキングを導入しました。管理者は新しいノック列を受け取り、公開鍵認証の設定を確認してください。障害時にはクラウドコンソール経由での復旧手順を参照してください。