事象
- TLS Handshake で失敗する場合、しない場合があり、Webページが表示されない。
- 携帯が2台あり、どちらもSIMの回線を使用し、Webページにアクセスすると、片方は成功、片方は失敗
- 成功している場合は1回の応答でServer Hello, Change Cipher Spec, Encrypted Handshake Messgeをまとめて送信しています。対するACKも1回のみです。
- 完全に見れないのであればFirewall設定を疑いましたが、片方は見れている状態です。
- tcpdump(& wireshark) で見た限り、以下に挙げる状態のときはTCP retransmission が発生して結果的にブラウザではタイムアウトとなるようです。(wireshark から抜粋)
- TCP Out-Of-Order 時にWireshark では (reassembly error, protocol TCP: New fragment overlaps old data) が出ています。
|No.|Src|Dest|Proto|Info|
|:--|:--:|--:|
|1|Internet|HAProxy|TCP|xxx -> 443 SYN|
|2|HAProxy|Internet|TCP|443 -> xxx SYN,ACK|
|3|Internet|HAProxy|TCP|ACK|
|4|HAProxy|HOST[123]|TCP|yyy -> 30397 SYN|
|5|HOST[123]|HAProxy|TCP|30397 -> yyy SYN,ACK|
|6|HAProxy|HOST[123]|TCP|yyy -> 30397 ACK|
|7|Internet|HAProxy|TLS1.2|Client Hello|
|8|HAProxy|Internet|TCP|443 -> xxx ACK|
|9|HAProxy|HOST[123]|TLS1.2|Client Hello|
|10|HOST[123]|HAProxy|TCP|30397 -> yyy ACK|
|11|HOST[123]|HAProxy|TLS1.2|Server Hello|
|12|HOST[123]|HAProxy|TLS1.2|Certificate(TCP segment of a reassembled PDU)|
|13|HOST[123]|HAProxy|TLS1.2|Server Key Exchange, Server Hello Done|
|14|HAProxy|HOST[123]|TCP|yyy -> 30397 ACK|
|15|HAProxy|HOST[123]|TCP|yyy -> 30397 ACK|
|16|HAProxy|HOST[123]|TCP|yyy -> 30397 ACK|
|17|HAProxy|Internet|TLS1.2|Server Hello|
|18|HAProxy|Internet|TLS1.2|Certificate(TCP segment of a reassembled PDU)|
|19|HAProxy|Internet|TLS1.2|Server Key Exchange, Server Hello Done|
|20|HAProxy|Internet|TCP|[TCP Out-Of-Order] 443 -> xxx ACK|
|21|HAProxy|Internet|TCP|[TCP Out-Of-Order] 443 -> xxx ACK|
|22|HAProxy|Internet|TCP|[TCP Retransmission] 443 -> xxx ACK|
... 以下Retransmissionが続く
質問
- 原因となっている場所はどこでしょうか
- 何を他に試せばよいでしょうか
- 何を直せば良いでしょうか
前提
現在、自宅にてサーバをたてて検証環境を作っています。
Kubernetes
- Host 1-3 で動作
- Port 30397(仮) でHTTPSリクエストを受けています。
- Port 30402(仮) でHTTPリクエストを受けています。
- NGINX ingress Controller & cert-manager でワイルドカード証明書を発行しています (www, *)
- L7 バランシング
Haproxy
- TCP Mode
- 80, 443 Listen
- 80 -> 30402(仮) Forward
- 443 -> 30397(仮) Forward
- Docker-composeでRaspberry-pi上で動作
- HOST 1-3にL4 バランシング
Router
- ルーターに仮想サーバ機能があるので80, 443 Open
- 80 -> HAProxy(80) Forward
- 443 -> HAProxy(443) Forward
構成
(Internet) ↕ [Router] ↕ [Raspberry Pi] ↕ ↕ ↕ [Host1] [Host2] [Host3]
MW
- Raspberry Pi: HAProxy(TCP Mode)
- Host[1-3]: Kubernetes Worker(Master がいますがHaproxyから飛ばしていないので略します)
補足
L3レベルの話やNetworkに疎く、TCPやTLSの仕組みに詳しくないので素人構成ですが、なにかヒントをいただけると幸いです。
回答2件
あなたの回答
tips
プレビュー