将传入数据包的带宽限制到特定的 IP 和端口

将传入数据包的带宽限制到特定的 IP 和端口

我有一个在特定 IP 和端口上运行的 Linux 服务器应用程序。需要根据源和端口对传入的数据包进行处理并将其放入 nfqueue 中,例如:

iptables -t raw -A PREROUTING -p udp --src 192.168.1.100 --sport 8000 -j NFQUEUE --queue-num 1
iptables -t raw -A PREROUTING -p tcp --src 192.168.1.100 --sport 8001 -j NFQUEUE --queue-num 1

问题是 nfqueue 很快就满了,开始丢弃数据包。数据包处理速度不如入站速度快。我需要将带宽限制在一定速率,以免溢出 nfqueue 缓冲区。只有符合 iptables 规则的流量才需要限制,其余流量则保持无限制。

最好的方法是什么?我读到可以使用 tc。我对此不熟悉。我需要将所有传入数据包的带宽限制到此特定 (IP, PORT) 对。最好的方法是什么?我读到可以使用 tc。我对此不熟悉。

答案1

您确实可以使用 tc 来调整此 ip-port 元组的传入带宽。要调整传入数据包,您需要一个 ifb 虚拟接口,以便可以在其上应用出口过滤器。然后在虚拟接口上创建根 qdisc,并附加一个调整类。然后,您可以构建一个过滤器来引导该类上的流量。它应该是这样的:

# Define variables
IP=192.168.1.100/32
PORT=8000
INTERFACE=eth0
VIRTUAL_INTERFACE=ifb0
# Speed unit is Mbits/s
TUPLE_SPEED=100

# Add the virtual interface
modprobe ifb numifbs=1;
ip link set dev "$VIRTUAL_INTERFACE" up;

# Redirect ingress packets to egress virtual interface
tc qdisc add dev "$INTERFACE" handle ffff: ingress
tc filter add dev "$INTERFACE" parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev "$VIRTUAL_INTERFACE";

# Create root qdisc and class for the virtual interface
tc qdisc add dev "$VIRTUAL_INTERFACE" root handle 1: htb;
tc class add dev "$VIRTUAL_INTERFACE" parent 1: classid 1:10 htb rate "${TUPLE_SPEED}mbit";

# Add a filter that match yor tuple 
tc filter add dev "$VIRTUAL_INTERFACE" protocol ip parent 1: prio 1 u32 match ip dst "${IP}" match udp dst"${PORT}" flowid 1:10;

请注意,您可以添加多tc filter行来匹配多个源元组。

如果你想开始挖掘,你应该阅读https://blog.csdn.net/mrwangwang/article/details/39080895首先,通过 site:lartc.org 开始所有 google 查询

相关内容