Một laptop nằm trên /24 của văn phòng qua Ethernet và cũng tham gia một máy chủ OpenVPN sống trong chính /24 đó. Một đồng nghiệp ping địa chỉ đường hầm; yêu cầu rõ ràng đến nơi, và không có gì quay lại. Nhật ký đường hầm sạch và việc duyệt web vẫn chạy, nên đường hầm là nghi phạm sai. Kiểm tra nguồn IPv4 trên máy nhận ném gói đi trước khi bất cứ thứ gì đọc nó.

Việc ném đi xảy ra trước khi bất cứ thứ gì đọc gói

Kiểm tra nguồn đặt một câu hỏi về mọi gói đi vào: nếu máy này trả lời nguồn đó, liệu câu trả lời có đi ra qua giao diện mà gói vừa mới đến? Khi câu trả lời là không, nhân sẽ ném gói ngay khi nó đến. Không socket nào và không đường chuyển tiếp nào từng thấy nó, vì thế một bản bắt trên đường hầm vẫn ghi lại một yêu cầu mà ứng dụng không bao giờ nhận được.

Máy khách ở đây giữ 10.66.0.9 trên đường hầm của nó, và máy chủ OpenVPN trả lời tại 192.168.80.10 bên trong tiền tố của văn phòng. Một đồng nghiệp ở 192.168.80.25 ping địa chỉ đường hầm, nên yêu cầu đi qua LAN, máy chủ định tuyến nó vào đường hầm, và nó đến giao diện đường hầm của máy khách mang theo địa chỉ nguồn của văn phòng. Trong bảng định tuyến của máy đó, tiền tố của văn phòng thuộc về thiết bị Ethernet, không thuộc đường hầm. Việc kiểm tra so sánh giao diện đến với tuyến, thấy không khớp và loại bỏ gói, nên đồng nghiệp thấy mất hoàn toàn trong khi cả hai đầu báo một đường hầm khỏe mạnh.

Chiều gương có cùng hình dạng: khi máy khách khởi tạo về phía văn phòng, các phản hồi có thể bị loại ở phía văn phòng vì đúng lý do đó. Một bản sửa chỉ được kiểm chứng ở một chiều thường quay lại thành một phiếu thứ hai.

Chứng minh chế độ đang có hiệu lực trước khi chạm vào bất kỳ sysctl nào

Hãy đọc các giá trị thực tế thay vì tin vào mặc định của bản phân phối, vì thiết lập theo từng giao diện chỉ là nửa quyết định. Chế độ đang có hiệu lực là giá trị cao hơn giữa giá trị giao diện và giá trị của all, nên số không trên giao diện đường hầm không có nghĩa gì chừng nào all còn là một. Quyết định của chế độ nghiêm là một quyết định định tuyến, nên hãy chạy phép tra cứu mà nhân chạy và so sánh câu trả lời với giao diện mà gói thực sự đến.

tcpdump -ni tun0 icmp and host 192.168.80.25
ip route get 192.168.80.25
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.tun0.rp_filter

Sau đó lặp lại ping trong khi theo dõi bộ đếm lỗi. Con số tăng bên cạnh một yêu cầu mà bản bắt đã hiển thị chính là dấu hiệu của việc ném này, không phải của một tuyến thiếu. Bật ghi nhật ký gói Sao Hỏa khi còn ở đó, để nhân nêu tên nguồn và giao diện mà nó đã từ chối. Cùng nhau chúng loại trừ mật mã, tường lửa và một iroute thiếu khỏi các giải thích.

Ghi lại đường cơ sở trước khi thay đổi bất cứ điều gì: cả hai giá trị, thiết bị mà phép tra cứu chọn và bộ đếm bạn theo dõi. Chính bản ghi đó sẽ cho bạn biết về sau liệu thay đổi có làm điều bạn nghĩ.

Mỗi chế độ rp_filter thực sự chấp nhận điều gì

Nhân hiển thị ba giá trị cho mỗi giao diện, và chúng không phải ba sắc thái của một quy tắc. Số không tắt việc kiểm tra. Một là nghiêm và đòi nguồn phải được định tuyến ngược ra qua giao diện đến. Hai là lỏng và chỉ đòi có một tuyến nào đó tới nguồn trong bảng, bất kể nó trỏ đi đâu.

ValueNameAcceptsStill rejects
0offany source at allnothing on this check
1stricta source routed back out the arrival interfacea source whose route points elsewhere
2loosea source with any route in the tablea source with no route at all

Hàng quan trọng ở đây là hàng lỏng, và điều nó vẫn từ chối. Một nguồn giả mạo có thể định tuyến ở bất cứ đâu trong bảng của bạn thì đi qua, trong khi một nguồn không có tuyến nào vẫn bị từ chối. Trên laptop đó là một nhượng bộ hẹp; trên router chuyển tiếp lưu lượng của người khác thì nó rộng. Chế độ thuộc về máy, nên cùng một con số mang trọng lượng khác nhau ở hai nơi.

Hàng nào cần cho cấu trúc này xuất phát từ bảng chứ không từ thói quen. Gói là hợp lệ và nguồn của nó định tuyến được, nên chế độ lỏng nhận nó còn chế độ nghiêm thì không. Không gì trong trường hợp này đòi số không, và chọn số không sẽ bỏ một kiểm tra vốn không tốn gì ở đây.

Chọn thay đổi nhỏ nhất loại bỏ sự mơ hồ

Chế độ lỏng là thay đổi nhỏ nhất phù hợp, và đó là sự giảm độ nghiêm thật sự, không phải một công tắc vô hại. Luôn có lựa chọn tốt hơn khi cấu trúc cho phép: bỏ phần chồng lấn, và sự mơ hồ biến mất.

Nơi tiền tố của văn phòng chỉ cần qua Ethernet, hãy bỏ nó khỏi các tuyến mà hồ sơ kéo về, và địa chỉ trở nên tới được bằng một đường. Khi hai đường thực sự phải cùng tồn tại, hãy ghim nguồn và thiết bị bằng một quy tắc chính sách thay vì nới lỏng việc kiểm tra trên mọi giao diện. Điều đó giữ lọc nghiêm cho mọi thứ khác trên máy và ghi lại ngoại lệ ở nơi kỹ sư tiếp theo sẽ tìm.

Dù chọn đường nào, hãy ghi nó vào một drop-in sysctl chứ không vào một lệnh đang chạy. Đặt các khóa all và default cùng nhau, để một lần kết nối lại không thể âm thầm khôi phục chế độ nghiêm.

# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system

Chế độ lỏng từ bỏ điều gì, và ở đâu

Chế độ lỏng vẫn từ chối một nguồn mà không tuyến nào tới được, và nó thôi từ chối một nguồn giả mạo tình cờ định tuyến được. Trên laptop đó là một nhượng bộ hẹp. Trên một thiết bị chuyển tiếp lưu lượng không thuộc về nó, cùng lựa chọn đó rộng hơn nhiều. Vì thế cùng một thiết lập mang hai ý nghĩa rất khác nhau tùy nơi nó chạy.

Tắt hoàn toàn việc kiểm tra trên một máy chuyển tiếp lưu lượng cho người khác là cách sửa duy nhất cần tránh. Số không ném bỏ việc kiểm chứng mà chế độ lỏng giữ gìn cẩn thận. Nếu máy chuyển tiếp cho người khác, hãy bảo vệ lựa chọn quy tắc chính sách ở phần trước thay vào đó.

Để lại một ghi chú nêu tên hai giao diện, tiền tố chồng lấn và phép thử chính xác giờ đây thành công. Điều đó hữu ích cho kỹ sư tiếp theo hơn một dòng nói rằng việc lọc đã được điều chỉnh.

Bài viết liên quan