Máy khách OpenVPN dạng cầu không có internet? Kiểm tra quy tắc NAT
Máy khách OpenVPN dạng cầu đi ra qua thiết bị tap, nên quy tắc masquerade nêu tên card mạng vật lý không bao giờ khớp và bộ đếm vẫn ở mức không.
Máy chủ dạng cầu đã chạy, quy tắc masquerade có đó, mà trình duyệt trên máy khách vẫn quay. Mọi thứ trông như phải hoạt động được, vì thế giờ đầu tiên dành cho việc kiểm tra đường hầm và thông tin đăng nhập. Rồi bạn đọc bộ đếm trên quy tắc NAT và thấy một số không không hề nhúc nhích. Một quy tắc chưa từng đếm gói nào thì chưa từng khớp với gói nào, và trên máy chủ dạng cầu lý do mang tính cấu trúc: lưu lượng của máy khách đi ra qua thiết bị tap ảo, trong khi quy tắc lại nêu tên card vật lý mà bạn chép từ một hướng dẫn cũ.
Bằng chứng là bộ đếm, không phải mục trong bảng
Quy tắc tồn tại và quy tắc khớp là hai chuyện khác nhau, và bộ đếm là thứ phân biệt chúng. Liệt kê bảng NAT với bộ đếm chi tiết và đọc các con số bên cạnh từng quy tắc trước khi thay đổi bất cứ thứ gì. Bộ đếm đứng yên ở số không trong khi lưu lượng vẫn chảy nghĩa là quy tắc đã bị bỏ qua, dù địa chỉ của nó trông có hợp lý đến đâu. Bộ đếm tăng lên trong khi kết nối vẫn hỏng sẽ đưa bạn sang chỗ khác: chuyển tiếp, đường trở về, hoặc đầu xa.
iptables -t nat -L POSTROUTING -v -nTrước hết đọc bộ đếm bên cạnh chỗ khớp giao diện. Nếu dải nguồn đúng mà phía đầu ra sai, cách sửa là một từ trong quy tắc, không phải một quy tắc hoàn toàn mới.
Tìm tên mà kernel thực sự ghi lại
Xác định tên thiết bị đường hầm trước khi viết quy tắc, dùng danh sách giao diện thay vì trí nhớ. Trong một thiết lập OpenVPN dạng cầu, thiết bị thường là giao diện tap do máy chủ tạo ra, và tên của nó là một phần cấu hình cục bộ của bạn, không phải hằng số phổ quát. Xác nhận nó tồn tại khi đường hầm đang bật, vì một thiết bị chỉ xuất hiện sau khi máy khách kết nối sẽ khiến lần kiểm tra trước đó trông như lỗi quy tắc.
ip -brief linkGhi lại tên đó. Mọi lệnh về sau trong chẩn đoán này đều tham chiếu đến nó, và một lỗi đánh máy ở đây tạo ra đúng bộ đếm không giống hệt lỗi ban đầu.
Viết lại quy tắc cho thiết bị đường hầm
Hướng quy tắc vào thiết bị đường hầm và giữ dải máy khách làm điều kiện khớp, để nó bao trùm lưu lượng đường hầm và để yên các kết nối của chính máy chủ. Thay bằng dải và tên thiết bị của bạn, vì cả hai bên dưới đều là ví dụ và không cái nào chuyển được giữa các bản cài đặt.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o tap0 -j MASQUERADESau đó kiểm tra hai điều kiện khác mà cùng triệu chứng ấy che giấu. Kiểm tra xem chuyển tiếp có được bật không, và nếu không, hãy bật nó trong cấu hình của chính bản phân phối thay vì bằng một echo biến mất sau khi khởi động lại. Cũng đọc bộ đếm của chuỗi forward, và nếu chuỗi này bỏ lưu lượng đường hầm, hãy cho phép riêng giao diện đó và để nguyên chính sách của chuỗi.
Đọc chuỗi forward kèm bộ đếm chỉ tốn một lệnh và loại bỏ một nửa khả năng còn lại trước khi bạn chạm vào quy tắc khác.
Vì sao card vật lý không bao giờ khớp
Cầu là một switch phần mềm được ghép từ thiết bị tap và một giao diện vật lý. Khung của máy khách đi vào switch đó và đi ra về phía mạng vật lý như một thành viên của cầu chứ không phải như một gói trên card. Vì thế kernel gán gói đó cho cầu và cổng của nó, và vì thế card mà bạn đang nghĩ tới không bao giờ xuất hiện trong chỗ khớp. Giao diện vật lý không hỏng gì; nó đơn giản không phải thiết bị mà kernel gán gói đó.
Vấn đề tiếp theo mà mọi người gặp đến từ chính cấu trúc đó: lọc khung trên cầu là một cơ chế riêng so với lọc IP. Nếu yêu cầu là hạn chế ở mức khung, nó thuộc về lọc cầu, không phải một quy tắc trong bảng IP.
Chứng minh từ đầu đến cuối, rồi làm cho nó bền vững
Bật một máy khách và ping một thứ gì đó trong LAN của máy chủ; đường đó rèn luyện việc chuyển tiếp mà không có bất kỳ chuyển đổi địa chỉ nào. Sau đó yêu cầu một thứ công khai để quy tắc masquerade buộc phải được dùng, và đọc bộ đếm thêm lần nữa: nó phải nhích cho lần kiểm tra này chứ không phải lần trước. Một bản bắt gói trên thiết bị đường hầm cho thấy cả nơi khung xuất hiện lẫn địa chỉ mà nó mang.
Bước cuối: đưa các quy tắc đang chạy được vào cấu hình mà lần khởi động lại đọc, và ghi lại tên thiết bị mà cầu của máy này thực sự dùng. Mọi thứ gõ tay đều mất sau khi khởi động lại, và cùng lỗi ấy quay lại mà không còn gì giải thích nó.
Nếu bộ đếm vẫn không nhích sau khi viết lại, hãy so dải nguồn trong quy tắc với địa chỉ mà máy khách thực sự nhận được, vì máy chủ dạng cầu có thể cấp địa chỉ từ một dải mà bạn không định dùng.