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 tc
và 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 connmark
hành động cho tc
cá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.