Tắt NAT nguồn trên router mạng con Tailscale, đường hầm vẫn hoạt động trong khi các kết nối đi qua nó dừng lại. Các yêu cầu đến đích với địa chỉ overlay của chính máy khách từ xa, đây chính là mục đích của thay đổi, và các phản hồi giờ cần một đường đi mà LAN chưa từng phải biết. Không có đường đi đó, các gói vẫn đến nơi, phản hồi rời qua cổng mặc định, và sự cố hiện ra như một vấn đề tường lửa mà không quy tắc nào giải thích. Đường hầm khỏe mạnh; phần quay về bị thiếu.

SNAT đã che giấu điều gì

Khi SNAT được bật, router ghi lại địa chỉ nguồn thành địa chỉ LAN của chính nó trước khi chuyển tiếp vào mạng con, nên đích trả lời một máy chủ mà nó đã biết cách đến và không cần cấu hình gì khác. Tắt nó giữ nguyên nguồn gốc, và đích khi đó thấy một địa chỉ trong dải overlay thay vì một người hàng xóm trên dây của chính nó. Địa chỉ đó là thật và có thể định tuyến khắp tailnet, nhưng không thể đến được từ LAN qua cổng mặc định. Công tắc được ghi trong tài liệu là --snat-subnet-routes=false, áp dụng cho chính router mạng con Linux.

Đây là cài đặt thường trực chứ không phải công tắc cho từng gói, nên tuyến quay về phải tồn tại cho mọi mạng đích mà router đó phục vụ. Đó là điều khiến thay đổi trở thành quyết định triển khai chứ không phải một ô chọn. Mọi thứ router đó phục vụ đều thừa hưởng yêu cầu ngay tại thời điểm đó.

Tuyến quay về có thể nằm ở đâu

Ba vị trí là phổ biến, và chúng khác nhau về phạm vi chứ không phải về tính đúng đắn. Tuyến tĩnh trên máy chủ đích là trực tiếp nhất và kém mở rộng nhất, vì mỗi thiết bị cần bản sao của riêng nó. Bảng tuyến trong VPC hoặc trong router của trang bao phủ cả một mạng cùng lúc, và một tùy chọn DHCP mang tuyến tĩnh không lớp đến được máy khách tự động nhưng âm thầm thất bại trên các thiết bị bỏ qua nó.

ip route add 100.64.0.0/10 via 192.168.1.10
ip route get 100.64.0.5

Dù chọn vị trí nào, bước nhảy tiếp theo là địa chỉ LAN của router và không bao giờ là địa chỉ tailnet của nó. Một máy chủ LAN không thể đến overlay cho đến khi có tuyến này, nên bước nhảy tiếp theo bên trong overlay là vòng tròn và không gửi gói đi đâu cả. Chính lỗi đó giải thích phần lớn cấu hình trông có vẻ đúng mà vẫn thất bại, và nó sống sót qua mọi kiểm tra chỉ đọc bảng của chính router. Ghi lại vị trí bạn đã dùng, nếu không người tiếp theo sẽ kiểm tra sai.

Đọc sự cố như lưu lượng một chiều

Triệu chứng dễ nhận ra hơn nguyên nhân: dịch vụ trả lời trên chính router và im lặng từ một máy khách từ xa. Bắt gói tại đích cho thấy yêu cầu đến và phản hồi đi, trông như thành công cho đến khi bạn nhận ra những phản hồi đó đang đi đâu. Chúng đi về cổng mặc định, nghĩa là phần đi vào đã hoạt động còn phần quay về thì không.

Thay vào đó hãy bắt gói trên router, vì nó thấy cả hai chiều của một lần trao đổi và cho biết liệu một phản hồi có bao giờ đến không. Nếu phản hồi xuất hiện tại đích nhưng không bao giờ trên router, tuyến bị thiếu hoặc sai ở phía đích. Nếu nó xuất hiện trên router và dừng ở đó, vấn đề nằm xa hơn và thuộc một cuộc điều tra khác.

sudo tcpdump -ni any host 100.64.0.5
ip route get 100.64.0.5

Địa chỉ thật có đáng một tuyến không

Giữ SNAT vẫn là câu trả lời đơn giản hơn mỗi khi không thể cấu hình lại mạng đích, và cái giá là mọi máy khách trông giống router trong nhật ký và chính sách của đích. Tắt nó là chính đáng khi một ứng dụng cần địa chỉ nguồn thật hoặc khi chính sách mạng phải phân biệt các máy khách dùng chung một router. Cả hai đều là lý do hợp lệ và không cái nào miễn phí. Lợi ích phải xứng đáng với việc duy trì một tuyến trên mọi mạng đích, cộng với việc rà soát tường lửa mô tả bên dưới.

Với một LAN nhỏ, sự đánh đổi thường có lợi, còn với vô số thiết bị không thể nhận tuyến tĩnh thì thường không. Ghi lại quyết định và lý do bên cạnh cấu hình router, để quản trị viên tiếp theo biết hành vi nào là cố ý. Một giá trị mặc định không ai ghi lại thì không thể phân biệt với sự sơ suất.

Tường lửa, ghi nhật ký và vai trò kép

Mọi quy tắc khớp với địa chỉ LAN của router giờ khớp với một nguồn khác, bao gồm quy tắc cho phép và mọi trường nhật ký đã ghi router là máy khách. Hãy đọc các quy tắc đó trước lần kiểm tra đầu tiên chứ không phải sau thất bại đầu tiên, vì một quy tắc chỉ cho phép địa chỉ của router sẽ chặn hoàn toàn nguồn mới. Thu hẹp việc thay thế cho các máy khách và cổng cần đến nó, sau đó xác nhận rằng nó không âm thầm chấp nhận toàn bộ tailnet.

sudo nft list ruleset | grep -n '100\.64'
sudo iptables-save | grep -n '100\.64'

Một nút vừa làm nút thoát vừa làm router mạng con là một tổ hợp được ghi trong tài liệu có thể làm rơi lưu lượng thượng nguồn khi SNAT của mạng con bị tắt. Tách các vai trò đó sang các nút khác nhau loại bỏ lưu ý đó và cho mỗi tuyến và chính sách tường lửa một chủ sở hữu duy nhất. Nếu các vai trò phải ở cùng nhau, hãy lường trước hành vi đó và kiểm tra nó trước khi đổ lỗi cho máy khách. Giữ tuyến, cài đặt công tắc và việc phân công vai trò trong một ghi chú, vì chúng được đọc cùng nhau khi kết nối tiếp theo thất bại.

Bài viết liên quan