Một cấu hình từng khởi động nay thất bại với lỗi tùy chọn, và dòng mà bộ phân tích trích dẫn trông hoàn toàn hợp lý trên màn hình. Đó là cái bẫy: tệp cấu hình là một danh sách các dòng vật lý, mỗi dòng chứa một từ khóa tùy chọn và các đối số của nó, và một dòng dài bị trình soạn thảo xuống dòng trông giống hệt hai dòng cho đến khi bạn nhìn vào các byte. Không có gì về mạng, chứng chỉ hay đường hầm liên quan đến loại lỗi này. Hai dòng trông giống hệt nhau trên màn hình có thể khác nhau chỉ một byte.

Hãy thực hiện các kiểm tra dưới đây theo thứ tự và dừng ở kiểm tra đầu tiên thất bại. Mỗi kiểm tra rẻ hơn kiểm tra tiếp theo, và mỗi kiểm tra loại trừ một cách giải thích khác nhau.

Một dòng, một chỉ thị

Bộ phân tích đọc một dòng, lấy từ đầu tiên làm tùy chọn và coi phần còn lại là đối số của tùy chọn đó. Vì vậy một dòng như cert server.crt port 1194 không phải hai chỉ thị liên tiếp. Đó là một tùy chọn cert với ba đối số, và đối số thứ ba không phải tên tệp mà tùy chọn chấp nhận. Đọc lỗi như một ngắt dòng bị thiếu là đúng; đọc nó như một chỉ thị bị thiếu thì không.

# malformed: one option, three arguments
cert server.crt port 1194

# intended: two options, one argument each
cert server.crt
port 1194

Hai dòng đã sửa đó là một đoạn trích, không phải cấu hình. Chúng tồn tại để cho thấy ranh giới nằm ở đâu. Mọi chỉ thị thông thường trong cấu hình đều theo cùng quy tắc, và một dòng nối hai chỉ thị sẽ tạo ra lỗi đối số hoặc một giá trị mà tùy chọn không mong đợi.

Chứng minh ngắt dòng là thật

Trình soạn thảo xuống dòng để hiển thị. Một số còn chèn ngắt cứng khi bạn dán, số khác thì không, nên cùng một kết quả thị giác có thể đến từ hai tệp rất khác nhau. Hãy hiển thị phần cuối dòng và đếm số dòng trước khi thay đổi bất cứ điều gì. Đo đạc tốn một lệnh; đoán mò tốn một buổi tối.

cat -A /etc/openvpn/server/lab.conf | sed -n '10,20p'
awk 'NR>=10 && NR<=20 {printf "%d:%s\n", NR, $0}' /etc/openvpn/server/lab.conf

Trong kết quả đầu tiên, mỗi ngắt dòng thật xuất hiện dưới dạng dấu $, vì vậy một dòng bị xuống dòng nhưng không bị tách sẽ không hiển thị dấu nào ở nơi màn hình của bạn xuống dòng. Lệnh thứ hai in các dòng có số, đây là cách nhanh nhất để so sánh những gì bộ phân tích báo cáo với những gì tệp chứa.

Khoảng trắng thừa cũng không tạo ra chỉ thị. Thụt lề chỉ là hình thức, và một dòng bắt đầu bằng khoảng trắng vẫn là cùng một tùy chọn duy nhất. Nếu thông báo lỗi chỉ ra số dòng, hãy đọc đúng dòng đó thay vì đoạn văn chứa nó.

Trích dẫn một đường dẫn, không phải danh sách chỉ thị

Dấu ngoặc kép dành cho các đối số chứa khoảng trắng, không dành cho việc nhóm các tùy chọn. Một đường dẫn chứng chỉ có khoảng trắng cần dấu ngoặc kép riêng; hai chỉ thị dùng chung một cặp ngoặc kép vẫn là một dòng sai.

cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"

Hãy kiểm tra tên tùy chọn cùng lúc với bố cục, vì một dòng bị nối có thể tạo ra một token trông có vẻ hợp lý mà chưa từng tồn tại. Chỉ thị cổng là port; một cấu hình dùng thứ khác cho cùng ý tưởng sẽ thất bại ngay cả sau khi đã sửa ranh giới dòng. Khi một tên trông lạ, hãy so sánh nó với danh sách tùy chọn của phiên bản bạn chạy thay vì với một ví dụ trên diễn đàn.

Giữ các khối nội tuyến là khối

Cấu hình có thể mang chứng chỉ và khóa nội tuyến, và những khối đó là dữ liệu chứ không phải cấu hình. Các dòng PEM bên trong một khối không phải là tùy chọn để làm phẳng, thụt lề lại hay nối lại, và các dấu khối phải nằm trên dòng riêng của chúng.

Hãy coi một khối nội tuyến là vùng mờ: sửa các dòng tùy chọn xung quanh, để nội dung của nó nguyên vẹn từng byte, và không bao giờ dán nó vào một luồng hỗ trợ công khai. Nếu một công cụ định dạng đã viết lại khối, hãy khôi phục nó từ PKI của bạn thay vì sửa tay.

Sửa phần nhỏ nhất, không phải mẫu

Cách sửa hấp dẫn là thay toàn bộ tệp bằng cấu hình từ một hướng dẫn „hoạt động”. Điều đó đánh đổi một dòng sai lấy một loạt thay đổi chính sách mà không ai xem xét: tham số DH khác, cài đặt nén, lựa chọn mật mã, trình lắng nghe trùng lặp. Vấn đề ban đầu nhỏ và cục bộ, còn bản thay thế thì không phải cả hai.

Sao chép cấu hình vào một tệp làm việc được bảo vệ, sửa ranh giới dòng trong bản sao đó, và để người quản lý thông thường của dịch vụ nạp nó. Sau đó khởi động phiên bản và đọc lỗi đầu tiên, nếu có, từ đầu.

openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log

Khi giai đoạn phân tích qua, lỗi tiếp theo sẽ liên quan đến tệp, chứng chỉ hoặc mật mã thay vì từ vựng, và đó là tiến bộ thật. Hãy giữ bản sao làm việc và một ghi chú một dòng về những gì đã bị nối; thao tác dán tương tự sẽ lại xảy ra với người khác trong cùng nhóm.

Bài viết liên quan