ポートノッキングを解説
ポートノッキングでは、誰かが秘密を知っていると証明するまでサービスを見えない状態に保てます。このガイドでは、その仕組み、一般的な2つの実装であるknockdとfwknop、そして実際にノックが失敗する理由を説明します。
ポートノッキングの仕組み
ファイアウォールは保護対象ポートへのすべての接続を破棄するため、スキャナには何も見えません。小さなデーモンがファイアウォールに届くトラフィックを監視します。1つの送信元アドレスが期待どおりのパターンを生成すると、デーモンはそのアドレスを許可するファイアウォールルールを追加します。通常は短時間だけです。
このパターンがノックです。knockdでは、特定のポートへの接続試行を、特定の順序と時間制限内で行うシーケンスです。fwknopでは、暗号化された1つのパケットです。
knockd:ノックシーケンス
knockdはインターフェイスを監視し、/etc/knockd.confにあるシーケンスと接続試行を照合します。シーケンスにはTCPとUDPのポートを組み合わせられます。一致すると、knockdはコマンドを実行します。通常はノック元アドレス(%IP%)に対するiptablesまたはnftablesのルールです。
この例では、ノック元アドレスに対してSSHを開き、10秒後に再び閉じます。ファイアウォールが確立済み接続を許可していれば、既存のSSHセッションは継続します。
[options]
UseSyslog
[openSSH]
sequence = 7311:tcp,8822:tcp,9133:udp
seq_timeout = 10
tcpflags = syn
start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT 独自のポートを選び、公開されている例のポートは再利用しないでください。tcpflags = synにすると、knockdはSYNフラグを持つパケット、つまり接続試行の最初のパケットだけを数えます。
fwknop:Single Packet Authorization
fwknopはシーケンスを、暗号化(AES)されHMACで認証された1つのUDPパケットに置き換えます。サーバのfwknopdはこれを受動的に取得し、検証し、リプレイではないことを確認してから、パケット内のアドレスに対して要求されたポートを開きます。
fwknop --key-genでキーを生成し、サーバのaccess.confに設定します。Secret Knockは.fwknoprcからクライアント側の設定を読み込みます。
SOURCE ANY
OPEN_PORTS tcp/22
KEY_BASE64 <output of fwknop --key-gen>
HMAC_KEY_BASE64 <output of fwknop --key-gen>
FW_ACCESS_TIMEOUT 30 許可するアドレスは暗号化されたパケット内で送信されるため、SPAではパケット送信元とは異なるアドレスに対してポートを開けます。モバイルデータ通信中の電話から、別の場所にあるノートパソコン用にノックするときに便利です。
ノックが失敗する理由
- IPv4とIPv6:ノックは一方のアドレスファミリーで送信され、SSHはもう一方で接続しています。ファイアウォールは、現在使用していないアドレスに対してドアを開きました。
- 異なるパブリックアドレス:モバイルデータ通信、キャリアNAT、VPNの利用時には、サーバからは想定と異なるIPに見えます。ノック元のアドレスを確認してください。
- 再送されるSYN:TCPノックに応答がない場合、クライアントのOSは同じSYNを再送します。テストではknockd 0.8はこのような重複SYNでシーケンスをリセットしたため、クライアントは各ノックを1回だけ送信し、試行を速やかに停止する必要があります。
- タイミング:seq_timeoutの制限時間を過ぎて届いたノックや、順序が違うノックでは、シーケンスが最初からやり直されます。
- 中間機器:一部のネットワークでは一般的でないポートへのトラフィックを遮断または書き換えるため、自宅では動作するノックがホテルやオフィスのネットワークでは失敗することがあります。
安全ですか?
knockdシーケンスは暗号化されずに送信されるため、トラフィックを監視できる人は誰でもリプレイできます。SSHキーの代わりではなく、その前でスキャナからサービスを隠すために使ってください。fwknop SPAは暗号化、HMAC、リプレイ保護でこの弱点を解消し、トラフィックを監視される可能性がある場合にはより適した選択肢です。
iPhone、Mac、Apple Watchからノック
Secret Knockは、iPhone、iPad、Macからknockdシーケンスとfwknop SPAパケットを送信し、ポートからの応答を確認してSSHアプリを開きます。watchOSではアプリによる生のTCPまたはUDPパケット送信が許可されていないため、Apple Watchはペアリング済みのiPhone経由でノックします。iPhoneから離れているときは、有効にしたサーバへHTTP経由でSPAを送信できます。