特定の条件下で WordPress.org に接続できない事象があり、解決したのでブログ書きます。
事象
Kubernetes 上に構築した WordPress のサイトヘルスで WordPress.org に接続できないとのメッセージが表示される。
取り急ぎ確認したこと
WordPress の Pod から WordPress.org に接続できるか?
連続して Curl でアクセスすると接続できる時とできない時がある。
WordPress の Pod が稼働しているノードから WordPress.org に接続できるか?
連続して Curl でアクセスしても問題がない。
問題は WordPress.org だけか?
www.google.co.jp, www.yahoo.co.jp で試したが問題はない。
特有の環境
この環境は自宅とさくらの VPS を VyOS を使用して VPNで 常時接続しており、当該 WordPress が稼働する Kubernetes ノードのセグメントを PBR (Policy Base Routhing) でデフォルトルートを変更し、さくらの VPS を経由してインターネットに接続している。VPN は OpenVPN を使用しており、OpenVPN 上に更に IP6GRE を使用している。これは OSPF を使用するためである(これを細かく書くと本題から外れるため割愛)。このため、MTU/MSS も必要な調整を行なっている。
最初の被疑箇所
最初に思ったのは特有の環境に影響していないかということ。つまり、OpenVPN/IP6GRE に関連する MTU/MSS である。MTU/MSS はこのような分かりにくいトラブルの際によく問題として挙げられる。このため、MTU/MSS を更に小さくしたり、その他のポイントでの MTU/MSS の調整を行なったが、変化はなかった。
次の被疑箇所
Kubernetes の Pod でのみ発生することから、Kubernetes の構成を疑ったが、特にこの事象に関連するような設定などはなかった。もう少し踏み込めば、CNI (Calico) の MTU などが関連してないかと思ったが、かなり調査が難しそうなので、それは後回しにした。
最終的に
さくらの VPS では VM 単位でファイアウォールを設定できるが、それを完全に無効にすることで解消した。このファイアウォールは単純な設定しかできないので、大した知識のない人でも問題なく設定できるが、その反面、ログなどを確認する術はないので、トラブル対応では無効化するしか方法がない。しかし、ファイアウォールという特性上、非常に微妙な条件でマッチして DROP していることもあると思う。今回のケースでは接続できる場合もあることから、何らかの条件での閾値が設けられていると思われるが、それはさくらの VPS のファイアウォールの内部仕様によるのでこれ以上は想像するしかない。実際、パケットキャプチャを行い、Kubernetes から発信されるパケットに特有の情報があるのではと探してみたが、軽くみた感じでは分からなかった。確証はないが、おそらく CNI で使用している Calico でパケットに何かを付与していると推測はしている。
また、このファイアウォールは INPUT 方向だけでなく OUTPUT 方向にも何らかのセキュリティ機能は働いていることも分かった。
まとめ
自宅とさくらの VPS を VPN で接続し、自宅の Kubernetes 内の Pod で WordPress を実行し、それがさくらの VPS を経由してインターネットに接続する場合、さくらの VPS のファイアウォールを無効にして確認すると良い。
かなり限定的な事象だったので原因の特定までかなり時間を要した。
備考
もちろん VyOS でファイアウォールを設定しているのでさくらの VPS のファイアウォールを切っても問題はない。