Tình hình là như thế này:
http client ----> corporate firewall ----> http server
Do giữ nguyên, máy chủ và máy khách sẽ giữ kết nối TCP mở và máy khách sẽ sử dụng nhóm kết nối cho các yêu cầu HTTP.
Tường lửa có quy tắc "tiêu diệt" các kết nối TCP lâu đời sau 1 giờ. Vấn đề là máy khách HTTP của chúng tôi sẽ không phát hiện ra rằng kết nối TCP đã bị phá hủy và nó đã cố gắng sử dụng lại các kết nối cơ bản đã chết mà về phía chúng tôi trông giống như máy khách "bị treo" sau một khoảng thời gian. Một yêu cầu sẽ bị treo, sau đó yêu cầu tiếp theo sẽ hoạt động, có lẽ là do một kết nối mới được thiết lập.
Câu hỏi ở đây là cơ chế mà tường lửa đang giết các kết nối TCP theo cách mà máy khách HTTP của chúng tôi không thể phát hiện ra chúng là gì. Tôi đã cố gắng tái tạo hành vi này cục bộ theo một số cách:
- Giết các kết nối TCP trên bộ định tuyến vyos của chúng tôi, Wireshark ở phía máy khách đã bắt được TCP FIN-ACK. đồng ý
- Giết phía máy khách kết nối TCP trong TCPView trên Windows, Wireshark đã phát hiện TCP RST ở phía máy khách. đồng ý
- Chặn cổng sau khi thiết lập kết nối với tường lửa phía máy khách, dẫn đến ngoại lệ đặt lại ổ cắm. đồng ý
Tôi có một bãi chứa Wireshark ở phía máy chủ và tôi đã cố gắng tìm xem tường lửa có gửi FIN hoặc RST ip.dst==serverip && (tcp.flags.reset==1 || tcp.flags.fin==1)
không nhưng không có gì hiển thị.
Ngoài ra, chụp Wireshark ở phía máy khách cho thấy vấn đề khi yêu cầu HTTP xuất hiện, theo sau là hàng tá truyền lại TCP, cuối cùng không đi đến đâu.
Máy khách HTTP là máy khách Java gốc và / hoặc máy khách HTTP (đã thử cả hai), cả hai đều không phát hiện được kết nối TCP đã chết. Tôi muốn tái tạo hành vi cục bộ nhưng tôi không thể hiểu được cách thức mà tường lửa phá hủy các kết nối, do đó tìm kiếm câu trả lời có thể.