ポートノックでドアが開かない理由
ノックがサーバに届いていない、デーモンが受け付けない形式で届いている、または使用していないアドレスに対してドアが開いている、のいずれかです。上から順に確認してください。原因の発生頻度順に並んでいます。
1. 別のアドレスに対してドアが開いた
ファイアウォールは、サーバが認識した送信元アドレスに対してポートを開きます。IPv6でノックし、その後SSHがIPv4で接続する場合、またはその逆の場合、使用していないアドレスに対してドアが開きます。モバイルデータ通信、キャリアNAT、VPNでもアドレスが変わります。
Secret Knockがホーム画面に表示するアドレス(「…からノックします」)とサーバログのアドレスを比較し、異なる場合はドアにIPv4またはIPv6を固定してください。
2. パケットがサーバに届かない
ホテル、オフィス、モバイルネットワークでは通常と異なるポートがブロックされることがあり、サーバの前段にあるクラウドファイアウォールが、knockdまたはfwknopdに届く前にパケットを破棄することがあります。ノック中にサーバでトラフィックを監視してください:
# knockd (UseSyslog): every recognised step and the command it ran
sudo journalctl -u knockd -f
# Do the packets reach the server at all? (use your interface and ports)
sudo tcpdump -ni eth0 'tcp port 7311 or tcp port 8822 or udp port 9133'
# fwknopd in the foreground with verbose output
sudo fwknopd -f -v 3. シーケンスが正しい形式で届かない
- 1再送されるSYN:TCPノックで応答がない場合、クライアントのオペレーティングシステムは同じSYNを再送します。knockd 0.8は、このような繰り返しを受けるとシーケンスをリセットします。Secret Knockは各TCPノックを単一のSYNとして送信し、直ちに試行を停止します。他のクライアントでは異なる場合があります。
- 2タイミング:すべてのステップは、順番どおりにseq_timeout以内に到着する必要があります。途中のルーターがパケットを並べ替える場合は、ステップの前に短い遅延を追加してください。
- 3プロトコル:UDPステップはUDPとして、TCPステップはTCPとして送信する必要があります。各ステップをknockd.confと照合してください。
- 4tcpflags = synを設定すると、knockdはSYNフラグのないTCPパケットを無視します。これがないと、同じポートへの接続に含まれる他のパケットもヒットとして数えられ、シーケンスが壊れる可能性があります。
4. fwknop:キー、時計、リプレイ
- 1両方のキーがaccess.confと一致している必要があります:RijndaelキーとHMACキー、および同じダイジェスト(デフォルトではSHA-256)。
- 2fwknopdはMAX_SPA_PACKET_AGE(デフォルトでは120秒)より古いパケットを拒否するため、デバイスの時計が大きくずれていると、すべてのパケットが古いものとして扱われます。
- 3各SPAパケットは1回だけ使用できます。fwknopdはリプレイされたパケットを意図的に破棄します。
- 4HTTP経由でノックする場合、そのポートでTCP接続を受け付けるものが必要です。そうでない場合、リクエストは送信されません。
5. ドアは開くが、SSHが失敗する
- 1ルール順序:デーモンが追加するルールは、ポートを破棄するルールより前に置く必要があります。iptables -Aは既存のDROPの後に追加するため、マッチしません。
- 2有効時間:SSHが接続する前にcmd_timeoutまたはFW_ACCESS_TIMEOUTによってドアが閉じられました。有効時間内に接続してください。ファイアウォールが確立済みの接続を許可していれば、確立済みのセッションは引き続き機能します。
- 3ノック後に行うSecret Knockのポートチェックでは、SSH認証とは別に、ポートが応答したかどうかを確認できます。
GitHubですべての例を見る → このページのすべての設定をコピーしてすぐに使えます:github.com/mobilcomm/secretknock-examples(パブリックドメイン)。
よくある質問
アプリが実際に送信した内容を確認するにはどうすればよいですか?
ドアの履歴には、各ノックの時刻、結果、アドレスファミリーが表示されます。エディタには、比較のためにコンピュータで実行できるターミナルコマンドとして同じノックが表示されます。