![使用 iptables、ipset 和 tc (--match-set 和 --set-mark) 进行流量整形](https://linux22.com/image/702973/%E4%BD%BF%E7%94%A8%20iptables%E3%80%81ipset%20%E5%92%8C%20tc%20(--match-set%20%E5%92%8C%20--set-mark)%20%E8%BF%9B%E8%A1%8C%E6%B5%81%E9%87%8F%E6%95%B4%E5%BD%A2.png)
我遇到了一些麻烦,我认为这是一个相当简单的流量整形问题。
我有一台用作路由器/nat 的 Ubuntu (16.04) 服务器。我想允许大多数用户使用 2mbps 互联网,同时将某些设备限制为 512kbps。
我有一个受限制设备的列表ipset
。我正在尝试处理--mark-set
来自这些设备的数据包,以便tc
可以针对它们进行流量整形。
我当前的设置是:
tc qdisc del root dev $LAN
tc qdisc add dev $LAN root handle 1: htb default 20
tc class add dev $LAN parent 1: classid 1:1 htb rate 6mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:10 htb rate 5mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:20 htb rate 2mbit ceil 2mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:30 htb rate 512kbit ceil 512kbit burst 15k
tc qdisc add dev $LAN parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $LAN parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $LAN parent 1:30 handle 30: sfq perturb 10
tc filter add dev $LAN protocol ip parent 1: prio 1 handle 6 fw flowid 1:30
$IPS create throttled hash:mac -exist
$IPS add throttled 00:11:22:33:44:55 -exist
$IPT -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6
这不会将我的网速降到 512kbps(假设我的 mac 地址是提供的),它会恢复到默认的 2mbps
如果我删除该--match-set
部分,它会正确地将所有设备的速度降低到 512kbps(这让我认为该tc
部分是正确的)
但是,如果我DROP
匹配该集合的数据包,它会正确地丢弃这些数据包(这让我认为该iptables
部分是正确的)
我这里是否遗漏了什么,或者这两个命令不能像这样一起使用?
非常感谢您的帮助。
谢谢,
答案1
希望一年之后您已经解决了您的问题,但是为了后续人员的利益,下面至少对其中一个问题进行了解释。
根据ipset
您提供的示例,您的iptables
规则无效。集合类型hash:mac
仅存储单个字段。但是,您的 iptables 语句正在测试集合,就好像它包含数据对(即两个字段,例如 mac,IP 或 mac,net)。因此,您使用数据包的源 MAC 地址和数据包中未定义的目标字段来匹配集合中的条目:
ipset create throttled hash:mac -exist
ipset add throttled 00:11:22:33:44:55 -exist
iptables -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6
但是由于使用的集合类型,您只能匹配单个字段。以下 iptables 语句显示了匹配集合中包含的源 MAC 地址的正确方法:
ipset create throttled hash:mac -exist
ipset add throttled 00:11:22:33:44:55 -exist
iptables -A PREROUTING -t mangle -m set --match-set throttled src -j MARK --set-mark 6
hash:net,port,net
举例来说,假设防火墙上有一组类型为的集合。该集合将存储三元组(两个网络和一个端口)。
假设防火墙具有以下 ipset 条目和 iptables 规则:
# creates set
ipset create throttled hash:net,port,net
ipset add services 192.168.0.0/16,tcp:80,192.168.1.80/32
ipset add services 192.168.0.0/16,tcp:443,192.168.1.80/32
# clear all rules (to illustrate that conntrack is not being used)
iptables -F FORWARD
# allows traffic to web server
iptables -A FORWARD -m set --match-set services src,dst,dst -j ACCEPT
# allows traffic from web server
iptables -A FORWARD -m set --match-set services dst,src,src -j ACCEPT
# drop all other traffic
iptables -P DROP
上述规则在功能上等同于:
# clear all rules (to illustrate that conntrack is not being used)
iptables -F FORWARD
# allows traffic to web server
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 80 -d 192.168.1.80/32 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 443 -d 192.168.1.80/32 -j ACCEPT
# allows traffic from web server
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 80 -s 192.168.1.80/32 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 443 -s 192.168.1.80/32 -j ACCEPT
# drop all other traffic
iptables -P DROP
虽然上述两种方法在功能上是等效的,但是由于利用了哈希表查找而不是 iptables 规则的线性评估,ipset 方法在处理大量条目时会表现得更好。
使用集合时,集合类型决定使用多少个匹配字段。iptables 语句指定是否使用数据包的源字段或目标字段来匹配集合中的每个字段。
下面举几个映射来说明:
ipset type | iptables match-set | Packet fields
------------------+--------------------+---------------------------------
hash:net,port,net | src,dst,dst | src IP address, dst port, dst IP address
hash:net,port,net | dst,src,src | dst IP address, src port, src IP address
hash:ip,port,ip | src,dst,dst | src IP address, dst port, dst IP address
hash:ip,port,ip | dst,src,src | dst IP address, src port, src ip address
hash:mac | src | src mac address
hash:mac | dst | dst mac address
hash:ip,mac | src,src | src IP address, src mac address
hash:ip,mac | dst,dst | dst IP address, dst mac address
hash:ip,mac | dst,src | dst IP address, src mac address
您可能在 TC/iptables 交互中遇到其他问题,但这至少可以解决您的 ipset/iptables 问题。
答案2
一个想法......你的设置包含 MAC 地址,但我怀疑 PREROUTING 规则试图匹配 src 或 dst IP 地址而不是 MAC 地址。