Một hồ sơ vpnc kết nối lại sạch sẽ sau khi chuyển vùng; ba hồ sơ thì lần lượt phá socket, tuyến và trạng thái trình phân giải của nhau. Kịch bản kết nối lại đi kèm gói được viết cho một đường hầm duy nhất, nên nó khởi động lại mọi hồ sơ mỗi khi bất kỳ hồ sơ nào ngừng hoạt động. Sửa điều đó cần ba thứ: cổng cục bộ riêng, một phép dò kiểm tra dịch vụ thật cho từng hồ sơ, và một chuỗi có thứ tự không bao giờ chạy hai kết nối cùng lúc.

Cấp cho mỗi hồ sơ cổng cục bộ riêng

Một hồ sơ vpnc để ở cổng cục bộ mặc định sẽ tranh chấp với hồ sơ đang chạy. Kết nối thứ hai thất bại trong khi kết nối thứ nhất giữ cổng, và dòng nhật ký trông giống sự cố cổng nối hơn là xung đột cục bộ. Thay vào đó, đặt một dòng cho mỗi tệp hồ sơ:

Local Port 0

Số không cho phép nhân chọn cổng tạm thời, nên hai hồ sơ có thể được thiết lập cùng lúc. Đặt tên mỗi tệp theo cổng nối và nhóm mà nó phục vụ, chỉ để root đọc được, và luôn kết nối bằng hồ sơ khớp thay vì một mặc định dùng chung. Tệp mặc định dùng chung chính là cách một kịch bản kết nối lại nhầm đường hầm sau khi ai đó đổi tên hồ sơ.

Tệp hồ sơ chứa thông tin đăng nhập, nên quyền truy cập thuộc về thiết kế chứ không phải việc dọn dẹp. Một tệp dưới /etc/vpnc mà mọi người đều đọc được sẽ trao bí mật của nhóm cho từng người dùng cục bộ. Giữ chế độ 0600 với root là chủ sở hữu, và để các kịch bản đọc tệp với quyền root thay vì sao chép bí mật vào đối số. Đó cũng là lý do một kịch bản dò không bao giờ nên ghi nội dung tệp vào nhật ký.

Dò một dịch vụ cho mỗi hồ sơ, không phải địa chỉ đường hầm

Một yêu cầu echo tới chính địa chỉ của đường hầm chủ yếu chứng minh giao diện tồn tại. Nó không nói gì về việc máy chủ phía sau còn tới được ứng dụng biện minh cho đường hầm hay không. Giao diện có thể đang hoạt động trong khi tuyến phía sau đã mất.

Dò một dịch vụ cho mỗi hồ sơ với thời gian chờ TCP ngắn và chỉ kết nối lại hồ sơ có phép dò thất bại. Hai giây phân biệt một đường chết với một đường chậm, và phép dò TCP không phụ thuộc vào việc ICMP có được cho phép ở đâu đó trên đường đi hay không. Chỉ thay đổi mục tiêu và tên cấu hình giữa các hồ sơ:

#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
  /usr/sbin/vpnc-connect ops.conf
fi

Lưu nội dung đó thành /usr/local/bin/ensure-vpn-ops.sh, cấp quyền thực thi, và lặp lại cho từng hồ sơ chỉ thay đổi mục tiêu dò và tên cấu hình. Một phép dò trả lời câu hỏi giao thức sẽ sống sót qua các cổng nối bỏ echo nhưng vẫn chuyển tiếp những dịch vụ mà người dùng quan tâm.

Nối các phép dò thành chuỗi để chúng không bao giờ tranh nhau

Kịch bản kết nối lại đi kèm gói có thể gọi các phép dò của bạn theo thứ tự, và thứ tự chính là toàn bộ vấn đề. Hai lời gọi vpnc-connect chạy cùng nhau sẽ ghi lại bảng định tuyến theo thứ tự không ai kiểm soát, và đó là cách một hồ sơ khỏe mạnh mất tuyến của nó.

Giữ các lời gọi ở tiền cảnh, thêm một độ trễ ổn định ngắn cho giao diện bên dưới, và lên lịch chuỗi từ bảng cron của root, vì chỉ root mới ghi lại được các tuyến của đường hầm:

#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.sh

Giữ thứ tự giống hệt nhau giữa kịch bản khởi động và mục cron, vì một chuỗi chạy theo thứ tự khác khi khởi động thực chất là một chương trình khác. Khi một hồ sơ phụ thuộc vào tuyến của hồ sơ khác, hãy đặt phần phụ thuộc lên trước và để phép dò sau thất bại vô hại trong khi đường hầm trước vẫn đang lên.

Theo dõi nhật ký, rồi cố ý phá một cái

Ghi một dòng cho mỗi lần chạy với hồ sơ, mục tiêu dò, kết quả và hành động đã thực hiện. Không có nó, một đường hầm nhấp nháy mỗi phút trông y hệt cái chưa bao giờ rớt, và một lỗi trong phép dò không thể phân biệt với sự cố cổng nối. Nhật ký cũng chứng minh chuỗi chỉ chạm vào hồ sơ đã thất bại. Hãy ghi ở nơi sống sót qua lần khởi động lại, nếu không bằng chứng sẽ ra đi cùng tiến trình.

Sau đó cố ý phá một đường hầm và xem điều gì xảy ra. Dừng một hồ sơ duy nhất và xác nhận tiến trình và tuyến nào vẫn còn:

pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.log

Chỉ hồ sơ bị dừng mới nên được kết nối lại, và các phiên khác nên giữ cả tiến trình lẫn tuyến của chúng. Nếu hai hồ sơ khởi động lại, chuỗi của bạn đang chạy song song ở đâu đó mà bạn không ngờ.

Điều mà trình giám sát không được làm

Một trình giám sát khởi động lại mọi thứ mỗi khi có gì đó thất bại trông có vẻ khỏe mạnh trong thử nghiệm và gây gián đoạn trong cửa sổ bảo trì. Hãy khởi động lại theo từng hồ sơ, không bao giờ toàn cục.

Ưu tiên một ứng dụng khách được duy trì khi cổng nối cung cấp một cái cho cùng giao thức, và không bao giờ mã hóa cứng mật khẩu trong kịch bản hay truyền nó trên dòng lệnh, vì tệp hồ sơ đã giữ bí mật. Nếu một tác vụ phải chạy như người dùng thường sau khi đường hầm lên, hãy giảm quyền từ bên trong kịch bản thay vì chạy toàn bộ chuỗi dưới tài khoản đó. Cuối cùng, hãy đọc lại các tuyến sau khi kết nối lại, vì một hồ sơ có thể quay lại với địa chỉ được gán khác và để lại một tuyến cũ mà không phép dò nào nhắm vào địa chỉ đường hầm sẽ nhận ra.

Bài viết liên quan