Проверка открыт ли порт
Когда мы настроили все правила, закрывающие и открывающие порты, нам необходимо проверить корректность примененных настроек. Для этого можно использовать приложение telnet. Telnet — приложение, позволяющее установить двунаправленное соединение между двумя компьютерами с помощью протокола telnet. В рамках нашей задачи попытка установления соединения между двумя машинами в сети используется как тест правил Netfilter. Выполняем команду следующего вида:
$ telnet ip-адрес порт
Например:
В данной команде будет проверен 443 порт у машины с ip-адресом 192.168.1.5. Если на порту 443 на удаленной машине разрешено входящее соединение и правила на локальной машине разрешают исходящее соединение на порту 443, то получим сообщение:
Или неожиданно можем получить приглашение доступа к данной машине, если на этом порте ожидает подключения серверная часть telnet.
Если же правила запрещают входящее соединение на удаленной машине, или исходящее соединение на нашей локальной машине на порту 443, то получим сообщение:
Примечание: Чтобы получить результаты необходимо подождать довольно продолжительное время, чтобы telnet получил результат попытки соединения по указанному порту.
Проброс (forward) порта
Рассмотрим ситуацию, когда необходимо выполнить проброс портов с внешнего интерфейса на какой-то компьютер в локальной сети. Допустим, вам необходимо получить rdp доступ к компьютеру 10.1.3.50 из интернета. Делаем проброс TCP порта 3389:
Если вы не хотите светить снаружи известным портом, то можно сделать перенаправление с нестандартного порта на порт rdp конечного компьютера:
Если вы пробрасываете порт снаружи внутрь локальной сети, то обязательно закомментируйте правило, которое блокирует доступ из внешней сети во внутреннюю. В моем примере это правило:
$IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT
Либо перед этим правилом создайте разрешающее правило для доступа снаружи к внутреннему сервису, например вот так:
$IPT -A FORWARD -i $WAN -d 10.1.3.50 -p tcp -m tcp --dport 3389 -j ACCEPT
Где я могу получить IP-адреса и диапазоны разных стран?
In IPDeny вы можете найти все блоки адресов IPv4, которые принадлежат каждой стране, таким образом, мы можем получить все диапазоны IP-адресов в формате CIDR из всех стран мира, у нас будет возможность увидеть диапазоны IP-адресов Испании, Китай, Россия и многие другие. Чем больше страна, тем больше диапазонов адресов IPv4 у нас будет, поэтому нам придется разрешать или запрещать доступ к этим сетям, чтобы позже запретить или разрешить их. В эта другая ссылка у нас есть блоки адресов IPv6 для каждой страны.
Очень важной деталью является то, что IPDeny очень часто обновляет всю базу данных IP-адресов, как IPv4, так и IPv6, чтобы мы не блокировали IP-адреса или диапазоны из одной страны, которая фактически находится в другой. Эта веб-страница обновляется почти ежедневно по мере изменения или добавления блоков адресов IPv4 и IPv6
Обновление и установка зависимостей
Прежде всего, мы должны модернизировать нашу систему Linux, а затем мы будем двигаться вперед для установки зависимостей, которые необходимы для xtables-addons. Для того, чтобы сделать это, мы выполним следующие команды соответствующих дистрибутивам, работающих в нашей машине.
Система на основе Debian (Debian, Ubuntu, Linux Mint)
# apt-get update && apt-get upgrade # apt-get install iptables-dev xtables-addons-common libtext-csv-xs-perl pkg-config
Система RedHat, основанная (CentOS, RHEL, Fedora)
# yum update # yum install gcc-c++ make automake kernel-devel-`uname -r` wget unzip iptables-devel perl-Text-CSV_XS
Настройка блокировки доступа к сайту по странам
Дальше можно пойти двумя путями:
- Блокировать доступ определенным странам.
- Разрешить доступ списку стран, а от остальных закрыться.
Сначала я пошел по первому пути и стал вычислять страны, с которых приходит больше всего ботов и блокировать их. Потом я понял, что это не очень эффективно с точки зрения затраты времени. Список подходящих мне стран гораздо меньше, чем список нежелательных. Так что я пошел по другому пути и запретил доступ всем, кроме некоторых стран. Я расскажу дальше для примера оба способа. Технически они ничем не отличаются, просто разный подход.
Итак, у нас есть список ip адресов и подсетей, разделенных по странам. Списки очень большие, руками их обрабатывать не получится. Мы это дело автоматизируем, а пока пройдемся по теории. Разберемся с управлением списками в ipset. Для начала создадим список и назовем его — blacklist.
# ipset -N blacklist nethash
Этой командой я создал список blacklist типа nethash. Строго говоря, я создаю не список, а набор данных типа nethash. В данном случае это набор данных адресов подсетей. Именно в виде набора подсетей выглядят списки доступа стран по ip. Если у вас есть список ip адресов, то тип данных будет iphash. Более подробно о типах данных можно посмотреть в документации.
Добавим в наш список несколько подсетей.
# ipset -A blacklist 5.43.240.0/21 # ipset -A blacklist 5.100.64.0/18 # ipset -A blacklist 5.159.112.0/21
Посмотрим содержимое списка blacklist.
# ipset -L blacklist Name: blacklist Type: hash:net Revision: 3 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16880 References: 0 Members: 5.100.64.0/18 5.43.240.0/21 5.159.112.0/21
Обращаю внимание на выделенные строки. Когда я создавал список стран для блокировки, он получился очень большой и не помещался весь в объект с дефолтными настройками
Их можно изменить таким образом:
# ipset create blacklist nethash hashsize 16348 maxelem 131072
Проверяем:
# ipset -L blacklist Header: family inet hashsize 16384 maxelem 131072 Size in memory: 262544
Обратите внимание на занимаемую память. На маленьком VPS это может стать проблемой
В том числе из этих соображений я решил перейти к белому списку. Он существенно меньше, соответственно, меньше ресурсов тратится на его обработку.
Список мы создали, теперь его надо подключить в iptables. Для этого добавляем правило блокировки.
# iptables -A INPUT -m set --match-set blacklist src -j DROP
Смотрим, что получилось в правилах:
# iptables -L INPUT -v -n
Все в порядке, правило добавили. Следите, чтобы запрещающее правило было первым и лишние подключения отваливались сразу. Давайте теперь на примере посмотрим, как организовать белый список. Создаем сам список.
# ipset -N whitelist nethash
Добавляем в него подсети.
# ipset -A whitelist 6.43.240.0/21 # ipset -A whitelist 7.100.64.0/18 # ipset -A whitelist 8.159.112.0/21
Создаем правило в iptables, по которому к нашему серверу будут иметь доступ только адреса из списка. Сначала у меня стояли вот эти два правила, которые разрешают доступ к веб серверу всем.
iptables -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT iptables -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT
Я их изменил на следующие.
iptables -A INPUT -i $WAN -m set --match-set whitenet src -p tcp --dport 80 -j ACCEPT iptables -A INPUT -i $WAN -m set --match-set whitenet src -p tcp --dport 443 -j ACCEPT
Не забывайте важный момент — чтобы у вас белый список работал, у вас должен весь трафик, который не разрешен явно, блокироваться. Подробнее о настройке iptables читайте мою статью, о которой я говорил ранее.
Принцип работы ipset рассмотрели. Теперь автоматизируем все и создадим полный список ip адресов по странам, которым будет разрешен доступ к сайту. Я для этого написал простенький скрипт. Привожу его с комментариями.
#!/bin/bash # Удаляем список, если он уже есть ipset -X whitelist # Создаем новый список ipset -N whitelist nethash # Скачиваем файлы тех стран, что нас интересуют и сразу объединяем в единый список wget -O netwhite http://www.ipdeny.com/ipblocks/data/countries/{ru,ua,kz,by,uz,md,kg,de,am,az,ge,ee,tj,lv}.zone echo -n "Загружаем белый список в IPSET..." # Читаем список сетей и построчно добавляем в ipset list=$(cat netwhite) for ipnet in $list do ipset -A whitelist $ipnet done echo "Завершено" # Выгружаем созданный список в файл для проверки состава ipset -L whitelist > w-export
Запускаете скрипт, он скачивает и объединяет списки нужных вам стран, затем добавляет их в ipnet и в конце делает экспорт в файл. Посмотрите на этот файл. Список в нем должен совпадать с исходным списком, плюс несколько информационных строк в самом начале. На этом все. Если вы добавили правила в iptables, ограничение доступа по ip уже начало работать.