Không có gì trong socket nhớ giao diện nào đã mang yêu cầu, nên tuyến mặc định của VPN đường hầm đầy đủ có thể bắt lấy một phản hồi thuộc về WAN. Dịch vụ không bỏ qua giao diện đến; Linux định tuyến phản hồi được tạo cục bộ theo đích và chính sách nguồn. Một quy tắc dựa trên nguồn có thể thay vào đó chỉ gửi các phản hồi của dịch vụ qua bảng WAN đầy đủ, để lối ra thông thường ở lại trên đường hầm. Cổng vẫn mở trong khi phản hồi đi ra theo đường sai, và đó là lý do triệu chứng có vẻ một chiều.

Hiểu sai: phản hồi đi theo giao diện mà chúng đến

Có vẻ hợp lý rằng gói tin đến trên eth0 phải đi ra trên eth0. Bộ lọc gói không trạng thái có thể viết như vậy, và tcpdump ở phía vào hiển thị yêu cầu đúng nơi mong đợi. Định tuyến không hoạt động như vậy với lưu lượng do chính máy chủ tạo ra.

Khi dịch vụ chấp nhận kết nối, phản hồi của nó là một gói mới được tạo cục bộ. Nhân hệ thống xem các quy tắc định tuyến cho đích và nguồn của phản hồi, và tuyến mặc định của VPN là một câu trả lời hoàn toàn hợp lệ. Không có gì trong socket nhớ giao diện nào đã mang yêu cầu.

Vì thế triệu chứng có vẻ một chiều: yêu cầu đến, phản hồi biến mất. Vì thế việc thêm quy tắc tường lửa cho cổng vào cũng không thay đổi gì. Gói tin không bị chặn trên đường vào; nó bị định tuyến đi nơi khác trên đường ra. Theo dõi phản hồi bằng tra cứu định tính theo nguồn và đường vòng sẽ hiện ra.

Những gì nhân hệ thống thực sự định tuyến: địa chỉ nguồn

Tay nắm bạn cần là địa chỉ cục bộ mà dịch vụ dùng cho các phản hồi. Trên một máy chủ có địa chỉ eth0 minh họa 192.0.2.10/24 và cổng ra 192.0.2.1, địa chỉ đó hiện diện trên giao diện. Trên VM đám mây, địa chỉ công cộng có thể được dịch ở phía trên và vắng mặt trong máy khách, nên hãy dùng địa chỉ mà máy chủ thực sự có.

Kiểm tra trạng thái hiện tại trước khi đặt trước một số bảng hoặc mức ưu tiên quy tắc. Các quy tắc chính sách sẵn có có thể che khuất quy tắc mới, và một bảng cũ cùng số có thể đã mang các tuyến không liên quan:

ip -4 addr show dev eth0
ip -4 rule show
ip -4 route show table all

Sau đó chọn bảng theo nguồn. Quy tắc khớp với các phản hồi đã mang 192.0.2.10, đúng là lưu lượng kết thúc cục bộ mà bạn muốn miễn trừ. Lưu lượng được chuyển tiếp và gói từ các địa chỉ cục bộ khác không khớp.

Xây một bảng trả về đầy đủ, không phải nửa tuyến mặc định

Một bảng chỉ có tuyến mặc định là không đủ. Nhân hệ thống vẫn phải phân giải cổng ra, và việc phân giải đó cần tiền tố kết nối trong cùng bảng. Một bảng thiếu tiền tố đó sẽ thất bại khi phân giải cổng ra ngay cả khi tuyến mặc định của nó trông đúng. Thêm cả hai, rồi hướng quy tắc nguồn tới bảng:

ip -4 route add table 100 192.0.2.0/24 dev eth0 src 192.0.2.10
ip -4 route add table 100 default via 192.0.2.1 dev eth0
ip -4 rule add priority 1000 from 192.0.2.10/32 lookup 100

Dùng tiền tố và cổng ra thật thay vì sao chép ví dụ. Một giao diện đám mây được cấu hình là /32 với cổng ra on-link cần một tuyến kết nối khác, và bảng xây từ tiền tố sai sẽ thất bại ngay bước nhảy đầu tiên. Thuộc tính src nêu nguồn ưu tiên cho tuyến đó; nó không thay thế quy tắc nguồn.

Thứ tự cũng quan trọng. Một quy tắc rộng với số ưu tiên thấp hơn được đánh giá trước, nên quy tắc nguồn phải được đạt tới trước bất kỳ quy tắc nào sẽ đưa lưu lượng này trở lại bảng chính. Kiểm tra các mức ưu tiên bằng ip rule show sau khi thêm, không chỉ lúc khởi động.

Xác minh bằng tra cứu định tính theo nguồn

Yêu cầu nhân hệ thống định tuyến một đích thử nghiệm từ địa chỉ dịch vụ. Câu trả lời phải nêu eth0 và cổng ra WAN, không phải đường hầm:

ip -4 route get 198.51.100.25 from 192.0.2.10

Sau đó lập một kết nối được ủy quyền mới và quan sát cả hai chiều. Một tra cứu chọn đúng bảng trong khi kết nối thực vẫn thất bại là dấu hiệu của lọc đường ngược hoặc một quy tắc tường lửa, không phải bảng. Kiểm tra các biện pháp đó trước khi vô hiệu hóa bất cứ điều gì trên toàn cục.

Đặt các tuyến cuối cùng và quy tắc dưới trình quản lý mạng sở hữu giao diện. Thay đổi địa chỉ, gia hạn DHCP và kết nối lại VPN đều ghi lại trạng thái nhân hệ thống, và một quy tắc thêm bằng tay sẽ biến mất hoặc trỏ tới cổng ra cũ sau sự kiện tiếp theo.

Nơi ngoại lệ này dừng lại

Quy tắc miễn trừ lưu lượng kết thúc cục bộ từ một địa chỉ nguồn. Nó không bao gồm các cổng do Docker công bố, DNAT hoặc dịch vụ được chuyển tiếp qua máy chủ, vì những gói đó được định tuyến như lưu lượng chuyển tiếp và không bao giờ mang nguồn cục bộ của máy chủ theo cùng cách. Những thiết kế như vậy thường cần một dấu đặt ở đầu vào và một quy tắc khớp với dấu đó.

Nó cũng không làm địa chỉ công cộng của máy chủ xuất hiện trên giao diện. Khi một NAT phía trên sở hữu địa chỉ đó, phản hồi vẫn phải đi ra theo đường mà NAT đó mong đợi, đó là lý do bảng WAN phải phản ánh cổng ra và tiền tố gốc thay vì một dải công cộng đoán mò.

Giữ ngoại lệ được ghi lại với số bảng, mức ưu tiên quy tắc và địa chỉ nguồn chính xác. Thay đổi tiếp theo ở VPN hoặc giao diện có thể âm thầm phá vỡ nó, và một ghi chú nêu ba giá trị sẽ được kiểm tra nhanh hơn việc tìm lại triệu chứng từ báo cáo khách hàng.

Nếu dịch vụ vẫn trả lời sai đường sau khi tra cứu định tính theo nguồn thành công, hãy so sánh địa chỉ nguồn của socket đang sống với địa chỉ trong quy tắc. Một dịch vụ gắn với địa chỉ đại diện có thể chọn nguồn khác với địa chỉ bạn đã thử, và sự không khớp đó là khoảng trống còn lại.

Bài viết liên quan