假设我在 iptables 中有 3 条规则:
- 检查 IP 是否在 ipset 中列入白名单,然后接受它。
- 检查用户是否尝试连接端口 22,然后丢弃它。
- 检查用户是否尝试连接端口 80,然后接受它。
这是例子(不是真实的)规则:
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
但是如果用户被列入白名单(第一条规则),我想这样做,那么就不接受它,而是跳过/重定向到第三条规则(跳过第二条规则),就像这张图片一样(我知道如果数据包被接受,那么就完成了,这只是一个例子,我不知道如何实现这一跳转):
所以我想问你,我该如何在链中设置这个“跳过”。
子问题:如果可能的话,那么是否可以将其重定向到另一个链以适应特定的规则?
更新:真实场景
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
iptables -A INPUT -m geoip --src-cc DE -j DROP
... other rules ...
如您所见,我只将德国列入白名单,如果德国的 IP 通过第二条规则,那么我将检查其他规则,但我也使用白名单 IP。
因此,如果某个 IP 被列入白名单(大多数不是德国 IP),那么我不想检查它是否是德国 IP(因为它会失败),而是让该 IP 跳入其他规则(第 3 行)并跳过国家检查。
那么转到函数怎么样?
答案1
自定义链可用于更轻松地组织事物。自定义链中还有另一个更有用“终端”目标:在RETURN
调用规则后立即返回并执行规则。RETURN
在基础链中,它只应用默认策略,因此用处不大。
所问的例子变成:
iptables -N whitelist-check
iptables -A whitelist-check -m set --match-set whitelist src -j RETURN
iptables -A whitelist-check -p tcp --dport 22 -j DROP
iptables -A INPUT -j whitelist-check
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
有时反转逻辑和分组也可以起作用。对于这个简单的情况,等效方法可以是:
iptables -A INPUT -p tcp -m set ! --match-set whitelist src --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
对于更新后的场景:删除所有未列入白名单或来自 DE 的内容(也不...)。如需更多例外,只需-j RETURN
在-j DROP
更新 2:由于 OP 也改变了逻辑,DE
所以...如果按照 OP 的改变,德国的流量会下降,但非德国的流量会继续。
iptables -N filterchain
iptables -A filterchain -m set --match-set whitelist src -j RETURN
iptables -A filterchain -m geoip ! --src-cc DE -j RETURN
...
iptables -A filterchain -j DROP
iptables -A INPUT -j filterchain
... other rules ...
答案2
据我所知,您不能跳过链中的规则。但是,如果规则匹配,您绝对可以“跳”到另一个链。例如,iptables -A INPUT -p tcp -j tcp_packet_chain
将匹配所有 TCP 数据包并将它们跳转到“tcp_packet_chain”。但需要注意的是,如果数据包在链中未被接受或拒绝,您将返回到原始链中的下一个规则。