![将传入数据包的带宽限制到特定的 IP 和端口](https://linux22.com/image/783738/%E5%B0%86%E4%BC%A0%E5%85%A5%E6%95%B0%E6%8D%AE%E5%8C%85%E7%9A%84%E5%B8%A6%E5%AE%BD%E9%99%90%E5%88%B6%E5%88%B0%E7%89%B9%E5%AE%9A%E7%9A%84%20IP%20%E5%92%8C%E7%AB%AF%E5%8F%A3.png)
我有一个在特定 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 查询