Giữ cho việc chuyển tiếp IPv4 tồn tại qua lần khởi động lại gateway VPN
Đặt ip_forward trong không gian tên mang gói tin của máy khách, gán cho cấu hình một chủ sở hữu duy nhất và chứng minh rằng nó sống sót qua lần khởi động lại thay vì chỉ sửa một tệp.
Ping tới gateway hoạt động nhưng truy cập bất cứ thứ gì phía sau thì không, và đây là hình dạng của một vấn đề chuyển tiếp chứ không phải vấn đề đường hầm. Việc giao hàng cục bộ tới gateway chứng minh rằng đường hầm đã lên và việc gán địa chỉ đã hoạt động; nó không nói gì về việc liệu nhân có chuyển một gói tin từ giao diện này sang giao diện khác hay không. Trước khi chạm vào bất kỳ sysctl nào, hãy xác nhận rằng máy này được dùng để định tuyến lưu lượng này và tìm ngữ cảnh mạng chứa giao diện hướng về máy khách. Sau đó đọc giá trị ở đó, chứ không phải ở nơi mà hướng dẫn cuối cùng bạn đọc tình cờ nhìn vào.
Đến được gateway không giống với chuyển tiếp
Bên trong nhân diễn ra hai quyết định riêng biệt. Việc giao tới một địa chỉ cục bộ kết thúc hành trình của gói tin; việc chuyển tiếp lại đưa nó ra ngoài qua một giao diện khác, và quyết định thứ hai đó được điều khiển theo từng không gian tên mạng. Một gateway có thể hoàn toàn truy cập được trong khi việc chuyển tiếp bị tắt, và từ dấu nhắc ping hai lỗi trông giống hệt nhau.
Ghi lại gói tin của máy khách đến trên giao diện nào và đường đi tiếp theo ra qua giao diện nào. Cả hai đều thuộc một không gian tên, và chính không gian tên đó chứa cấu hình quan trọng.
Đọc giá trị ở nơi các gói tin thực sự nằm
Trên một gateway định tuyến trong không gian tên của máy chủ, một lệnh duy nhất trả lời câu hỏi: sysctl net.ipv4.ip_forward. Khi đường vào và đường tiếp theo sống trong một không gian tên có tên, hãy hỏi không gian tên đó: ip netns exec vpn-gw sysctl net.ipv4.ip_forward. Giá trị của máy chủ không thay thế giá trị của không gian tên, và một trên máy chủ không phải bằng chứng cho bất cứ điều gì.
Không phải mọi ngữ cảnh định tuyến đều có nhãn mà bạn có thể đưa cho ip netns. Môi trường chạy container và các dịch vụ tạo ra những không gian tên không bao giờ được đăng ký dưới một cái tên thân thiện, và với những cái đó bạn dùng công cụ kiểm tra của môi trường chạy. Thay vpn-gw bằng tên thật, hoặc bằng cơ chế của môi trường chạy tiếp cận cùng ngữ cảnh, và đừng đoán ở cấp máy chủ nữa.
Gán cho cấu hình một chủ sở hữu duy nhất
Trên một gateway máy chủ systemd thông thường, dạng bền vững là một tệp drop-in với tên do quản trị viên chọn như /etc/sysctl.d/60-vpn-forwarding.conf, chứa net.ipv4.ip_forward = 1. Viết tệp, rồi nạp đúng tệp đó để trạng thái đang chạy cũng thay đổi: sudo sysctl -p /etc/sysctl.d/60-vpn-forwarding.conf, sau đó đọc lại để kiểm tra. Tên tệp chỉ là ví dụ chứ không phải đường dẫn VPN dành riêng, và số ở đầu quan trọng vì những tệp được sắp xếp sau sẽ thắng.
Thứ tự ưu tiên là nơi tính bền vững âm thầm vỡ. Kiểm tra cả bộ nạp của bản phân phối lẫn drop-in của riêng bạn, vì procps sysctl --system cũng đọc /etc/sysctl.conf ở cuối, trong khi thứ tự sysctl.d của systemd là một trình tự hoàn toàn khác. Một phép gán sau đó có thể đặt lại đúng khóa đó ngay lập tức, khiến tệp của bạn đúng nhưng giá trị hiệu lực sai. Đừng ghi đè một tệp quản trị viên hiện có để thắng cuộc tranh luận đó; hãy tìm chủ sở hữu và sửa ở đó.
Một không gian tên được tạo sau khi khởi động hoàn toàn không chịu sự quản lý của drop-in trên máy chủ. Cấu hình của nó thuộc về thứ tạo ra nó, dù đó là môi trường chạy container hay đơn vị cung cấp không gian tên. Trao cho container đặc quyền máy chủ rộng rãi để né câu hỏi là một sự đánh đổi tệ hơn việc dành mười phút xác định đúng chủ sở hữu.
Biết cái giá của công tắc trước khi bật nó
ip_forward không phải một boolean vô hại. Tài liệu của nhân ghi nhận rằng việc thay đổi nó đặt lại một số tham số IPv4 khác về mặc định của máy chủ hoặc bộ định tuyến, nên một lần bật để chẩn đoán có thể vứt bỏ tinh chỉnh đã làm ở nơi khác mà không hề nhắc đến. Hãy coi nó là một thay đổi cấu hình có tác dụng phụ chứ không phải một phép thử có thể chạy tùy tiện.
Điều đó cũng loại trừ việc tắt rồi bật nó mỗi khi máy khách không đến được máy chủ. Nếu giá trị đã là một, lỗi nằm ở chỗ khác trên đường đi, và việc viết lại cùng một khóa lần thứ ba sẽ không làm nó nhúc nhích.
Chứng minh tính bền vững, rồi kiểm tra phần còn lại của đường đi
Đọc lại giá trị ở bốn thời điểm: ngay sau khi thay đổi, sau khi giao diện VPN xuất hiện, sau khi kết nối lại, và sau một lần khởi động lại đã lên kế hoạch. Một giá trị quay ngược lại ở bất kỳ điểm nào trong số đó có một chủ sở hữu thứ hai, và thêm một lần ghi một lần nữa chỉ che giấu điều đó cho đến lần khởi động lại tiếp theo.
Chuyển tiếp được bật vẫn còn ba điều phải xác minh. Máy khách cần một tuyến đường tới đích, gateway cần một tuyến đường tiếp theo cùng quyền sử dụng nó, và đích cần một đường quay lại địa chỉ đường hầm của máy khách. Một LAN riêng đã được định tuyến không tự động cần NAT, vì vậy đừng thêm masquerading trước khi biết cái nào trong ba thứ đó còn thiếu, và hãy kiểm tra từ máy khách dự định chứ không phải từ chính gateway, vì một yêu cầu bắt nguồn trên gateway không bao giờ chạm vào đường chuyển tiếp mà bạn vừa bật. IPv6 có chính sách chuyển tiếp và định tuyến riêng, nên một bài kiểm tra IPv4 thành công không nói gì về nó.
Giữ cùng nhau trong runbook đường dẫn drop-in, chủ sở hữu không gian tên và lệnh đọc lại. Người tiếp theo đảm nhận việc này phải đọc được giá trị, thấy ai sở hữu nó, và quyết định trong vòng một phút liệu vấn đề là tính bền vững hay phần còn lại của đường đi.