Khởi động lại máy chủ khi không ai đăng nhập, sau đó kết nối từ một mạng mà bạn không kiểm soát. Chính bài kiểm tra này trả lời liệu việc khôi phục có thật hay không, bởi vì một đường hầm chỉ hoạt động sau khi ai đó chạy lệnh bằng tay không phải là khôi phục, mà là sửa chữa. Hầu hết các lần kiểm tra dừng quá sớm: dịch vụ hiện là hoạt động, giao diện đã lên, và trang vẫn không tải được. Khoảng trống hầu như luôn nằm ở tính bền vững của các phần quanh đường hầm, không phải ở chính lệnh đường hầm.

Bốn chủ sở hữu, bốn bài kiểm tra khác nhau

Trước khi khởi động lại, hãy gọi tên cái phải đưa đường hầm trở lại. Bài kiểm tra bạn chạy và bản sửa bạn áp dụng đều phụ thuộc vào câu trả lời đó, và có bốn chủ sở hữu thường gặp: một unit systemd cho dịch vụ VPN, một unit phiên bản wg-quick cho giao diện WireGuard, một runtime container hoặc một hồ sơ trình quản lý mạng. Nếu không gọi được tên chủ sở hữu, hãy dừng lại và tìm nó, vì bài kiểm tra khởi động lại không có đường khởi động mong đợi chỉ cho bạn biết là đã có chuyện gì đó xảy ra.

Mỗi chủ sở hữu giữ cấu hình ở một nơi khác nhau. Máy chủ OpenVPN do systemd quản lý đọc cấu hình khi khởi động, nên thứ gì ở trong tệp tại thời điểm khởi động là thứ được chạy. Giao diện wg-quick lấy địa chỉ, tuyến và DNS từ cùng tệp đó, nghĩa là một giao diện được dựng bằng tay từ shell và chưa bao giờ được bật như một unit sẽ không trở lại. Container đưa điểm vào của nó trở lại nhưng không đưa thay đổi tường lửa của máy chủ về, trừ khi những thay đổi đó nằm ngoài container.

Trước tiên là đường cơ sở, nếu không kết quả chẳng có nghĩa gì

Ghi lại trạng thái đang hoạt động khi nó còn hoạt động: địa chỉ trên đường hầm, tuyến cho mạng con của máy khách, quy tắc NAT hoặc chuyển tiếp, socket đang lắng nghe và sysctl chuyển tiếp. ip addr show wg0, ip route, nft list ruleset hoặc iptables-save, ss -lunp và sysctl net.ipv4.ip_forward là đủ trên hầu hết máy chủ.

Ghi lại cách dịch vụ được cấu hình để khởi động, không chỉ là nó đang chạy. systemctl is-enabled wg-quick@wg0 và systemctl is-active wg-quick@wg0 trả lời những câu hỏi khác nhau, và trạng thái được bật là thứ quan trọng khi khởi động, như mô tả trong systemctl(1). Với OpenVPN, hãy kiểm tra máy chủ dùng mẫu nào, vì openvpn@server và openvpn-server@server là những unit khác nhau với giá trị mặc định khác nhau.

Chạy khởi động lại và đọc lỗi đầu tiên

Khởi động lại có chủ đích, trong khung giờ bạn đã chọn, với một console hoặc đường ngoài băng mở. Quan sát thứ tự sự kiện thay vì trạng thái cuối: máy chủ đến được, unit được kích hoạt, giao diện có mặt, tuyến được cài, quy tắc tường lửa có mặt, bộ lắng nghe được gắn, máy khách được chấp nhận. Bước đầu tiên không xảy ra là phát hiện; mọi thứ sau đó là tiếng ồn.

Dịch vụ có thể đang hoạt động trong khi đường hầm không dùng được, và đó là kiểu đạt sai phổ biến nhất. Quá trình khởi động có thể hoàn tất trước khi mạng trực tuyến nếu unit chỉ chờ network.target thay vì network-online.target. Các tệp được tham chiếu như chứng chỉ, khóa hoặc CRL có thể không đọc được tại thời điểm đó vì một mount hoặc đường dẫn bí mật chưa sẵn sàng. Không vấn đề nào hiện ra trong systemctl status cho đến khi bạn đọc nhật ký của unit.

Kiểm tra từ bên ngoài máy chủ. Một máy khách trong cùng LAN có thể thành công qua tuyến mà không máy khách từ xa nào từng dùng, và một phiên SSH tới máy không chứng minh gì về đường hầm. Kết nối, phân giải một tên nội bộ, đến được tài nguyên riêng, sau đó kết nối lại một lần để xác nhận trạng thái thu hồi và khóa vẫn áp dụng.

Ba điều kiện quyết định bản sửa của bạn

Nếu đường hầm trở lại nhưng máy khách không đến được gì, lỗi nằm ở định tuyến hoặc tính bền vững của NAT. Nếu máy khách thậm chí không hoàn tất được bắt tay, lỗi nằm ở giao diện hoặc vật liệu xác thực. Nếu dịch vụ không bao giờ khởi động, lỗi nằm ở tệp unit hoặc các phụ thuộc của nó. Ba nhánh này dẫn đến những bản sửa khác nhau, nên một lần khởi động lại mù quáng không có đường cơ sở tốn nhiều thời gian hơn là tiết kiệm.

Thực hiện bản sửa ở nơi cấu hình được sở hữu. Đặt chuyển tiếp vào một sysctl drop-in, đặt quy tắc NAT vào bộ quy tắc được nạp khi khởi động, bật unit thay vì khởi động nó, và giữ bí mật trên một đường dẫn tồn tại trước khi unit khởi động. Thêm một khoảng ngủ vào unit che giấu phụ thuộc thay vì khai báo nó.

Ghi kết quả vào runbook

Viết ra cái gì tự trở lại, cái gì bạn phải khởi động và khoảng trống kéo dài bao lâu. Bao gồm các lệnh chính xác bạn dùng để xác minh, để người tiếp theo lặp lại bài kiểm tra thay vì phát minh ra bài mới. Nếu bước nào cần lệnh thủ công, lệnh đó thuộc về cấu hình, không thuộc runbook như một bước thường trực.

Sau đó lên lịch bài kiểm tra tiếp theo sau lần thay đổi kế tiếp của ngăn xếp mạng trên máy chủ, không phải cho một ngày trên lịch sáu tháng nữa. Kiểu hỏng mà bạn đang đề phòng là một lệnh tạm thời có cảm giác thường trực, và chúng xuất hiện đúng khi ai đó sửa quy tắc tường lửa hoặc chuyển dịch vụ sang một unit mới.

Bài viết liên quan