这是在路由器上。我有$mac
一个客户端的 MAC,$set
它是一个 hash:net 类型的 ipset。我的意图是拒绝访问 中的所有网络,除了可以访问网络的人$set
之外。$mac
-A lan_forward -m mac ! --mac-source $mac -m set --match-set $set dst -j REJECT
但这不起作用。$set
无论 MAC 地址是什么,它都会阻止每个人。问题是什么?当我把它变成LOG
目标时,我看到了这个:
[ 4128.497456] Blocked website: IN=lanbridge OUT=tun0 MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=192.168.1.186 DST=XXX.XXX.XXX.XXX LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=21305 DF PROTO=TCP SPT=40030 DPT=443 WINDOW=64240 RES=0x00 SYN URGP=0
我可以通过 tcpdump 确认它拒绝与 TCP RST 的连接,尽管 MAC 已列入白名单。
编辑!我发现了问题:
我的问题是我有不止一条规则:
-A lan_forward -m mac ! --mac-source $mac1 -m set --match-set $set dst -j REJECT
-A lan_forward -m mac ! --mac-source $mac2 -m set --match-set $set dst -j REJECT
-A lan_forward -m mac ! --mac-source $mac3 -m set --match-set $set dst -j REJECT
因此,即使第一个匹配,第二个也会失败并拒绝。我几乎决定使用 MARK,但我认为这不是数据包标记的正确使用,因此我只是ACCEPT
从所有 MAC 发出所有传出,然后阻止所有到 ipset 中指定的网络的传出。我只需记住不要在ACCEPT
要应用于我正在过滤的任何 MAC 的规则之后添加任何内容。
答案1
一种方法是跳转到新链来做出接受/拒绝决定。但是,从您的描述中我不确定是否允许或阻止自定义 MAC 地址,因此这里的逻辑可能需要翻转:
-A lan_forward -m set --match-set $set dst -j a_new_chain
-A a_new_chain -m mac --mac-source $mac -j ACCEPT
-A a_new_chain -j REJECT
这假设涉及的所有内容都在集合中,但应该$mac
允许,而其他所有内容都应该被拒绝。
另一个问题可能是连接跟踪;如果必须阻止打开的连接,则在应用连接跟踪之前需要执行上述规则,或者使用某些外部工具来终止现有连接。否则,对于任何已打开的连接,可以保持连接打开的东西可以绕过添加到 ipset 表中。