Nhật ký container mới thường kết thúc bằng một phàn nàn Read-only file system về /proc/sys/net/ipv4/route/flush, và dòng đó bị đổ lỗi cho một đường hầm có thể hoàn toàn khỏe mạnh. Thao tác ghi phía sau nhắm vào một mục của nhân không còn làm gì hữu ích khi bộ đệm tuyến IPv4 đã biến mất. Bên trong container, /proc/sys được gắn kết ở chế độ chỉ-đọc, nên việc chuyển hướng bị từ chối trước khi có giá trị nào được ghi vào và shell in ra lời từ chối đó. Một đường hầm đang hoạt động có thể in cảnh báo này chừng nào dòng cũ còn trong tập lệnh, và --privileged không bao giờ làm cho thao tác ghi có ý nghĩa.

Tập lệnh đã cố xóa những gì

Các tập lệnh kết nối cũ kết thúc bằng việc dọn bộ đệm: ghi một giá trị vào tệp điều khiển của nhân và yêu cầu ngăn xếp IPv4 bỏ bộ đệm định tuyến của nó, để một tuyến đường hầm mới được chọn mà không phải chờ các mục cũ hết hạn. Tệp đó được địa chỉ hóa dưới /proc/sys/net/ipv4/, khiến thao tác trở thành chuyển hướng của shell chứ không phải lệnh định tuyến. Nhân 3.6 đã loại bỏ bộ đệm đó, và cùng với nó là lý do tồn tại của việc xóa. Không gì trong đường dẫn dữ liệu hiện tại phụ thuộc vào thao tác ghi đó.

Bản thân mục đó vẫn tồn tại như một tệp cũ chỉ ghi, nên một tập lệnh còn ghi vào nó sẽ chạm tới một đường dẫn thật và một kiểm tra quyền thật. Trên máy chủ, thao tác ghi trả về thành công và không thay đổi gì. Trong container, cùng thao tác chuyển hướng đó đụng phải /proc/sys chỉ-đọc và thất bại với EROFS, mà shell in ra như thông báo hệ thống tệp chỉ-đọc. Trên các nhân thực sự không có đường dẫn đó, cách diễn đạt trở thành No such file or directory, và kết luận không thay đổi.

Hai lỗi nói những điều khác nhau, và sự khác biệt đáng được giữ rõ. Read-only file system nghĩa là nhân đã chạm tới một mục và từ chối thao tác ghi; No such file or directory nghĩa là mục đó đã biến mất. Không thông báo nào cho biết về thiết bị đường hầm, các tuyến hay việc phân giải tên, nên không thông báo nào có thể biện minh cho nhiều quyền hơn.

Chính thứ tự khiến thông báo trông có vẻ nhân quả. Một tập lệnh kết nối cài đặt tuyến, thay đổi trạng thái giao diện và viết lại phân giải tên trước khi tới bước dọn dẹp ở cuối, nên dòng được in cuối cùng là dòng mà người ta trích dẫn kể cả khi mọi bước quan trọng đều trả về thành công. Một đường hầm được thiết lập và mang lưu lượng trong khi in cảnh báo này khớp chính xác với cơ chế ở trên.

Kiểm tra việc gắn kết và tuyến trước khi thêm quyền

Ba lần đọc phân biệt một cảnh báo bề ngoài với một sự cố thật: tập lệnh đã cài còn mang dòng đó không, /proc/sys được gắn kết thế nào, và lưu lượng của ứng dụng thực sự đi đâu. Hãy chạy chúng trong cùng không gian tên của container hoặc trên máy chủ nơi cảnh báo xuất hiện, vì kiểm tra trên một máy không liên quan trả lời một câu hỏi khác.

grep -n 'ipv4/route/flush' /usr/share/vpnc-scripts/vpnc-script
findmnt -no OPTIONS /proc/sys
ip -4 route get 10.20.5.10

Câu trả lời của grep yếu hơn vẻ ngoài, vì việc tìm thấy chứng minh dòng đó tồn tại, không chứng minh nó chạy mà không có bảo vệ; một tập lệnh được bảo trì có thể mang thao tác ghi bên trong một lớp bảo vệ bỏ qua nó. findmnt -no OPTIONS /proc/sys quyết định việc gắn kết trực tiếp, và ro trong đầu ra đó nghĩa là mọi thao tác ghi bên dưới điểm đó đều bị từ chối, bất kể tập lệnh làm gì. Sau đó, tra cứu tuyến cho thấy đích mà ứng dụng cần được phân giải qua giao diện đường hầm hay qua cổng mặc định của container. Một tra cứu chọn cổng mặc định nghĩa là đường hầm đã lên và không có gì được định tuyến vào nó, đó là vấn đề định tuyến chứ không phải vấn đề quyền.

Bản sửa thực sự đến từ đâu

Bản sửa được bảo trì sống trong tập lệnh chứ không phải trong các cờ của container. upstream vpnc-script đã thay đổi cách xử lý thao tác này, nên hãy so sánh bản sao trong ảnh với upstream hiện tại và cập nhật qua gói hoặc bản dựng ảnh cung cấp nó. Một tệp được sửa tay bên trong container đang chạy không thể được xem xét và sẽ không tồn tại qua lần dựng tiếp theo.

--privileged được ghi nhận là cấp mọi khả năng cùng quyền truy cập thiết bị rộng rãi, một nhượng bộ lớn cho một thông báo không thay đổi gì, nên hãy nêu tên khả năng còn thiếu nếu thực sự thiếu. Sau khi cập nhật, hãy lặp lại tra cứu tuyến và để một ứng dụng sử dụng đường hầm, vì nhật ký yên tĩnh và kết nối hoạt động là hai kết quả riêng biệt.

Bài viết liên quan