Как заблокировать IPv4 и IPv6 с помощью ipset в Ubuntu 16.04?
Итак, у меня есть следующий скрипт, который блокирует IP-адреса:
#!/bin/bash
# here's your list of IPS
CURRENT_BL=/path/to/my/ip_black_list.txt
# create/flush recreate the tables
iptables -F BLACKHOLE
iptables -N BLACKHOLE
for BAD_IP in $(cat $CURRENT_BL)
do
ipset add ipset-blacklist $BAD_IP 2>/dev/null || \
echo "Failed to add ${BAD_IP}"
done
# REJECT the matching target
iptables -A BLACKHOLE -p all -m set --match-set ipset-blacklist src -j REJECT
iptables -A BLACKHOLE -j RETURN
# assume your nginx is on 80 and 443
iptables -A INPUT -p tcp -m multiport --destination-ports 80,443 -j BLACKHOLE
iptables -A INPUT -p tcp -m multiport --destination-ports 80,443 -j ACCEPT
Ipset был создан с помощью следующей команды:
ipset create ipset-blacklist hash:ip
Сейчас все отлично работает с IPv4, но проблема с IPv6, я получаю следующую ошибку: Syntax error: cannot parse 2003:e6:6f03:7b80:21dc:54c8:ac26:552b: resolving to IPv4 address failed
Как я могу сделать этот скрипт для чтения обоих типов IP-адресов?
1 ответ
Вам нужно создать ipset с помощью следующей команды:
$ sudo ipset create ipset-blacklist hash:ip family inet6
Опция family { inet | inet6 }
определяет семейство протоколов IP-адресов, которые будут храниться в наборе. По умолчанию это inet
(IPv4). Для получения дополнительной информации, вы можете увидеть man ipset
,
Также вам нужно использовать ip6tables
вместо iptables
, В противном случае вы получите ошибку, похожую на эту (я создал ipset test6 с семейством inet6)
iptables v1.6.0: Семейство протоколов набора test6 - это IPv6, что неприменимо.