Điểm:2

iptables/nftables: làm cách nào để loại trừ tất cả lưu lượng được chuyển tiếp khỏi theo dõi kết nối trên bộ định tuyến?

lá cờ ua

Một hộp Linux có nhiều giao diện mạng. Chuyển tiếp IP được bật cho IPv4 và IPv6.

Tôi muốn bảo vệ các dịch vụ đang chạy trên chính bộ định tuyến thông qua tường lửa có trạng thái. Đối với điều đó, theo dõi kết nối cần phải được kích hoạt. Đồng thời, tôi muốn loại trừ tất cả lưu lượng được chuyển tiếp từ giao diện này sang giao diện khác khỏi theo dõi kết nối.

Đối với tường lửa trạng thái, tôi thường sử dụng chuỗi INPUT và OUTPUT của bảng bộ lọc. Lưu lượng được chuyển tiếp sẽ đi đến chuỗi FORWARD. Nhưng AFAIK không có cách nào để đánh dấu lưu lượng truy cập là không được theo dõi trong chuỗi FORWARD. Logic như vậy phải đi đến chuỗi PREROUTING trong bảng thô. Nhưng, tôi tin rằng, trong chuỗi PREROUTING, vẫn chưa quyết định liệu lưu lượng có được chuyển tiếp hay không.

Theo dõi kết nối có nhiều nhược điểm, chẳng hạn như gói bị rớt khi danh sách kết nối được theo dõi đã đạt đến kích thước tối đa.

Cách dễ nhất để loại trừ lưu lượng được chuyển tiếp (và chỉ lưu lượng được chuyển tiếp đó) khỏi theo dõi kết nối là gì?

A.B avatar
lá cờ cl
A.B
Bạn có thể cung cấp bố cục mạng của mình (`ip -br link; ip -br address; ip -4 route; ip -6 route`) và chỉ định xem có bất kỳ NAT nào được mong đợi không?
lá cờ ua
Chỉ cần xem xét một bộ định tuyến có hai giao diện, eth0 và eth1 với các địa chỉ 192.168.1.1/24 và 192.168.2.1/24.
Điểm:1
lá cờ cl
A.B

Đối với một bộ quy tắc chung, người ta có thể hỏi nftables để thực hiện tra cứu tuyến đường trước bằng cách sử dụng biểu thức thay vì đợi ngăn xếp định tuyến thực hiện. Điều này cho phép liên quan đến (tương lai) đầu ra giao diện mặc dù chưa tồn tại (quyết định định tuyến không xảy ra), với chi phí tra cứu thêm. Sau đó, nếu kết quả cho biết gói sẽ được định tuyến, hãy ngăn việc theo dõi xảy ra bằng cách sử dụng không có dấu vết bản tường trình.

BIỂU HIỆN FIB

xơ {saddr | chadr | đánh dấu | nếu | oif} [. ...] {oif | oifname | loại}

Một truy vấn biểu thức (chuyển tiếp cơ sở thông tin) đến có được thông tin như chỉ số giao diện đầu ra cụ thể địa chỉ sẽ sử dụng. Đầu vào là một bộ các phần tử được sử dụng như đầu vào cho các chức năng tra cứu.

TUYÊN BỐ KHÔNG THEO DÕI

Câu lệnh notrack cho phép vô hiệu hóa theo dõi kết nối cho gói tin nhất định.

không có dấu vết

Lưu ý rằng để tuyên bố này có hiệu quả, nó phải được áp dụng cho các gói tin trước một theo dõi tra cứu xảy ra. Vì vậy, nó cần phải ngồi trong một chuỗi với một trong hai định tuyến trước hoặc đầu ra móc và ưu tiên móc từ -300 trở xuống.

Vì vậy, người ta nên thực hiện kiểm tra tuyến đường "đơn giản" từ định tuyến trước, chỉ sử dụng địa chỉ đích làm công cụ chọn và kiểm tra sự tồn tại của giao diện đầu ra (gói không thể định tuyến hoặc gói dành cho máy chủ lưu trữ sẽ không giải quyết được bất kỳ vấn đề nào). Có một ngoại lệ cho lo (loopback) để giữ cho nó được theo dõi: trong khi nó đại diện cho lưu lượng truy cập cục bộ, một gói được gửi (thông qua đầu ra path) từ máy chủ đến chính nó quay trở lại định tuyến trước đường dẫn và không có giao diện đầu ra của lo quá. Vì gói gửi đi đã tạo một theo dõi mục nhập, tốt hơn nên giữ điều này nhất quán.

nft thêm bảng ip không trạng thái
nft add chain ip định tuyến trước không trạng thái '{ ưu tiên định tuyến trước hook bộ lọc loại -310; chính sách chấp nhận; }'
nft thêm quy tắc ip định tuyến trước không trạng thái iif != lo fib Daddr oif tồn tại notrack

Thay thế ip gia đình với inet họ kết hợp nên mở rộng hành vi chung tương tự sang IPv4+IPv6.

Để cụ thể hơn, người ta có thể chỉ định giao diện đầu ra trong tương lai với fib daddr oif eth1 ví dụ, ít nhiều tương đương với oif eth1, nhưng cũng có sẵn trong định tuyến trước.

Tất nhiên, nếu cấu trúc liên kết được biết trước thì có thể tránh tra cứu FIB bằng cách sử dụng một hoặc một số quy tắc dựa trên các kiểm tra địa chỉ vì các tuyến sau đó được quản trị viên biết trước. Có thể cần đo điểm chuẩn các kết quả để biết liệu điều này có thú vị hơn việc giữ một phương pháp chung hay không.

Ví dụ: với thông tin được cung cấp của OP, thay thế quy tắc trước đó bằng:

nft thêm quy tắc ip định tuyến trước không trạng thái 'ip Daddr != { 192.168.1.1, 192.168.2.1, 127.0.0.0/8 } notrack'

nên có tác dụng gần như tương đương. 127.0.0.0/8 có mặt vì những lý do tương tự như trên với lo giao diện.

Xử lý phát sóng (như 192.168.1.255 nhận được trên eth0) và phát đa hướng (như link-local 224.0.0.1 nhận được trên một giao diện) có thể không hoạt động giống nhau trong cả hai phương pháp cũng như không như mong đợi và có thể yêu cầu các quy tắc bổ sung cho các nhu cầu cụ thể, đặc biệt là với phương pháp thứ 2. Vì việc theo dõi quảng bá và phát đa hướng hiếm khi hữu ích, vì nguồn trả lời sẽ không (và không thể) là đích của địa chỉ quảng bá hoặc phát đa hướng ban đầu nên mục nhập theo dõi sẽ không bao giờ "thấy" lưu lượng truy cập hai chiều, điều này thường không quan trọng lắm đối với quy tắc nhà nước.


ghi chú

  • Điều này thường sẽ không tương thích với NAT trạng thái.

    Tôi hiểu rằng DNAT đối với máy chủ từ xa sẽ khiến lưu lượng trả lời của nó không bị hủy NAT và không thành công, đồng thời SNAT được chuyển tiếp đó sẽ không kích hoạt vì không có theo dõi mục đã tạo. SNAT hiếm khi được sử dụng trong đường dẫn đầu vào sẽ ổn và kết hợp DNAT+SNAT (sử dụng nguồn địa chỉ cục bộ) cũng có thể hoạt động kể từ đó theo cả hướng ban đầu và hướng trả lời có liên quan đến đích cục bộ, vì vậy theo dõi mục sau đó phải luôn được tạo hoặc tra cứu chính xác.

  • bộ quy tắc tiêu chuẩn

    Quy tắc thực tế sử dụng iptables hoặc nftables (trong bảng khác của chính nó) sau đó có thể được thực hiện như bình thường, bao gồm các quy tắc trạng thái cho chính máy chủ lưu trữ. Vì lưu lượng truy cập được định tuyến sẽ không tạo theo dõi các mục, quy tắc nếu có liên quan đến lưu lượng truy cập như vậy chỉ nên ở trạng thái không trạng thái và không sử dụng bất kỳ ct biểu thức bởi vì nó sẽ không bao giờ phù hợp.

  • xác minh hành vi

    Người ta có thể kiểm tra hành vi tổng thể ngay cả khi không có quy tắc tường lửa thích hợp bằng cách:

    • sử dụng một hình nộm ct quy tắc để đảm bảo theo dõi cơ sở được đăng ký trong không gian tên mạng hiện tại.

      nft thêm bảng ip mytable
      nft add chain ip mytable mychain '{ type filter hook ưu tiên định tuyến trước -150; chính sách chấp nhận; }'
      nft thêm quy tắc ip mytable mychain ct trạng thái mới
      
    • sử dụng theo dõi công cụ để theo dõi các sự kiện:

      conntrack -E
      
    • tạo lưu lượng truy cập từ xa

      MỚI theo dõi các mục sau đó sẽ được tạo cho lưu lượng được bộ định tuyến nhận, nhưng không phải cho lưu lượng được định tuyến.

lá cờ ua
Biểu thức fib đó chính xác là những gì tôi đang tìm kiếm. Việc kiểm tra xem Daddr có phải là địa chỉ cục bộ hay không. Nhưng do một số địa chỉ (ví dụ: một số IPv6) có thể thay đổi theo thời gian, điều này có vẻ không thực tế đối với tôi.
lá cờ ua
Điều gì xảy ra nếu có một tuyến đường không thể truy cập? Lưu lượng truy cập đó cũng `fib Daddr oif tồn tại` cũng phù hợp?
A.B avatar
lá cờ cl
A.B
Nếu không có tuyến đường thì không có giao diện đầu ra: không có dấu vết. Nhưng trên thực tế, trong khi các quy tắc trước quyết định định tuyến sẽ có `ct state new` phù hợp với các gói như vậy, conntrack sẽ không cam kết vì nó bị bỏ giữa chừng (trong quyết định định tuyến thực tế): `conntrack -E` hoàn toàn không hiển thị. Vậy là vẫn đạt được mục tiêu. (Bên cạnh đó, trong quá trình kiểm tra, tôi không thể xoay sở để `oif daddr type xxx` khớp như mong đợi khi không có tuyến đường.)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.