6.14. IPsec 設定のトラブルシューティング
IPsec 設定の失敗の診断は困難な場合があります。設定の不一致、ファイアウォールルール、カーネルレベルのエラーによって問題が発生することがあるためです。以下では、IPsec VPN 接続に関する一般的な問題を解決するための体系的な方法を説明します。
6.14.1. 基本的な接続の問題 リンクのコピーリンクがクリップボードにコピーされました!
VPN 接続の問題は、エンドポイント間の設定の不一致が原因で発生することがよくあります。
IPsec 接続が確立されていることを確認するには、次のように入力します。
ipsec trafficstatus
# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=198.51.100.1/32
接続が正常な場合、このコマンドで、接続の名前と詳細を含むエントリーが表示されます。出力が空の場合、トンネルが確立されていません。
6.14.3. 設定の不一致 リンクのコピーリンクがクリップボードにコピーされました!
各エンドポイントが、同じ Internet Key Exchange (IKE) バージョン、アルゴリズム、IP アドレス範囲、または事前共有鍵 (PSK) で設定されていない場合、VPN 接続は失敗します。不一致が見つかった場合は、両方のエンドポイントの設定を調整して問題を解決する必要があります。
- リモートピアが IKE/IPsec を実行していない
接続が拒否された場合、次の ICMP エラーが表示されます。
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - IKE アルゴリズムの不一致
初期セットアップ中に
NO_PROPOSAL_CHOSEN
通知が表示され、接続が失敗します。ipsec up vpn.example.com
# ipsec up vpn.example.com ... 003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - IPsec アルゴリズムの不一致
最初の交換後、
NO_PROPOSAL_CHOSEN
エラーで接続が失敗します。ipsec up vpn.example.com
# ipsec up vpn.example.com ... 182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048} 002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - IP アドレス範囲の不一致 (IKEv2)
リモートピアが
TS_UNACCEPTABLE
エラーで応答します。ipsec up vpn.example.com
# ipsec up vpn.example.com ... 1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048} 002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - IP アドレス範囲の不一致 (IKEv1)
クイックモード中に接続がタイムアウトし、ピアがプロポーザルを受け入れなかったことを示すメッセージが表示されます。
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits. No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - PSK の不一致 (IKEv2)
ピアが接続を拒否し、
AUTHENTICATION_FAILED
エラーが発生します。ipsec up vpn.example.com
# ipsec up vpn.example.com ... 003 "vpn.example.com" #1: received Hash Payload does not match computed value 223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - PSK の不一致 (IKEv1)
ハッシュペイロードが一致しないため、IKE メッセージが読み取り不能になり、
INVALID_HASH_INFORMATION
エラーが発生します。ipsec up vpn.example.com
# ipsec up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.14.4. MTU の問題 リンクのコピーリンクがクリップボードにコピーされました!
パケットのサイズは、暗号化およびカプセル化のプロセスにより増加します。パケットがネットワークの最大転送単位 (MTU) (通常は 1500 バイト) を超えると、パケットは断片化されます。これにより、断続的な接続障害が発生し、断片が失われ、元のパケットを再構成できなくなることがあります。一般的な症状としては、ping などの小さなパケットでは正常に動作するが、SSH セッションなどの大きなパケットではログイン後にフリーズすることなどが挙げられます。
この問題を解決するには、設定ファイルに mtu=1400
オプションを追加して、トンネルの MTU を下げます。
6.14.5. NAT の競合 リンクのコピーリンクがクリップボードにコピーされました!
IPsec ホストが NAT ルーターとしても機能する場合、IPsec トンネル宛のパケットに誤って NAT が適用されることがあります。たとえば、IPsec 暗号化が適用される前に、パケットの送信元 IP アドレスがマスカレードルールによって変換されると、そのパケットの送信元が IPsec ポリシーと一致しなくなり、Libreswan がそのパケットを暗号化せずにネットワーク経由で送信してしまいます。
この問題を解決するには、IPsec サブネット間のトラフィックを NAT から除外するファイアウォールルールを追加します。このルールは、一般的な NAT ルールの前に処理されるように、POSTROUTING
チェーンの先頭に挿入する必要があります。
例6.1 nftables
フレームワークを使用した解決策
次の例では、nftables
を使用して、192.0.2.0/24 サブネットと 198.51.100.0/24 サブネット間のトラフィックをアドレス変換から除外する基本的な NAT 環境を設定します。
nft add table ip nat nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; } nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
# nft add table ip nat
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
# nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
6.14.6. カーネルレベルの IPsec の問題 リンクのコピーリンクがクリップボードにコピーされました!
よくある問題として、VPN トンネルが正常に確立されたように見えても、トラフィックが通過しないことがあります。このような場合は、カーネルの IPsec の状態を調べて、トンネルポリシーと暗号鍵が正しくインストールされているかどうかを確認できます。
このプロセスでは、次の 2 つのコンポーネントをチェックします。
- Security Policy Database (SPD): 暗号化するトラフィックをカーネルに指示するルール。
- Security Association Database (SAD): そのトラフィックを暗号化する方法をカーネルに指示する鍵。
まず、SPD に正しいポリシーが存在するかどうかを確認します。
ip xfrm policy
# ip xfrm policy
src 192.0.2.1/32 dst 10.0.0.0/8
dir out priority 666 ptype main
tmpl src 198.51.100.13 dst 203.0.113.22
proto esp reqid 16417 mode tunnel
出力に、leftsubnet
および rightsubnet
パラメーターに一致するポリシーが、in 方向と out 方向の両方で含まれているはずです。トラフィックのポリシーが表示されない場合は、Libreswan がカーネルルールの作成に失敗しており、トラフィックは暗号化されていません。
ポリシーが存在する場合は、SAD 内に対応する鍵セットがあるかどうかを確認します。
ip xfrm state
# ip xfrm state
src 203.0.113.22 dst 198.51.100.13
proto esp spi 0xa78b3fdb reqid 16417 mode tunnel
auth-trunc hmac(sha1) 0x3763cd3b... 96
enc cbc(aes) 0xd9dba399...
このコマンドにより、秘密の暗号鍵が表示されます。この出力を共有しないでください。攻撃者がこの出力を使用して VPN トラフィックを復号するおそれがあります。
ポリシーが存在するにもかかわらず、同じ reqid
を持つ対応する状態が表示されない場合は、通常、Internet Key Exchange (IKE) ネゴシエーションが失敗しています。2 つの VPN エンドポイントが、鍵セットについて合意できなかったということです。
より詳細な診断を行うには、いずれかのコマンドで -s
オプションを使用します。このオプションはトラフィックカウンターを追加します。これは、カーネルが特定のルールに従ってパケットを処理しているかどうかを確認するのに役立ちます。
6.14.7. カーネル IPsec サブシステムのバグ リンクのコピーリンクがクリップボードにコピーされました!
まれに、カーネルの IPsec サブシステムの不具合により、Internet Key Exchange (IKE) ユーザー空間デーモンとの同期が失われる場合があります。この同期のずれにより、ネゴシエートされたセキュリティーアソシエーションと、カーネル内における IPsec ポリシーの実際の適用との間にずれが生じ、セキュアなネットワーク通信が中断される場合があります。カーネルレベルのエラーを確認するには、変換 (XFRM) の統計情報を表示します。
cat /proc/net/xfrm_stat
# cat /proc/net/xfrm_stat
出力内のいずれかのカウンター (XfrmInError
など) がゼロ以外の値を示している場合、カーネルサブシステムに問題があります。このような場合は、サポートケース を作成し、コマンドの出力と対応する IKE ログを添付してください。
6.14.8. Libreswan ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
Libreswan はイベントをジャーナルに記録します。ipsec
サービスのジャーナルを表示するには、次のように入力します。
journalctl -xeu ipsec
# journalctl -xeu ipsec
デフォルトのロギングレベルでは十分な詳細情報が得られない場合は、/etc/ipsec.conf
ファイルの config setup
セクションに次の設定を追加して、包括的なデバッグロギングを有効にします。
plutodebug=all logfile=/var/log/pluto.log
plutodebug=all
logfile=/var/log/pluto.log
デバッグロギングでは多数のエントリーが生成されることがあります。そのため、メッセージを専用のログファイルにリダイレクトすると、journald
および systemd
サービスによるメッセージのレート制限を防ぐことができます。