グローバル IPv6 と元ポートへの直接アクセス
直接接続モードでは、利用者が先にゲートウェイでログインし、IP 許可リストに基づいて fnOS やその他のサービス本来のポートへ接続します。元のポート番号での接続が本当に必要な IPv6 環境向けであり、Web サービスを公開する際の第一選択ではありません。
このモードでは fn-knock がホストのファイアウォールを管理するため、fnOS ネイティブ FPK またはホスト管理機能を持つ OpenWrt でのみ利用できます。Docker、Synology DSM 7 SPK、Windows は直接接続モードに対応していません。
前提条件
- 機器にインターネットからルーティング可能なグローバル IPv6 アドレスがある。
- ルーターとホストのファイアウォールで、ゲートウェイ入口への IPv6 トラフィックを許可できる。
- AAAA レコードを用意済みか、DDNS で AAAA を更新できる。
- 動作確認に使える、同じ LAN の外にある IPv6 クライアントがある。
- ログイン復旧に使える認証情報を少なくとも 1 つ用意している。
まず、機器側と外部ネットワーク側の両方でアドレスファミリーを確認します。機器に fe80::/10 のリンクローカルアドレスや ULA(ユニークローカルアドレス)が付いていても、グローバル IPv6 があるとは限りません。AAAA レコードは、機器に現在割り当てられているルーティング可能なグローバルアドレスを指す必要があります。家庭用回線で IPv4 NAT のポートフォワーディングが不要な場合でも、ルーターの IPv6 受信ファイアウォールがデフォルトで接続を拒否していることがあります。
次の復旧情報を記録してから、モードを切り替えます。
- fn-knock の管理入口と LAN 内アドレス。
- 現在のファイアウォール設定のバックアップ。
- ゲートウェイ入口と、保護するサービス本来のポート。
- LAN 内または機器のコンソールからルールを復元する方法。
設定手順
DDNS 管理でIPv6 のみ更新を選びます。アドレス取得元は自動選択のままでも、実際の外部向けインターフェースへ固定しても構いません。Docker では、このチュートリアルの直接接続モードを利用できません。- 同期を待ってから外部 DNS で AAAA を引き、古いプレフィックス、一時アドレス、別の機器ではなく、現在の機器のグローバル IPv6 が返ることを確認します。
- ルーターの IPv6 ファイアウォールでは、fn-knock のゲートウェイ入口だけを許可します。保護対象の元ポートを事前に広く許可すると、動的な IP 許可を迂回するため避けてください。
システム設定 → モードで直接接続モード(非推奨)を選びます。確認事項を読み、保存します。システムがモードに合わせてファイアウォールルールを同期します。認証で TOTP またはユーザー名とパスワードを作成し、システム設定 → セッションでログイン後の IP 許可を「セッションに連動」または必要な固定時間に設定します。- ゲートウェイドメインに HTTPS 証明書を設定します。証明書は実際にアクセスする Host をカバーする必要があります。自動 HTTPS の発行・配置条件は TLS 証明書と HTTPSを参照してください。
- 外部ネットワークから
https://auth.example.com:<ゲートウェイポート>などのゲートウェイ入口を開き、ログインします。 - 続いて、必要なサービス本来のポートへ接続します。現在のグローバル IPv6 が IP 許可リストで有効になっていることを確認してください。
サービススコープが制限された TOTP、パスワードアカウント、パスキー、OIDC 認証情報では、IP の自動許可は作成されません。認証情報が送信元アドレスを介して権限を広げないようにするためです。直接接続モードで元のポートを自動的に開放する場合は、サービススコープを制限していない認証情報を使うか、必要な IPv6 / CIDR を手動で追加してください。
ファイアウォールの検証手順
各ステップで新しい接続を作成し、確立済みの SSH、ブラウザー、アプリ接続を使い回さないでください。
- 未ログイン状態では、ゲートウェイ入口へは到達でき、保護対象の元ポートは拒否またはタイムアウトすることを確認します。
- ログイン後、同じ外部ネットワークから元ポートへ接続し、上流サービス自体の認証へ進むことを確認します。
IP 許可リストまたはセッション詳細で、レコードの種類、IPv6、有効期限を確認します。- ログアウトするか IP 許可の期限切れを待ち、新しい接続を作ります。元ポートが再び拒否されることを確認します。
- 別の外部ネットワークへ切り替えてテストします。未許可の新しい IPv6 に、以前のネットワークの許可が引き継がれてはいけません。
IP が変わった場合
直接接続モードでは、元ポートへの接続はゲートウェイを通りません。IPv6 プレフィックスやクライアントの送信元アドレスが変わった場合は、ゲートウェイ入口を開き直して認証を完了し、IP の自動許可が同期されてから元ポートへの接続を再試行してください。
クライアントはプライバシー拡張による一時アドレスを使うことがあり、モバイル回線ではプレフィックス自体が変わることもあります。再ログインの回数を減らす目的で、広すぎる IPv6 ネットワークを許可しないでください。CIDR を手動登録すると、その範囲全体が許可されます。
検証とトラブルシューティング
- モバイル回線または別の IPv6 ネットワークからテストします。自宅 Wi-Fi はローカル例外として扱われる場合があります。
- AAAA は正しいのに接続できない:ルーターの IPv6 ファイアウォール、ISP の着信ポリシー、ホストのファイアウォールを確認します。
- ログインできても元ポートへ接続できない:IP 許可リストのレコード、モードの同期状態、サービスが IPv6 を待ち受けているかを確認します。
- ログイン後に IP 許可が作成されない:セッションの IP 許可ポリシーと、認証情報にサービススコープ制限がないかを確認します。
- アドレスがときどき到達不能な機器を指す:DDNS で選択したインターフェース、一時 IPv6 アドレス、プレフィックスの変更を確認します。
- 未ログインでも元ポートへ接続できる:ルーター、クラウドのセキュリティグループ、手動ファイアウォールルールを直ちに確認し、fn-knock を迂回する許可がないことを確かめます。
切り戻す場合は、LAN またはコンソールから動作モードを元の構成へ戻し、バックアップしたファイアウォールルールを復元して、不要になった AAAA レコードを削除します。まず管理経路を復旧し、その後に一時的な IP 許可レコードを整理してください。
