Một trình giám sát ping không phân biệt được đường hầm hỏng với đường hầm lành
Ping ra internet chứng minh ít hơn vẻ ngoài của nó. Hãy dò đường hầm từ bên trong, đếm số lần thất bại trước khi hành động và coi việc chuyển máy chủ là một quyết định riêng.
Ba điều kiện quyết định trình giám sát giúp ích hay gây hại: phép dò phân biệt được gì, bao nhiêu lần thất bại liên tiếp mới đủ biện minh cho hành động, và hành động đó là kết nối lại hay chuyển máy chủ. Một dòng cron ping tới một địa chỉ công cộng không trả lời tốt bất kỳ điều nào. Nó kết nối lại những đường hầm vốn ổn và để mặc những đường hầm hỏng, và làm cả hai mà không có bản ghi nào. Thiết kế đáng giữ lại làm rõ ba lựa chọn đó.
Phép dò là phần quyết định mọi thứ còn lại.
Ping ra internet thực sự chứng minh điều gì
Ping tới một trình phân giải công cộng cho thấy đường internet cục bộ còn sống. Nó không chứng minh đường hầm đang chở lưu lượng, và trên một cấu hình đường hầm đầy đủ thì chính gói ping đi qua đường hầm, nên một phản hồi lành và một đường hầm hỏng có thể cùng tồn tại trong khi máy khách vẫn chuyển tiếp gói tin. Nếu cấu hình gửi truy vấn tên qua đường hầm, một lỗi DNS bị đọc như liên kết đã chết và khởi động một lần kết nối lại không thể sửa được gì.
Không hướng nào của lỗi xuất hiện trong mã thoát. Một trình giám sát dựng trên tín hiệu đó chỉ là việc tung đồng xu kèm lịch cron.
Hãy dò một thứ sống sau đường hầm
ip -brief addr show tun0 ip route get 10.100.20.10 nc -z -w3 10.100.20.10 443
Dò từ bên trong, phép kiểm tra rẻ nhất trước. Có giao diện nghĩa là đường hầm đã lên; tra tuyến tới một địa chỉ nội bộ đã biết cho thấy lưu lượng sẽ đi vào đó; thử TCP tới một máy chủ ở phía bên kia cho thấy có thứ thực sự trả lời. Chỉ các yêu cầu echo là đánh lừa: nhiều máy chủ nội bộ sẵn lòng trả lời TCP nhưng lại bỏ ICMP, nên trình giám sát dựa trên ping cứ kết nối lại một đường hầm chưa từng ngừng hoạt động.
Giữ phép dò trong giới hạn thời gian và cho nó một trạng thái thoát riêng. Một phép dò treo ba mươi giây biến trình giám sát thành máy phát hiện gián đoạn có độ trễ cài sẵn.
Chọn giữa một dòng và một vòng lặp
* * * * * nc -z -w5 10.100.20.10 443 || myvpn reconnect
Một mục cron là một dòng không có bộ nhớ, phù hợp với máy tính xách tay nơi một lần kết nối lại thêm không tốn gì. Một vòng lặp có giám sát giữ bộ đếm và chỉ hành động sau vài lần trượt, điều này ngăn một liên kết chập chờn gây ra bão kết nối lại. Dù thế nào, hãy chạy nó dưới một trình giám sát để nó sống sót qua sự cố và ghi vào nhật ký. Hãy chọn theo việc một lần kết nối lại thừa có quan trọng hay không, không theo việc phiên bản nào ngắn hơn.
failures=0 while sleep 30; do if nc -z -w5 10.100.20.10 443; then failures=0 else failures=$((failures+1)); fi if [ $failures -ge 3 ]; then myvpn reconnect; failures=0; fi done
Vòng lặp đó đếm số lần thất bại liên tiếp thay vì một tỷ lệ trên cửa sổ. Một cửa sổ cần đồng hồ và bộ nhớ mẫu, và phần lớn lỗi trong các trình giám sát viết tay nằm đúng trong phép tính đó.
Chuyển máy chủ là một quyết định khác
Đổi máy chủ khác với kết nối lại. Hãy cắt liên kết cũ trước, vì một máy khách thứ hai khởi động trong khi máy thứ nhất còn giữ địa chỉ sẽ đụng nhau. Đếm số lần thất bại liên tiếp trước khi đổi, giới hạn số lần thử, và dò lại sau khi liên kết mới đã lên thay vì tin vào mã thoát của lệnh connect. Một cấu hình sai không nên quay vòng qua mọi máy chủ trong một vòng lặp.
Đừng dò địa chỉ công cộng của chính máy chủ VPN từ bên trong một đường hầm đầy đủ. Phép kiểm tra đó phụ thuộc vào thứ nó đang thử, và nó báo thành công trong khi con đường mà nó phải xác nhận đã biến mất.
Ghi lại phép dò nào đã chạy, nó trả về gì và hành động nào tiếp theo. Bản ghi đó biến một lần kết nối lại bí ẩn thành một sự kiện có thể chẩn đoán.