Đặt lớp lưu lượng trên các gói trả về


8

Tôi có một cấu trúc liên kết mạng:

Server <-> router1 <-> router2 <-> router3 <-> edgeRouter <-> "internet"

Tất cả các bộ định tuyến đều dựa trên linux và hỗ trợ iptables.

Máy chủ đặt các lớp lưu lượng với iptables ( --set class X:Y) và bộ định tuyến thực hiện một số "định tuyến" dựa trên lớp được đặt. (Lớp phụ thuộc vào ứng dụng khởi tạo).

Các bộ định tuyến biên chuyển tiếp các gói thông qua ISP của chúng tôi tới internet và nhận các gói trả về (trả lời). Các phản hồi nhận được ofcference không có lớp giao thông được thiết lập.

Có thể sử dụng iptablesquy tắc trên bộ định tuyến biên (mangle, hoặc một cái gì đó tương tự), để theo dõi các gói trả về (kiểu NAT, các gói từ các kết nối "ESTABOUNDED") và đánh dấu các gói trả về có cùng loại lưu lượng truy cập gói? Kích hoạt NAT trên bộ định tuyến biên không phải là vấn đề.

TLDR: Cách sử dụng iptables để phân loại các gói nhập với cùng một lớp với đầu ra cho cùng một kết nối.

Câu trả lời:


0

Vì các gói đầu ra của bạn có lớp được đặt dựa trên ứng dụng (và tôi đoán rằng mỗi ứng dụng sử dụng một bộ cổng TCP / UDP nhất định), bạn có thể phân loại lại các gói đến dựa trên các cổng đó.

ví dụ. để phân loại lại phiên HTTP đã thiết lập (bên ngoài), trên edgeRouter:

iptables -t mangle -A INPUT -i [WANIF] -m state --state ESTABLISHED,RELATED -p tcp -m tcp --sport 80 -j DSCP --set-dscp-class cs3

Lưu ý: Có thể cần sử dụng bảng FORWARD thay vì INPUT ...

Nhưng - Để theo dõi các gói đi ra, hãy xác định lớp nào chúng có trên đường ra sau đó áp dụng cùng loại đó để nhập các gói của cùng một luồng - vẫn có thể, nhưng một núi công việc và có thể là mô-đun bộ lọc mạng tùy chỉnh có giao diện với conntrack.


Phân loại luồng xâm nhập với iptables sẽ không hoạt động vì tất cả quá trình xử lý qdisc xâm nhập được thực hiện trước khi xử lý bộ lọc mạng.
Niklas Holm

0

Bạn đặt --set class X:Ycái gì vậy? Lớp chính xác là gì? Tôi đã tìm kiếm trang man của iptables nhưng không tìm thấy tương tự như những gì bạn mô tả. Tôi nghĩ rằng bạn có thể muốn làm một cái gì đó như thế này:

  1. Đánh dấu trường TOS của gói IP trong "Máy chủ".
  2. Hãy để các bộ định tuyến xử lý các gói đặc biệt.
  3. Trong "edgeRouter" làm như sau:

      # If a packet arrives from LAN, is marked and we know nothing about the
      #+ connection, then mark the connection
    iptables -t mangle -A PREROUTING -i $LAN_IF -m tos --tos $TOS_VAL -m \
      connmark \! --mark $TOS_VAL -j CONNMARK --set-xmark $TOS_VAL
    
      # Reset the TOS value when going out to prevent strange interpretation
    iptables -t mangle -A POSTROUTING -o $WAN_IF -m tos --tos $TOS_VAL \
      -j TOS --set-tos 0x00
    
      # If a packet arrives from WAN and the connection is marked, then mark
      #+ the packet so that the routers in LAN know how to deal with it
    iptables -t mangle -A PREROUTING -i $WAN_IF -m connmark --mark $TOS_VAL \
      -j TOS --set-tos $TOS_VAL
    

0

TLDR: Cách sử dụng iptables để phân loại các gói nhập với cùng một lớp với đầu ra cho cùng một kết nối.

Câu hỏi của bạn không hoàn toàn rõ ràng về phương pháp phân loại mà bạn đang đề cập đến, nhưng nói chung nếu chúng ta đang nói về việc định hình lưu lượng truy cập bằng cách sử dụng tcvà xếp hàng kỷ luật, áp dụng như sau.

act_connmark

Vì quá trình xử lý qdisc xâm nhập được thực hiện trước netfilter, bạn không thể phân loại trực tiếp lưu lượng truy cập bằng iptables (mà không biên dịch lại kernel của bạn với IMQ, xem bên dưới). Tuy nhiên, bạn có thể gián tiếp phân loại nó bằng cách sử dụng theo dõi kết nối. Nếu có sẵn trên kernel của bạn, bạn có thể sử dụng mô-đun act_connmark, được thiết kế cho mục đích chính xác này, bổ sung một connmarkhành động cho tccác bộ lọc hỗ trợ nó.

# 0. Load modules and IFB device
modprobe act_connmark
modprobe ifb
ip link set ifb0 up

# 1. Classify packets by marking them
iptables -t mangle -A POSTROUTING -p tcp --sport 22 -j MARK --set-mark 1

# 2. Append rule to save the packet mark to the connection mark
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

# 3. Restore the connection mark to the packet mark with 'action connmark'
#    before redirecting to the ifb-device
tc qdisc add dev eth0 handle ffff: ingress
tc qdisc add dev ifb0 handle 1: root
tc filter add dev eth0 parent ffff: prio 1 \
   protocol ip u32 match u32 0 0 flowid ffff:1 \
   action connmark \
   action mirred egress redirect dev ifb0

# 4. Apply filters to classify packets based on their mark
# ... setup qdiscs and classes as usual on ifb0... then
tc filter add dev ifb0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

IMQ

IMQ (Thiết bị xếp hàng trung gian) phá vỡ luồng lưu lượng thông thường trong kernel bằng cách tôi hiểu nó, lặp lại nó thông qua một thiết bị ảo sau khi xử lý bộ lọc mạng. Nó không được hợp nhất với cây kernel, do đó không được bao gồm trong hầu hết các bản phân phối và yêu cầu bạn phải vá và tự biên dịch kernel. Nếu bạn làm như vậy, nó sẽ hoạt động như thế này:

# classify and save mark in POSTROUTING as before... then
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -j IMQ --todev 0

# ... setup qdiscs and classes as usual on imq0 ... then
tc filter add dev imq0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

Điều này cũng sẽ cho phép bạn thực hiện các phân loại nâng cao hơn khi xâm nhập bằng iptables, có thể rất cồng kềnh khi sử dụng các bộ lọc u32 đơn giản, chẳng hạn như phạm vi cổng tùy ý. Mặc dù vậy, tôi không thể nói đến hiệu suất hoặc sự tao nhã của giải pháp này, tôi đoán có một lý do khiến nó không bao giờ được hợp nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.