コンテンツへ移動
Secret Knock

knockd.confの例

knockdは/etc/knockd.confを読み込みます。このファイルには[options]セクションと、ドアごとのセクションがあります。各セクションには、シーケンス、時間制限、ノックしたアドレス(%IP%)に対して実行するコマンドを指定します。独自のポートを選び、例で使用されているポートは決して再利用しないでください。

数秒間SSHを開く

最も一般的な設定です。1回のノックでSSHを開き、knockdがcmd_timeoutの経過後に再び閉じます。ファイアウォールが確立済みの接続を許可していれば、すでに開いているセッションは引き続き使用できます。

[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
/etc/knockd.conf

開くためと閉じるための別々のシーケンス

タイマーを使用しない場合、閉じるシーケンスをノックするまでポートは開いたままになります。便利ですが、忘れやすいため、時間制限付きの設定をおすすめします。

[options]
    UseSyslog

[openSSH]
    sequence    = 7311:tcp,8822:tcp,9133:udp
    seq_timeout = 10
    tcpflags    = syn
    command     = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

[closeSSH]
    sequence    = 9133:udp,8822:tcp,7311:tcp
    seq_timeout = 10
    tcpflags    = syn
    command     = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
/etc/knockd.conf

ワンタイムシーケンス

固定のシーケンスを1つ使用する代わりに、knockdはシーケンスのファイルを読み込み、それぞれを一度だけ受け入れることができます。これにより、記録されたノックを再生できなくなります。Secret Knockは同じリストを保持し、ドアを開いたノックの後に次のシーケンスへ進みます。

[openSSH]
    one_time_sequences = /etc/knockd/ssh_sequences
    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

# /etc/knockd/ssh_sequences — one sequence per line, each used once
2222:udp,3333:tcp,4444:udp
5555:tcp,6666:udp,7777:tcp
8888:udp,9999:tcp,1111:tcp
/etc/knockd.confとシーケンスファイル

nftablesを使用する場合

nftablesを使用するシステムでは、knockdがタイムアウト付きでアドレスをセットに追加するようにします。対応するnftablesテーブルについては、SSHを隠すガイドを参照してください。

[openSSH]
    sequence      = 7311:tcp,8822:tcp,9133:udp
    seq_timeout   = 10
    tcpflags      = syn
    start_command = /usr/sbin/nft add element inet filter knocked4 { %IP% timeout 30s }
/etc/knockd.conf

編集後

  1. 1DebianおよびUbuntuでは、/etc/default/knockdでknockdがリッスンするインターフェイスを設定し(KNOCKD_OPTS="-i eth0")、knockdを再起動します。
  2. 2ノック中にjournalctl -u knockd -fを使用して、動作を確認します。
  3. 3Secret Knockでは、+ › ファイルから読み込むで、シーケンスを含む各セクションをドアとして読み込みます。ワンタイムシーケンスのリストは手動で入力してください。

GitHubですべての例を見る → このページのすべての設定をコピーしてすぐに使えます:github.com/mobilcomm/secretknock-examples(パブリックドメイン)。

よくある質問

TCPとUDPのどちらのステップを使用すべきですか?

どちらでも使用できます。両方を混在させると、ポートスキャンからシーケンスを推測しにくくなります。設定側で検証する場合、UDPステップではSecret Knockでペイロードを送信できます。

セットアップのガイド