Đường hầm đã lên, handshake diễn ra hai phút một lần, và đúng một địa chỉ ở phía bên kia trả lời. Ping tới địa chỉ đường hầm của peer hoạt động; không gì phía sau nó hoạt động. Ai đó đọc cấu hình giao diện, thấy tiền tố máy chủ và kết luận rằng mặt nạ sai. Mở rộng nó thành /24 sửa được ping một thời gian rồi làm hỏng thứ khác. Tiền tố chưa bao giờ là nguyên nhân, và tuyến bị thiếu không phải tuyến mà mặt nạ kiểm soát.

Tiền tố giao diện thực sự tạo ra gì

Trên Linux, việc gán một địa chỉ cho giao diện tạo ra một tuyến kết nối cho tiền tố đó. Gán tiền tố máy chủ thì tuyến kết nối chỉ bao một địa chỉ. Gán /24 thì nó bao 256 địa chỉ, và mỗi địa chỉ trong đó giờ được coi là tới được qua liên kết ấy.

ip -4 addr show dev wg0
ip -4 route show dev wg0
ip route get 10.80.7.1

Tiền tố máy chủ là lựa chọn hoàn toàn bình thường cho đường hầm điểm-điểm, vì chỉ có đúng một peer ở đầu kia. Lệnh thứ ba là lệnh trả lời câu hỏi của người dùng: nó cho biết kernel sẽ dùng giao diện nào cho đích đó, và nó sẽ không hiển thị gì hữu ích nếu không có tuyến nào khớp.

Đó là toàn bộ lời giải thích cho triệu chứng. Một địa chỉ trả lời vì có tuyến kết nối cho nó, hoặc vì danh sách được phép của peer tình cờ bao gồm nó. Mọi thứ khác không có tuyến và bị loại bỏ trước khi WireGuard can dự. Đường hầm vẫn khỏe suốt thời gian, đó là lý do bộ đếm handshake vẫn trông đáng yên tâm.

AllowedIPs là hai quy tắc dưới một cái tên

Danh sách được phép theo từng peer của WireGuard làm hai việc cùng lúc, và cú pháp cấu hình khiến chúng trông như một. Ở chiều vào, nó cho phép peer được trình ra những địa chỉ nguồn nào. Ở chiều ra, nó chọn gói tin gửi tới peer nào, bằng cách tìm kết quả khớp cụ thể nhất.

Không việc nào trong hai việc đó là định tuyến. Kernel vẫn phải quyết định rằng gói tin thuộc về giao diện đường hầm trước khi WireGuard nhìn vào nó, và quyết định đó đến từ bảng định tuyến. Một mục peer với danh sách được phép rộng không tự cài đặt tuyến.

Vì thế một cấu hình có thể trông đầy đủ mà lại hành xử bất đối xứng. Client gửi sang phía bên kia vì có tuyến, còn phản hồi không bao giờ tới vì danh sách được phép của phía bên kia không cho phép nguồn của client, hoặc vì phía bên kia không có đường về. Cả hai chiều là những quyết định riêng với kiểu hỏng riêng. Ghi ra bạn đang kiểm tra chiều nào là nửa phần chẩn đoán.

Tuyến đến từ đâu

Nếu bạn dùng wg-quick, các tuyến được tạo cho bạn từ danh sách được phép của từng peer, trừ khi bạn đặt Table = off và tự mình nắm quyền kiểm soát. Đó là hành vi được công cụ ghi trong tài liệu, và là lý do một cấu hình không có chỉ thị tuyến rõ ràng vẫn hoạt động.

sudo wg show wg0 allowed-ips
ip route show | grep wg0
sudo wg-quick strip wg0

So sánh danh sách được phép với các tuyến thực sự có. Một peer cho phép cả một mạng con nhưng chỉ tạo ra một tuyến máy chủ nghĩa là công cụ hỗ trợ chưa từng chạy, hoặc bạn đang quản lý giao diện trực tiếp bằng wg và ip, và khi đó không gì tạo tuyến cho bạn.

Khi bạn quản lý bằng tay, tuyến chỉ là một dòng và hình dạng của nó rõ ràng: đích đi qua giao diện, không có gateway vì liên kết là điểm-điểm. Thêm nó không phải là cách lách cho tiền tố tồi; đó là nửa còn thiếu của một thiết kế đã chọn tự đảm nhận định tuyến.

Tiền tố rộng hơn không thêm mục peer

Cách sửa hấp dẫn là đổi địa chỉ thành /24 để tuyến kết nối bao trùm LAN của máy chủ. Nó có vẻ hoạt động, và lý do nó có vẻ hoạt động là tuyến kết nối giờ khớp, chứ không phải WireGuard đã học được điều gì mới.

Điều bạn cũng đã làm là nhận toàn bộ dải là tới được trực tiếp qua liên kết đó, kể cả những địa chỉ thuộc về peer khác hoặc thuộc một LAN thực sự nằm sau máy chủ. Lưu lượng tới những địa chỉ đó giờ đi vào đường hầm, và liệu nó có ra ở phía bên kia hay không phụ thuộc vào định tuyến và danh sách được phép của chính máy chủ.

Phía mật mã không bị ảnh hưởng trong bất kỳ trường hợp nào. WireGuard vẫn cần một mục trong danh sách được phép bao trùm đích để chọn peer, và phía bên kia vẫn cần một mục bao trùm nguồn của bạn để chấp nhận nó. Một tiền tố giao diện rộng hơn không thể cung cấp cả hai.

Xác nhận cả hai chiều trước khi thay đổi bất cứ điều gì

Xử lý hai đầu riêng rẽ và ghi lại mỗi đầu nói gì. Ở client là tuyến và mục peer; ở máy chủ là hình ảnh gương cùng đường về của chính nó:

ip route get 192.168.70.20
sudo wg show wg0 allowed-ips
sudo wg show wg0 latest-handshakes
sudo tcpdump -ni wg0 -c 10

Bản bắt gói là thứ phân xử các tranh cãi về chiều. Nếu gói đi ra xuất hiện trên giao diện đường hầm mà máy chủ không ghi nhật ký gì, đầu xa đang từ chối chúng, thường vì nguồn của bạn nằm ngoài danh sách được phép của nó. Nếu hoàn toàn không có gì xuất hiện, tuyến bị thiếu hoặc trỏ đi nơi khác.

Sau đó sửa đầu hẹp hơn. Một mục trong danh sách được phép phía máy chủ cho địa chỉ client của bạn và một mục phía client cho mạng con đích là hình dạng bình thường, và nó để tiền tố giao diện yên. Chỉ mở rộng tiền tố nếu quy hoạch địa chỉ thật sự muốn một mạng con chia sẻ trên liên kết đó, và làm điều đó như một thay đổi quy hoạch chứ không phải bước gỡ lỗi.

Bài viết liên quan