如何使用 iptables 仅允许某些 IPSet 集访问某个端口?

如何使用 iptables 仅允许某些 IPSet 集访问某个端口?

我正在使用 IPSet 为不同国家/地区构建 IP 范围,如下所示:

# Canada
ipset -F ca.zone
ipset -N ca.zone nethash
for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/countries/ca.zone)
        do ipset -A ca.zone $IP 
        echo $IP
done

然后我使用以下 iptables 规则阻止这些国家/地区访问我的服务器上的某些端口:

iptables -A INPUT -m set --match-set fr.zone src -p tcp --dport 15765 -j DROP
iptables -A INPUT -m set --match-set cn.zone src -p tcp --dport 15765 -j DROP
iptables -A INPUT -m set --match-set ca.zone src -p tcp --dport 16247 -j DROP
iptables -A INPUT -m set --match-set de.zone src -p tcp --dport 16247 -j DROP

这一切都很顺利,但我想通过仅允许某些 IPSet 国家/地区 IP 范围来实现某些端口的相反效果。例如,阻止除 uk.zone 和 th.zone 集内的 IP 之外的所有 IP。

我需要哪些 iptables 规则来实现这一点?

答案1

反转假设:允许你想要的通过,然后拒绝其余的:

iptables -A INPUT -m set --match-set uk.zone src -p tcp --dport 15765 -j ACCEPT
iptables -A INPUT -m set --match-set th.zone src -p tcp --dport 15765 -j ACCEPT
iptables -A INPUT                                -p tcp --dport 15765 -j DROP

(对于端口 16247 也类似,或者尝试巧妙地使用-m multiport)。请注意,顺序很重要:例外(ACCEPT)需要位于规则(DROP)之前。

相关内容