ポートノッキングとシングルパケット認証
公開ポートを完全に閉じたまま、許可した相手だけ通す方法が原理から分かります。ポートノッキングの仕組みと盗聴・リプレイ脆弱性、それを HMAC で塞ぐシングルパケット認証まで解説します。
- 1.ポートノッキングは閉じた複数ポートへ決められた順序でアクセス(ノック)した送信元にだけ、ファイアウォールが目的ポートを一時開放する仕組み。サービス自体を露出させない。
- 2.古典的ノックは合言葉が固定列なため経路上で盗聴・順序再生(リプレイ)でき、共有秘密が漏れる。NAT配下では複数送信元が混ざり順序が壊れる弱点もある。
- 3.シングルパケット認証(SPA)は単一の暗号化パケットに時刻・乱数・宛先・HMAC を詰め、改ざんとリプレイを排除する。fwknop が代表実装で、認証は1パケットで完結する。
開いているポートは攻撃面である
サービスを公開する以上、どこかのポートで待ち受け(LISTEN)が必要です。だが待ち受けているポートは、スキャンで存在を知られ、バナーから実装とバージョンを推定され、ゼロデイや認証回避の標的になります。SSH を 22 番で開けておくだけで、ボットの総当たりログが延々と積み上がるのは誰もが経験するところです。ポート番号とソケットの基礎は /network/socket-port/ を参照してください。
ここで発想を変えます。「正規ユーザーが来る瞬間だけポートを開け、それ以外は完全に閉じる」。スキャナから見れば閉じている(あるいはフィルタされて応答すら返らない)ので、そこにサービスがある事実すら隠せます。この 事前認証によるポート開放 を担うのが、ポートノッキングと、その発展形であるシングルパケット認証(SPA)です。
ポートノッキングの原理
ポートノッキングでは、サーバーは目的ポート(例 SSH の 22)をファイアウォールで DROP にして閉じ切ったまま、別の複数ポートへの着信を監視します。クライアントが決められたポート列へ順番にパケットを送ると、その「ノック列」を検知したデーモンがファイアウォールに動的ルールを差し込み、その送信元IPに対してだけ 目的ポートを一時開放します。
クライアント サーバー(22番は DROP のまま)
──► SYN to :7000 ┐
──► SYN to :8000 ├ 正しい順序のノック列を観測
──► SYN to :9000 ┘
→ iptables に「src=client へ :22 を ACCEPT」を追加
──► SYN to :22 → 今だけ通る(数十秒の時間窓)
監視側はポートを LISTEN する必要すらありません。ファイアウォールのログや libpcap でパケットの到着を観測するだけで成立します。つまりノック対象ポートは「開いている」のではなく、到着を記録しているだけです。これがスキャンに対して透明である理由です。閉じたフローを後から動的に許可する点は、ステートフルファイアウォールの動的ルールと同じ系譜にあります(/network/conntrack-stateful-firewall/)。
ノック列は本質的に共有秘密(合言葉)です。サーバーは送信元の正体を暗号的に検証しているわけではなく、「正しい順序を知っている誰か」が来たと判断しているにすぎません。この区別が、次に述べる脆弱性の根っこになります。
古典的ポートノッキングの脆弱性
ノック列を平文のポート番号の並びで運ぶ素朴な方式には、構造的な弱点が複数あります。
| 弱点 | なぜ起きるか | 帰結 |
|---|---|---|
| 盗聴 | ノックは平文のポート番号列。経路上の観測者にそのまま見える | 合言葉(ポート列)が漏れる |
| リプレイ | 同じ列をそのまま再送すれば再び開く。時刻や乱数で縛っていない | 盗聴した列をなぞるだけで開放できる |
| NAT 混信 | 同一グローバルIPの複数端末のノックが順序途中で混ざる | 正規ユーザーでも列が壊れ開かない |
| パケット欠落・並べ替え | 各ノックは独立パケット。途中欠落や順序逆転で列が崩れる | 再試行が必要で信頼性が低い |
| DoS | 他人のノックに1パケット割り込ませると列を壊せる | 正規認証を妨害できる |
とりわけ致命的なのが リプレイ です。攻撃者が経路上でノック列を一度観測できれば、それを録音して再生するだけで開放を再現できます。暗号で固めても、列全体が固定なら同じパケット列の再送が通ってしまいます。順序を運ぶために複数パケットへ分割していること自体が、観測・操作の表面積を広げているのです。
ノックを N 個のパケットに分けると、(1) 経路上で全パケットを観測されうる、(2) 1個でも欠落・順序逆転で失敗する、(3) 第三者が割り込みパケットを差し込んで順序を破壊できる、という三重苦を抱えます。「順序」という状態を経路に晒すこと自体が弱点なのです。
シングルパケット認証(SPA)の改良
SPA はこの問題群を、認証情報を1つのパケットに凝縮し、暗号で固める ことで解決します。ノックを複数ポートの順序で表すのをやめ、単一の UDP パケット(コネクションレスなので応答を返さず、スキャンに無反応のまま受信できる)に、認証に必要な情報をすべて詰めます。代表実装が fwknop(FireWall KNock OPerator)です。UDP の無応答性は /network/tcp-udp/ の通りです。
SPA パケットのペイロードには概ね次が含まれます。
- 乱数(ランダムデータ): 毎回異なる値。同一平文の再現を防ぎ、暗号文を毎回変える
- ユーザー名/タイムスタンプ: 鮮度の証明。受信側の時計と一定窓内かを検査
- 要求アクセス: 「この送信元IPへ TCP 22 を開けよ」という具体的指示
- メッセージ種別・バージョン
- 完全性タグ(HMAC): ペイロード全体の改ざんと出所を保証
これらを 暗号化(対称鍵 AES、または公開鍵 GnuPG)したうえで、さらに HMAC を付与して1パケットにまとめ、サーバーへ単発送信します。サーバーは復号→検証に成功して初めて、要求された開放ルールを投入します。
HMAC が効く理由
HMAC(Hash-based Message Authentication Code)は、共有鍵 K とメッセージ M から HMAC(K, M) を計算する鍵付きハッシュです。鍵を知らない者は正しいタグを作れず、1ビットでも M を変えればタグが一致しません。SPA は暗号化(秘匿)に加えて HMAC(完全性・出所認証)を重ねる Encrypt-then-MAC 構成を取り、次を同時に達成します。
- 改ざん検知: パケット内の要求IPやポートを書き換えると HMAC 検証で落ちる
- 正当な出所: 共有鍵を持つ者だけが有効なパケットを生成できる
- 復号前の門前払い: HMAC を先に検証すれば、復号処理にすら攻撃者のデータを通さずに済み、復号系の脆弱性露出を減らせる
暗号化は中身を隠しますが、暗号文の改ざんを必ずしも検知しません(モードによってはビット反転が平文に影響する)。HMAC は「鍵を持つ者が作った、改ざんされていないメッセージ」を保証する別の役割です。秘匿は暗号化、完全性・出所認証は HMAC、と役割を分けて両方かけるのが堅牢な設計です。
リプレイ耐性の作り込み
SPA がリプレイを防げるのは、パケットを 一意かつ短命 にしているからです。
- 乱数で暗号文を毎回変え、HMAC タグも毎回変わるようにする
- 受信側は過去に処理した SPA の ダイジェスト(ハッシュ)を記録 し、同一パケットの再送を検出して破棄する
- タイムスタンプ を含め、受信側の時計との差が許容窓を超えたものは古いとみなして拒否する。これにより記録の保持期間も有限にできる
結果として、攻撃者が経路上で SPA パケットをそっくり録音して再生しても、ダイジェスト重複で弾かれます。鮮度を時刻で縛る発想は、ネットワーク時刻同期(/network/ntp-internals/)の正確さが地味に効いてくる場面でもあります。なお、開放後の SSH 接続そのものは通常どおりTLS/SSH の認証を経るので、SPA は 多層防御の最前段(事前認証)として働きます。
SPA は通常「要求パケットの送信元IP」に対して開放します。だが UDP は送信元偽装が容易で(/network/ddos-amplification/ の偽装と同根)、攻撃者が正規クライアントのIPを騙って SPA を送り成功させると、その正規IPに穴が開きます。fwknop は要求内に「開放先IP」を明示できますが、偽装IP宛の開放を誘発される設計には注意が要ります。また開放の時間窓を長く取ると、その間に同一IP帯から相乗りされる隙が生まれます。窓は接続確立に足る最小限(数十秒)に絞り、確立後の接続は conntrack のステートで維持させるのが定石です。
ポートノッキングと SPA の比較
| 観点 | 古典的ポートノッキング | シングルパケット認証(SPA) |
|---|---|---|
| 伝送 | 複数ポートへの順序付きパケット列 | 単一の暗号化 UDP パケット |
| 秘匿 | なし(平文のポート番号) | AES/GnuPG で暗号化 |
| 完全性・出所 | なし | HMAC で保証 |
| リプレイ耐性 | 弱い(列の再送で開く) | 乱数・ダイジェスト記録・時刻窓で防御 |
| NAT/欠落への頑健性 | 弱い(順序が壊れる) | 強い(1パケットで完結) |
| 観測表面 | 広い(全ノックが見える) | 狭い(1パケットのみ) |
まとめ
ポートノッキングと SPA は、いずれも「待ち受けポートを露出しない」という同じ目的を、認証の堅牢さで隔てられた二世代として持ちます。古典的ノックは合言葉を平文のポート順序で運ぶため、盗聴とリプレイに脆く、NAT やパケット欠落でも壊れやすい。SPA は認証情報を単一パケットに凝縮し、暗号化で秘匿、HMAC で改ざんと出所を固め、乱数・ダイジェスト記録・タイムスタンプでリプレイを排除します。重要なのは、どちらも SSH 等の本来の認証を置き換えるものではなく、その手前に 追加の関門 を設けてサービスそのものをスキャンから隠す、多層防御の一段だという点です。穴を常時開けておくのでなく、正規の要求が暗号的に証明された瞬間だけ最小時間だけ開ける――この発想の転換が攻撃面を劇的に縮めます。
ネットワーク Article
ポートノッキングとシングルパケット認証を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ポートノッキング
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 6
導入後に効く点
古典的ノックは合言葉が固定列なため経路上で盗聴・順序再生(リプレイ)でき、共有秘密が漏れる。NAT配下では複数送信元が混ざり順序が壊れる弱点もある。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ポートノッキング / SPA」に近いか確認する。
- 強みである「ポートノッキングは閉じた複数ポートへ決められた順序でアクセス(ノック)した送信元にだけ、ファイアウォールが目的ポートを一時開放する仕組み。サービス自体を露出させない。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。