Các script khởi động ứng dụng VPN ở tầng mà tác giả đã chọn, và tầng đó hiếm khi là tầng mà công việc cần. Dòng lệnh của nhà cung cấp, trình quay số của hệ điều hành và ý định ứng dụng di động đều trở về ở những thời điểm khác nhau trong vòng đời kết nối. Chúng cũng xử lý bí mật khác nhau, và sự khác biệt đó quyết định mật khẩu có hiển thị với mọi người dùng trên máy hay không. Chọn tầng trước khi viết dòng đầu tiên của script.

Tầng 1: dòng lệnh của nhà cung cấp

Hầu hết ứng dụng desktop cung cấp dòng lệnh nhận tên hồ sơ và, quá thường xuyên, mật khẩu. Ứng dụng cũ của Cisco chấp nhận động từ connect với đối số người dùng và mật khẩu; macOS phơi bày dịch vụ tích hợp qua networksetup; NetworkManager trả lời nmcli. Những lệnh gọi này trở về khi lệnh kết thúc, không phải thời điểm đường hầm trở nên dùng được. Đọc tài liệu của chính nhà cung cấp cho phiên bản bạn triển khai, vì các giao diện này thay đổi và một số bị loại bỏ hoàn toàn.

nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"

Ưu điểm là nhà cung cấp biết kho hồ sơ của chính họ, nên lệnh gọi dùng cùng cấu hình mà GUI sẽ dùng. Nhược điểm là mỗi nhà cung cấp tự phát minh động từ của mình, và script viết cho một ứng dụng không chuyển sang ứng dụng khác. Hãy coi tầng này là đường ngắn nhất khi ứng dụng cố định và phiên bản được ghim.

Tầng 2: dịch vụ của chính hệ điều hành

Trên Windows, trình quay số là một phần của hệ điều hành và làm việc với một mục trong sổ điện thoại thay vì kho hồ sơ của nhà cung cấp. Điều đó làm nó dễ di chuyển hơn giữa các ứng dụng và dễ viết script hơn từ tài khoản dịch vụ. Nó cũng có nghĩa là kết nối có thể tồn tại ở một nơi mà không ở nơi kia, khiến những người nhìn vào danh sách sai bị nhầm lẫn.

rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus

Dùng bề mặt PowerShell khi bạn cần tạo hoặc xóa mục thay vì quay số nó. Các tầng WMI và cmdlet phơi bày cùng đối tượng dưới tên khác nhau, và xóa là thao tác riêng so với ngắt kết nối. Một script chỉ quay số sẽ để lại các mục lỗi thời sau khi di chuyển. Kiểm tra kho mà tự động hóa của bạn ghi vào trước khi hứa rằng việc dọn dẹp sẽ xảy ra.

Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection

Trên macOS, tương đương là danh sách dịch vụ mạng, nơi một dịch vụ hiện có được kết nối theo tên thay vì được tạo ngay.

Thông tin đăng nhập rò rỉ ở mọi tầng, nên hãy chọn kênh

Mọi thứ bạn truyền trên dòng lệnh đều hiện trong bảng tiến trình cho mọi người dùng cục bộ, và thường tồn tại cả trong lịch sử shell. Lựa chọn thay thế được OpenVPN hỗ trợ là đọc bí mật từ một tệp với --askpass, và bản thân tệp cần quyền khớp với mức tin cậy bạn đặt vào nó. Một đường ống có tên tránh ghi bí mật ra đĩa nhưng cho phép bất kỳ tiến trình nào mở được nó ghi vào đó. Trên Windows, lưu bí mật trong trình quản lý thông tin đăng nhập, hoặc trong tệp mà chỉ tài khoản dịch vụ đọc được, và không bao giờ để nguyên văn trong tệp batch.

openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret

Quy tắc tương tự áp dụng cho token và mã dùng một lần: nếu tự động hóa cần chúng, tự động hóa cần một kênh không phải đối số dòng lệnh. Xoay bí mật khi bạn đổi cơ chế, vì giá trị cũ đã nằm đâu đó trong nhật ký. Một script chạy được mà rò rỉ không phải script chạy được.

Chờ trạng thái, rồi giám sát một chủ sở hữu duy nhất

Mỗi lệnh gọi này trở về trước khi đường hầm sẵn sàng, nên hãy thăm dò trạng thái mà ứng dụng phơi bày hoặc thử một đích bên trong với thời gian chờ. Sao chép tệp hoặc mở kết nối cơ sở dữ liệu ngay sau lệnh gọi kết nối là một cuộc đua, và nó thất bại gián đoạn theo cách trông như lỗi mạng.

ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null

Ngắt kết nối có cùng vấn đề theo chiều ngược lại: tiến trình có thể thoát trước khi các tuyến biến mất. Dùng hook của ứng dụng ở nơi chúng tồn tại, như các script up và down của OpenVPN hoặc ExecStartPost của một đơn vị systemd, vì chúng chạy đúng tại điểm bạn thực sự quan tâm. Hook chạy với đặc quyền của thứ đã gọi chúng, nên một hook khởi động lại mạng cần quy tắc rõ ràng thay vì giả định. Giữ đúng một chủ sở hữu trong suốt vòng đời kết nối.

Khi hai giám sát viên cùng khởi động và dừng hồ sơ đó, kết quả là một vòng lặp kết nối lại đọc như sự cố nhà cung cấp. Runbook kết thúc khi tầng được ghi tài liệu, bí mật có kênh không phải argv, điều kiện chờ là kiểm tra trạng thái có thời gian chờ, và một tiến trình sở hữu vòng đời.

Bài viết liên quan