Dừng dịch vụ sẽ gỡ bỏ giao diện ngay cả khi persist-tun đã được đặt. Đó là tùy chọn hoạt động như tài liệu, không phải lỗi. Tùy chọn mô tả một đường khởi động lại bên trong tiến trình đang chạy, và systemctl stop không phải đường đó.

Đọc hai tên cùng nhau và thiết kế trở nên rõ ràng. Một cái giữ bộ mô tả, cái kia giữ vật liệu khóa, và cả hai tồn tại vì những gì xảy ra sau khi quyền hạn bị bỏ.

Hai tài nguyên và lần đặt lại mà chúng thuộc về

OpenVPN báo hiệu lần khởi động lại của chính nó trong hai tình huống thông thường. SIGUSR1 rõ ràng làm điều đó, và ping-restart do một đối tác đã chết kích hoạt cũng làm vậy. Cả hai giữ tiến trình sống và chạy lại thiết lập kết nối, và đó là nơi các tùy chọn giành được vị trí của mình.

EventTUN/TAP deviceKey and auth filesAddresses and routesup/down hooks
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itselfsurvives only with persist-tunsurvive only with persist-keysurvive with the device, otherwise rebuiltrun again only when restart hooks are enabled
Configuration reload, SIGHUPrecreatedre-read from diskrebuilt once the device returnsrun again
Service stoplostre-read at the next startremovedrun at the next start

Chỉ hàng khởi động lại mềm là thứ hai tùy chọn này thay đổi, và công việc chúng bỏ qua là phần đắt giá trên một liên kết bận rộn. Mở lại thiết bị sẽ xé bỏ các địa chỉ và tuyến đường gắn với nó, và việc dựng lại chúng có thể làm rơi các gói đang trên đường khi quá trình khởi động lại bắt đầu. Việc dừng phá hủy chính các đối tượng đó mà không có tùy chọn nào để giữ chúng.

Vì sao các tùy chọn này tồn tại

Một máy chủ OpenVPN được gia cố thường khởi động với quyền root, mở khóa và thiết bị của nó, rồi chuyển xuống người dùng không có đặc quyền. Sau lần chuyển đó, một số thao tác đơn giản là biến mất. Đọc tệp khóa ở chế độ 0600, tạo giao diện mạng hoặc thay đổi tuyến đường đều có thể bị từ chối.

Không có các tùy chọn persist, một đối tác im lặng đủ lâu để kích hoạt ping-restart sẽ buộc đúng những thao tác đó. Việc kết nối lại sẽ thất bại dù không có gì trong cấu hình thay đổi. Tiến trình sẽ trông như đang chết mà không có lý do, và nhật ký sẽ hiển thị lỗi quyền thay vì lỗi mạng.

Với chúng, lần khởi động lại mềm tái sử dụng những gì giai đoạn có đặc quyền đã có được. Không có phép màu và tiến trình không sống sót qua bất cứ điều gì. Việc thu nhận tài nguyên chỉ đơn giản là bị hoãn lại.

Đọc lỗi đầu tiên, không phải lỗi cuối cùng

Khi một lần khởi động lại thất bại, hãy đọc lỗi đầu tiên thay vì lỗi cuối cùng. Một khóa được bảo vệ, một tệp auth, một ioctl giao diện và một hook bên ngoài là bốn tài nguyên khác nhau. Giữ một cái không nói gì về quyền truy cập vào những cái khác. Một hook gọi công cụ tường lửa vẫn cần những đặc quyền mà công cụ đó yêu cầu.

Các hook có công tắc riêng. Hướng dẫn OpenVPN ghép các tùy chọn persist với up-restart, thứ quyết định các script up và down có chạy lại sau khi khởi động lại hay không. Vì vậy một giao diện còn hoạt động không cho bạn biết gì về việc tích hợp resolver của bạn có được làm mới hay không.

# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'

# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0

Cặp lệnh đó tách hai chế độ hỏng trong vài giây. Một giao diện tồn tại nhưng thiếu tuyến đường là vấn đề hook hoặc tuyến đường. Một giao diện đã biến mất nghĩa là tiến trình thực sự đã kết thúc.

Giao diện được giữ lại không phải kill switch

Nếu yêu cầu là lưu lượng không bao giờ ra ngoài đường hầm, một thiết bị được giữ lại không cung cấp điều đó. Các tuyến cho họ địa chỉ kia, tuyến mặc định thứ hai, và trường hợp tiến trình thoát hoàn toàn đều nằm ngoài phạm vi của tùy chọn.

Xử lý hai yêu cầu riêng biệt. Giữ đối tượng đường hầm qua các lần kết nối lại là sự tiện lợi cho daemon. Chặn lối ra khi đường hầm ngừng hoạt động là chính sách tường lửa với quy tắc và thử nghiệm riêng. Trộn lẫn chúng tạo ra một cấu hình trông có vẻ phòng thủ và hành xử như kết nối lại nỗ lực tốt nhất.

Đặt tên sự kiện trước khi chẩn đoán nó. Khởi động lại mềm, một lần thử kết nối thất bại và dừng dịch vụ là ba sự kiện với ba hành vi, và chỉ sự kiện đầu tiên là điều các tùy chọn này mô tả.

Bài viết liên quan