Linux

如何只允許某些 IPSet 集使用 iptables 訪問某個埠?

  • October 25, 2013

我正在使用 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 規則來實現這一點?

顛倒假設:允許通過那些你想要的,然後拒絕其餘的:

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)。請注意,順序很重要:例外 ( ACCEPTs) 需要在規則 ( DROP) 之前。

引用自:https://serverfault.com/questions/548666