Назад | Перейти на главную страницу

Как разрешить доступ к определенному порту с помощью 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

Все это работает хорошо, но я хочу добиться противоположного этого для некоторых портов, разрешив только определенные диапазоны IP-адресов страны IPSet. Например, заблокируйте все IP-адреса, кроме тех, которые находятся в моих наборах uk.zone и th.zone.

Какие правила 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).