client-config-dir bị bỏ qua sau khi OpenVPN trở thành dịch vụ
Một client-config-dir tương đối được phân giải theo thư mục làm việc của daemon. Đọc unit, rà quyền của đường dẫn, rồi xác nhận việc tra cứu trong nhật ký.
Đường hầm của bạn dựng lên và ứng dụng khách kết nối, nhưng địa chỉ cố định và các tuyến được đẩy mà bạn đã định nghĩa cho đúng người dùng đó bị thiếu. Nhật ký không ghi “file not found”, và chính điều đó khiến người ta đi tạo lại chứng chỉ. Trong phần lớn các trường hợp này, daemon chạy từ một thư mục khác với shell bạn đã thử nghiệm, và client-config-dir chưa bao giờ được phân giải như bạn giả định. Cách sửa là chỉnh lại đường dẫn, không phải đặt lại thông tin xác thực.
Đọc unit trước khi chạm vào cấu hình
Hãy bắt đầu từ tiến trình thực sự chạy, không phải tệp bạn đã sửa. Hỏi systemd về dòng thực thi, thư mục làm việc và tài khoản mà nó chuyển xuống. Ba câu trả lời đó giải thích phần lớn các lỗi trong nhóm này:
systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectoryMột WorkingDirectory trống nghĩa là unit khởi động trong /, nên client-config-dir ccd tương đối được tìm trong /ccd. Thư mục đó gần như không bao giờ tồn tại, và daemon không coi việc thiếu nó là nghiêm trọng.
So sánh với lần khởi chạy tương tác bạn dùng khi thử nghiệm, nơi thư mục hiện tại của shell có lẽ chính là thư mục cấu hình. Cùng một tệp, cùng các từ khóa, hai kết quả khác nhau.
Đường dẫn tương đối được phân giải theo cái gì
Từ khóa được phân giải theo thư mục làm việc của tiến trình tại thời điểm tùy chọn được dùng. Nó không có nghĩa là “bên cạnh tệp cấu hình mà tôi đã truyền bằng --config”. OpenVPN sẵn lòng đọc cấu hình từ một đường dẫn tuyệt đối và vẫn phân giải các giá trị tương đối ở nơi khác, và đó chính là cái bẫy ở đây. Hướng dẫn OpenVPN 2.6 nêu quy tắc dưới --client-config-dir và một lần nữa dưới --cd.
Từ khóa cd thay đổi bối cảnh đó trước khi các tệp khác được đọc, nên một unit đặt cd /etc/openvpn/server rồi client-config-dir ccd sẽ được phân giải thành /etc/openvpn/server/ccd. Nếu bạn thêm cd, hãy kiểm tra thứ tự các chỉ thị và nhớ rằng nó ảnh hưởng đến mọi tham chiếu tương đối khác trong cùng tệp.
Rà đường dẫn với tư cách tài khoản của daemon
Một đường dẫn có thể đúng mà vẫn không đọc được. Sau khi hạ đặc quyền, daemon không còn là root, nên mọi thư mục cha cần quyền tìm kiếm cho tài khoản đó, và bản thân tệp khách cần quyền đọc. Chỉ một bit thực thi thiếu trên thư mục cha là đủ để giấu tệp, và lỗi chỉ hiện ra dưới dạng một ứng dụng khách lặng lẽ nhận nhóm mặc định.
namei in quyền của từng thành phần theo thứ tự, nhanh hơn việc kiểm tra từng thư mục một:
namei -l /etc/openvpn/server/ccd/client1Sau đó thử đọc với tư cách tài khoản dịch vụ thay vì chính bạn:
runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readableNếu unit dùng chroot, thư mục phải tồn tại bên trong nhà tù, và đường dẫn trong cấu hình được diễn giải sau khi áp dụng chroot. Một tệp nằm trên máy chủ bên ngoài nhà tù là vô hình từ bên trong.
Xác nhận việc tra cứu thay vì đoán
Tăng mức nhật ký cho một lần khởi động lại và đọc xem máy chủ nói gì về các tùy chọn dành riêng cho khách. Ở mức verb 4 daemon báo cáo cấu hình theo từng khách mà nó đã nhập, nên một dòng vắng mặt là bằng chứng trực tiếp rằng không tệp nào được đọc cho kết nối đó.
openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccdChạy điều đó ở tiền cảnh trên một cổng trống và kết nối một khách. Điều đó loại systemd hoàn toàn khỏi bức tranh: nếu các ghi đè xuất hiện ở đây mà không xuất hiện dưới dịch vụ, thì khác biệt là bối cảnh của unit, không phải tệp.
Quyết định điều gì phải xảy ra khi không tệp nào khớp. Không có ccd-exclusive khách chỉ được chấp nhận với cài đặt nhóm toàn cục, và đó là lỗi âm thầm đã mô tả ở trên. Có nó, một tệp thiếu trở thành kết nối bị từ chối, và sự từ chối đó dễ nhận ra hơn nhưng khó gỡ lỗi hơn khi có tải.
Sửa, khởi động lại, kiểm chứng
Hãy làm cho thư mục thành tuyệt đối trong cấu hình và giữ nguyên như vậy. Đường dẫn tương đối chỉ an toàn khi unit ghim thư mục làm việc, và việc ghim là một bộ phận chuyển động thêm mà ai đó sẽ gỡ bỏ sau này.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveKhởi động lại phiên bản, kết nối lại một khách đã biết và đọc địa chỉ mà nó nhận được cùng các tuyến được đẩy tới nó. Nếu địa chỉ khớp với dòng ifconfig-push trong tệp của khách đó, việc tra cứu đã hoạt động. Nếu khách vẫn rơi vào nhóm chung, hãy quay lại số dòng nhật ký: không lần nhập nào nghĩa là đường dẫn hoặc danh tính sai, một lần nhập với nội dung sai nghĩa là bạn đang sửa một tệp khác với tệp daemon đọc.
Quay lại bằng cách khôi phục unit và cấu hình trước đó cùng nhau, rồi khởi động lại. Chứng chỉ không cần phát hành lại vì bất cứ điều gì trong số này, và coi một vấn đề thư mục như vấn đề thông tin xác thực chính là cách một bản sửa năm phút biến thành cửa sổ bảo trì.