Giữ cho quy tắc ip sống sót qua lần kết nối lại với systemd-networkd
Một quy tắc ip tạo từ shell biến mất ở sự kiện liên kết tiếp theo. Khai báo quy tắc, bảng của nó và các tuyến trong systemd-networkd để chính sách được tạo lại.
Thêm một quy tắc chính sách bằng ip rule và nó hoạt động cho đến khi liên kết biến mất; tại thời điểm đó nó đơn giản là không còn. Không có gì thất bại ồn ào: trạng thái của nhân đã thay đổi, và không chủ sở hữu cấu hình nào biết rằng quy tắc lẽ ra phải tồn tại. Đó là toàn bộ khác biệt giữa một quy tắc tồn tại và một quy tắc không tồn tại. Trên một máy có systemd-networkd, giải pháp là trao cho quy tắc một chủ sở hữu thay vì chạy lại lệnh sau mỗi lần kết nối lại.
Một quy tắc chỉ tồn tại nếu ai đó sở hữu nó
Chính sách định tuyến của nhân là trạng thái, không phải cấu hình. Nó sống trong hệ thống đang chạy, và bất cứ thứ gì phá bỏ giao diện mà nó phụ thuộc đều có thể mang nó đi theo. Một lệnh trong shell thay đổi trạng thái đó và không để lại bất kỳ ghi chép nào về ý định.
Các trình quản lý mạng làm ngược lại: chúng đọc cấu hình, áp dụng nó và áp dụng lại khi một sự kiện liên kết vô hiệu hóa trạng thái trước đó. Quy tắc được khai báo trong cấu hình của chúng được tạo lại, trong khi quy tắc thêm bên cạnh chúng là một vật thể lạ không có chủ.
Sự khác biệt đó có tên trong networkd, và đáng đọc trước khi bật bất cứ thứ gì. Trên các phiên bản gần đây, quy tắc lạ bị xóa theo mặc định, điều này khiến những người mong các mục thủ công của mình tồn tại phải ngạc nhiên.
Đọc phiên bản trước khi tin một thiết lập
Hành vi sở hữu được điều khiển bởi một thiết lập trong networkd.conf, và thiết lập đó không tồn tại trong các bản phát hành systemd cũ hơn. Kiểm tra phiên bản đã cài trước khi thiết kế quanh nó, vì một máy cũ hành xử khác với tài liệu bạn đang đọc.
Hai giá trị quan trọng. Một giá trị quyết định việc các quy tắc không được khai báo trong cấu hình networkd có bị xóa hay không, giá trị kia làm điều tương tự với các tuyến. Cả hai nói về quyền sở hữu chứ không phải nội dung chính sách, và cả hai theo mặc định chọn hành vi nghiêm ngặt hơn trong các bản phát hành hiện tại. Tắt chúng trên toàn cục giữ mọi quy tắc lạ sống, đó là một quyết định rộng hơn nhiều so với việc khai báo một chính sách VPN mong muốn.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
grep đó cho bạn biết điều gì được đặt cục bộ và giá trị mặc định của nhà cung cấp là gì. Việc không tồn tại cũng là thông tin, vì nó nghĩa là giá trị mặc định đã biên dịch đang áp dụng. Ghi giá trị mặc định vào ghi chú để người tiếp theo không phải khám phá lại.
Khai báo quy tắc và bảng mà nó trỏ tới
Một quy tắc trong tệp .network đặt tên cho một bảng, và một cái tên chỉ làm được thế. Nó không tạo các tuyến bên trong bảng đó và không kiểm tra xem chúng có hợp lý không. Khai báo quy tắc mà không có các tuyến sẽ tạo ra một chính sách khớp lưu lượng rồi bỏ nó đi.
Khai báo các tuyến trong cùng tệp, với bước nhảy tiếp theo có thể tới được và bảng đúng. Giữ độ ưu tiên trong quy tắc đã khai báo để nó rơi đúng chỗ bạn mong đợi trong danh sách có thứ tự. Một quy tắc tới bảng sai sớm hơn dự định sẽ thay đổi nhiều lưu lượng hơn dịch vụ mà bạn muốn sửa. Hãy đọc đoạn dưới đây như một hình dạng chứ không phải tệp đầy đủ, vì quyền sở hữu giao diện và phần còn lại của kết nối vẫn phải có mặt.
[RoutingPolicyRule]
Family=ipv4
IPProtocol=tcp
SourcePort=443
Table=100
Priority=1000
[Route]
Destination=10.80.0.0/24
Gateway=10.80.0.1
Table=100
Sau đó tải lại và đọc trạng thái của nhân thay vì tệp. Một cấu hình được phân tích sạch vẫn có thể tạo ra quy tắc mà bạn không định, và hai góc nhìn chỉ khớp nhau khi khai báo đã đầy đủ.
Chọn một chủ sở hữu cho giao diện
Hai trình quản lý trên một đường hầm tạo ra một cuộc tranh chấp trông như lỗi ở cả hai. Nhập một thiết lập wg-quick sẵn có vào networkd là di trú chứ không phải bổ sung, và chạy cả hai để lại giao diện cùng các quy tắc của nó dưới hai chủ sở hữu.
Thực hiện di trú trong một lượt: dừng đơn vị cũ, vô hiệu hóa nó, khai báo giao diện và các tuyến của nó trong networkd, rồi tải lại. Kiểm tra rằng đơn vị cũ không thể trở lại khi khởi động. Một đơn vị còn sót lại được kích hoạt lại sau khi khởi động lại sẽ ghi đè trạng thái bạn vừa khai báo. Giữ tệp cấu hình cũ cho đến khi tệp mới sống sót qua một lần kết nối lại, rồi cho nó nghỉ hưu.
Quyền sở hữu dấu cũng đáng được chăm sóc như vậy: nếu một quy tắc khớp với dấu của tường lửa, phải có thứ gì đó đặt dấu đó. Một quy tắc tham chiếu tới dấu mà không ai đặt là cấu hình chết trông có vẻ cố ý.
Luyện tập các sự kiện vòng đời
Cấu hình chỉ tốt bằng hành vi của nó qua các sự kiện. Hạ liên kết xuống, nâng lên, khởi động lại dịch vụ và gia hạn địa chỉ. Sau mỗi việc, đọc danh sách quy tắc và nội dung của bảng.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Kết quả mong muốn là cùng chính sách có chủ sở hữu được tạo lại và trạng thái cũ được cho nghỉ hưu, điều này bền hơn việc thêm lại một quy tắc shell sau mỗi lần kết nối lại. Giữ một dòng trong nhật ký thay đổi ghi tên tệp sở hữu quy tắc và phiên bản hỗ trợ nó. Khi đó kỹ sư tiếp theo có thể tìm thấy chính sách mà không phải lục lọi lịch sử shell. Một quy tắc không ai sở hữu là một quy tắc sẽ lại bị mất.