"File exists" của OpenVPN trên một tuyến không phải lỗi tệp
Thông báo đến từ bảng tuyến của nhân, không phải từ hệ thống tệp. Đọc mục đã sở hữu tiền tố trước khi thay đổi chính sách LAN.
Bắt đầu từ nơi thông báo xuất hiện. Một máy khách kết nối, đường hầm dựng lên, rồi nhật ký báo rằng lệnh thêm tuyến của Linux thất bại với File exists. Không có gì trong câu đó đề cập đến chứng chỉ, khóa hay tệp cấu hình, dù các từ gợi ý như vậy. Nhân đang mô tả bảng tuyến của nó, và tiền tố bạn yêu cầu cài đặt đã có một mục.
Theo đúng trình tự của máy khách: nó yêu cầu gì, bảng đã chứa gì, ai đã đặt mục đó ở đó, và chỉ sau đó mới xem cần thay đổi gì. Mỗi bước loại bỏ một chủ sở hữu khả dĩ.
Máy khách thực sự đang yêu cầu gì
Trước khi lỗi, máy khách ghi lại tuyến định thêm, thường là đích, mặt nạ mạng, cổng và đôi khi là số đo hoặc bảng. Dòng đó chính là yêu cầu. Lỗi tiếp theo là câu trả lời của nhân, và cả hai phải được đọc cạnh nhau.
journalctl -u openvpn-client@office -b --no-pager | grep -nE 'route|File exists'
openvpn --config /etc/openvpn/client/office.ovpn --verb 4 --log /tmp/ovpn.log
Trạng thái thoát khác không của trình trợ giúp tuyến ít thông tin hơn văn bản bên dưới, vì các phản hồi khác nhau của nhân đều tạo ra trạng thái khác không. Giữ nguyên thông báo chính xác; sự phân biệt giữa một mục đã tồn tại và một cổng không thể tới quyết định phần nào sau đây áp dụng.
Đọc tuyến đã tồn tại, không chỉ địa chỉ
Tìm trong bảng cùng bộ bốn chấm không đủ. Một đối tượng tuyến được nhận diện bởi họ địa chỉ, bảng, tiền tố đích, số đo, giao thức và thiết bị đầu ra, và các mục dùng chung tiền tố có thể cùng tồn tại hợp lệ khi các thuộc tính đó khác nhau. Thứ xung đột là toàn bộ đối tượng, không phải văn bản.
ip -4 route show table all | grep -F '10.40.'
ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5
Lệnh cuối trả lời một câu hỏi khác hai lệnh đầu: không phải cái gì tồn tại, mà nhân sẽ chọn mục nào cho đích đó ngay bây giờ. Cả hai góc nhìn đều hữu ích, và chúng khác nhau đủ thường xuyên để đáng so sánh trước khi kết luận bất cứ điều gì. Sự không khớp giữa chúng là trường hợp thú vị, không phải lỗi làm tròn.
Ghi lại tiền tố, bảng, số đo và thiết bị bên cạnh yêu cầu thất bại. Nếu mục đã tồn tại có cùng thuộc tính và cùng bước nhảy tiếp theo, bạn có một chỉ dẫn trùng lặp chứ không phải vấn đề định tuyến.
Bốn chủ sở hữu mà một tiền tố có thể có
Các tuyến kết nối đến từ một địa chỉ được gán và hệ thống tạo lại chúng mỗi khi địa chỉ đó tồn tại. Một máy khách DHCP hoặc trình quản lý kết nối cài đặt tuyến như một phần trong vòng đời của chính nó. Một máy khách VPN khác có thể đã mang cùng tiền tố. Và một móc hay script cục bộ có thể thêm một tuyến mà không thứ gì khác biết.
Mỗi chủ sở hữu cần một cách sửa khác nhau. Tuyến kết nối không phải của bạn để xóa; xóa nó có thể phá vỡ truy cập cục bộ trước khi đường hầm dùng được, và nhân sẽ đặt nó trở lại. Tuyến thuộc trình quản lý nên được thay đổi qua trình quản lý đó, không phải bằng ip route del thủ công mà lần kết nối lại tiếp theo sẽ hủy.
Một giao diện được giữ lại khiến sự nhầm lẫn tương tự dễ xảy ra hơn. Khi thiết bị đường hầm sống sót qua lần kết nối lại, các tuyến do mã thiết lập tùy chỉnh cài đặt có thể vẫn còn ở lần chạy thứ hai, nên một script giả định trạng thái sạch sẽ thất bại lần thứ hai và chạy được lần đầu. Hoặc xóa mục cũ một cách có chủ ý, hoặc làm cho mã thiết lập trở nên bất biến khi lặp lại.
block-local trả lời một câu hỏi khác
Khi một hồ sơ gửi toàn bộ lưu lượng qua đường hầm, máy khách phải quyết định điều gì xảy ra với mạng cục bộ. Cờ block-local thay đổi quyết định đó bằng cách định tuyến LAN cục bộ qua đường hầm trong khi vẫn giữ ngoại lệ được ghi chép cho cổng LAN; đây là một lựa chọn chính sách lưu lượng với hậu quả rõ ràng đối với khả năng truy cập.
Nó không giải thích tại sao việc thêm tuyến lại trả về lỗi mục đã tồn tại, và việc coi đó là cách sửa phổ quát sẽ giấu xung đột thực sự sau một thay đổi chính sách. Nếu tài nguyên cục bộ của bạn trở nên không thể truy cập sau khi sửa hồ sơ, cờ này là một trong những thứ đầu tiên cần kiểm tra; nếu việc thêm tuyến thất bại, nó không phải là câu trả lời.
Hãy coi nó như một quyết định về việc đích nào vẫn ở cục bộ, được đưa ra có chủ ý và ghi lại. Nó không phải là công tắc để thử khi nhật ký trông đáng lo.
Khép vòng lặp: loại bỏ bản trùng tại nguồn của nó
Sau khi biết chủ sở hữu nào đang giữ mục, hãy loại bỏ chỉ dẫn trùng tại nơi nó được định nghĩa. Đó có thể là một dòng route trong hồ sơ, một push từ máy chủ hoặc một móc không còn cần chạy.
ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5
journalctl -u openvpn-client@office -b --no-pager | tail -n 15
Sau đó kết nối lại và xác nhận ba điều: đường hầm dựng lên, đích dự định phân giải theo tuyến bạn muốn, và lỗi biến mất mà không có lỗi mới thay vào chỗ đó. Một nhật ký sạch với tuyến chọn sai không phải là bản sửa.
Nếu tiền tố có nghĩa là LAN cục bộ ở một bên và mạng từ xa ở bên kia, vấn đề là chồng lấn địa chỉ chứ không phải bản trùng, và không việc xóa nào khiến cả hai nghĩa cùng đúng một lúc. Trường hợp đó cần một kế hoạch khác cho một trong hai mạng. Hãy quyết định bên nào sẽ được đánh số lại trước khi chạm vào bên nào.