Một bản clone từ văn phòng chạy được, cùng bản clone đó qua hotspot điện thoại cũng chạy được, và cùng bản clone đó từ mạng khách sạn thì treo cho đến khi bật VPN. Quá trình bắt tay SSH kết thúc và phiên im lặng ngay ở lần truyền thật đầu tiên. Một dòng thêm vào cấu hình máy khách chữa cả git lẫn ssh cùng lúc. Khi một thiết lập máy khách sửa nhiều công cụ cùng lúc, lỗi nằm ở thứ máy khách gửi đi, không nằm ở đường liên kết mà nó gửi qua.

Đọc triệu chứng như một khác biệt về tuyến đường

Một đường hầm chữa được vấn đề hiếm khi là một sửa chữa. Nó đổi tuyến, nhà mạng và các thiết bị trung gian, trong khi laptop vẫn tạo ra đúng những gói tin đó. Nếu một tuyến xử lý sai phần đầu và tuyến khác cho nó đi qua nguyên vẹn, khác biệt nằm ở chính sách của thiết bị trung gian, không nằm ở máy khách. Ở đây đường hầm là nhân chứng, không phải giải pháp.

Điểm mà phiên chết thu hẹp điều đó hơn nữa. Không có gì thất bại ở bước phân giải tên hay ở bước trao đổi khóa lại trông như thế này. Một phiên đã xác thực, in ra băng rôn rồi đóng băng ở lần ghi lớn đầu tiên đã chứng minh rằng định tuyến, tên và thông tin đăng nhập đều hoạt động.

Máy khách đóng một byte QoS lên mỗi ổ cắm SSH

Mọi kết nối OpenSSH từ 7.8 trở đi đều mang trong phần đầu IP một giá trị mà bộ định tuyến có thể dùng để ưu tiên lưu lượng. Các phiên terminal nhận một giá trị còn các bản sao lớn nhận giá trị khác, theo lý thuyết rằng người đang gõ phím xứng đáng được đối xử tốt hơn một lần truyền tệp. Hầu hết các mạng bỏ qua hoàn toàn gợi ý này, vì thế nó không được chú ý trong nhiều năm. Một số ít trình điều khiển Wi-Fi, nhà mạng di động và bộ tập trung VPN hành động theo nó, và một số trong đó hành động tệ.

Khi giá trị đó bị ghi đè hoặc bị bỏ giữa dòng, kết nối không thất bại, nó ngừng tiến triển. Số lần truyền lại tăng, cửa sổ sụp đổ, và ứng dụng không báo gì vì không có gì trả về lỗi. Chính sự im lặng đó khiến người ta mô tả triệu chứng là treo chứ không phải lỗi.

Trước tiên hãy xác nhận phiên bản máy khách bằng ssh -V. Bất kỳ bản nào từ 7.8 trở lên đều mang hành vi này mặc định.

Ba lệnh phân biệt điều này với MTU và DNS

Nên loại trừ hai nguyên nhân giống nhau trước khi sửa bất kỳ tệp cấu hình nào. Lỗi MTU cho các trao đổi nhỏ đi qua và đóng băng ở gói lớn đầu tiên, còn lỗi về tên thì không bao giờ tạo ra phiên.

ssh -o IPQoS=none -v [email protected]
ssh -G [email protected] | grep -i ipqos
sudo tcpdump -ni any -vv "tcp port 22"

Lệnh đầu lặp lại thao tác thất bại với đánh dấu đã tắt, và việc nó chạy thành công là bằng chứng đơn lẻ mạnh nhất hiện có. Lệnh thứ hai in ra cấu hình mà máy khách thực sự sẽ áp dụng cho đích đó, nhờ vậy bắt được một mục cũ trong tệp mà bạn đã quên. Lệnh thứ ba hiển thị byte TOS theo cả hai chiều trong khi quá trình truyền bị kẹt, và mẫu đáng chú ý là có một giá trị trên tuyến hỏng và không có trên tuyến chạy được.

Hãy bắt gói trên laptop chứ không phải trên máy chủ, vì bên gửi đặt giá trị và cả hai chiều đều có thể thay đổi nó. So sánh một tuyến chạy được và một tuyến thất bại bằng cùng bản bắt gói, và khác biệt hiện ra mà không cần đoán.

Đặt ngoại lệ trong một tệp, mỗi lần một máy chủ

Một ngoại lệ nên nằm cạnh máy chủ mà nó áp dụng, kèm chú thích nói vì sao nó tồn tại.

Host gitlab.example.internal
    IPQoS none
    # direct route rewrites the marking; the tunnel route passes it

Phạm vi quan trọng hơn bản thân giá trị. Một mục đại diện tắt hành vi ở mọi nơi, vứt bỏ một gợi ý có ích trên các mạng cư xử tốt, và không để ai nói được nó xuất hiện khi nào. Một mục cho từng máy chủ thì dễ đọc, có thể hoàn tác và cực kỳ dễ xóa khi mạng đã được sửa. Dùng tệp người dùng cho một cách lách cá nhân và tệp được quản lý khi cả một đội máy cần cùng ngoại lệ đó.

Hãy nói rõ ngoại lệ không bao gồm những gì. Nó áp dụng cho SSH, nên một kho từ xa HTTPS, một gương gói và một trình duyệt đều nằm ngoài nó, và lỗi ở bất kỳ cái nào trong số đó cần bằng chứng riêng. Trên một chuỗi qua bastion, mỗi bước nhảy đều dùng cấu hình máy khách, và bước nhảy bị treo chính là bước đáng được giới hạn.

Khép vòng với chủ sở hữu mạng

Bàn giao phát hiện như bốn sự kiện: phiên bản máy khách, tuyến đã thử, máy khách VPN đang dùng và chiều nào mang đánh dấu. Bốn điều đó đủ để chủ sở hữu mạng tái tạo cách đối xử và quyết định xem nó có chủ ý hay không.

Nếu ngoại lệ không chữa được việc treo, hãy gỡ nó. Một cách lách sống sót qua một thí nghiệm thất bại sẽ thành truyền thuyết, và người tiếp theo mất một giờ để chứng minh rằng nó chẳng làm gì. Nếu nó chữa được việc treo, tuyến đường vẫn sai với mọi công cụ khác đi qua nó, và việc sửa chữa thuộc về người vận hành thiết bị trung gian.

Thay đổi ở máy khách là một giải pháp tạm có ngày hết hạn. Hãy ghi ngày đó vào chú thích.

Bài viết liên quan