Защита от сканирования портов средствами IPTABLES
06 Jan 2020 | Автор: dd |Возникла необходимость настроить людям открытый SOCKS5 прокси для тестов. Причем торчать он должен естественно в тырнет, где его могут найти весьма оперативно, если не предпринять некоторых мер по защите, основными из которых является предотвращение сканирования открытых портов.
Использовал для установки CentOS 7.7
Скажу откровенно, сначала я пытался смастырить все на встроенном firewall-cmd но дело что то не заладилось, так что я его снес и организовал все на ламповом олдскульном iptables.
# systemctl stop firewalld
# systemctl mask firewalld
# yum -y install iptables-services
# systemctl enable iptables
смотрим актуальные правила фаервола, чтобы не отрубить себе доступ
# cat /etc/sysconfig/iptables
и если все путем, то стартуем фаервол
# service iptables start
смотреть статус и актуальные правила, можно соответственно:
# service iptables status
# iptables -L
Теперь можно переходить непосредственно к настройке правил. Отталкивался я от этого поста в stackexchange
Для начала мы задаем так называемый IPSET – группы, которые можно будет впоследствии применить не к одному IP адресу, а ко множеству.
ipset create port_scanners hash:ip family inet hashsize 32768 maxelem 65536 timeout 7200
ipset create scanned_ports hash:ip,port family inet hashsize 32768 maxelem 65536 timeout 300
первая группа scanned_ports – это база куда попадают айпишники с портами, причем в базу пишутся только новые порты описанные в правилах hashlimit. Если сканер обращается к 2 разным портам в пределах таймаута, то айпишник переходит во вторую группу. Специально поставил 5 минут, т.к после просмотра листинга, оказалось что некоторые хитрованы перебирают порты с таймаутом в несколько минут, хотя 65535 минут = полутора месяцам.
вторая port_scanners – это те кого мы запалили в скане портов и сажаем в неё на 2 часа 60*60*2
Далее описываем правила для Firewall с правилами добавления в IPSET и блокировки негодяйских негодяеев из port_scanners
iptables -A INPUT -m state --state INVALID -j
DROP
iptables -A INPUT -m state --state NEW -m set ! --match-set scanned_ports src,dst -m hashlimit --hashlimit-above 1/hour --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name portscan --hashlimit-htable-expire 120000 -j SET --add-set port_scanners src --exist
iptables -A INPUT -m state --state NEW -m set --match-set port_scanners src -j
DROP
iptables -A INPUT -m state --state NEW -j SET --add-set scanned_ports src,dst
Теперь переходим к распихиванию данных правил в систему: теоретически можно на дурачка все запихнуть в /etc/rc.conf, но тогда все эти правила встанут в самом конце, т.к если засунуть туда только созание IPSET то фаервол не стартанет, поскольку он стартует раньше инициализации rc.local и не увидит IPSET описанных в правилах.
Так что в rc.conf вставляем только отключение пингов, чтобы машины была видна чуть менее
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Теперь засовываем правила для фаервола в самое начало листа правил фильтра в конфиге /etc/sysconfig/iptables, прям под открытые порты
##### /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sat Jan 4 16:29:46 2020
*filter
##### Рандомные порты куда перевешиваем ssh и т.д
-A INPUT -p tcp -m tcp –dport 28173 -m state –state NEW -j ACCEPT
-A INPUT -p tcp -m tcp –dport 38193 -m state –state NEW -j ACCEPT
### Блокировка сканирования портов
-A INPUT -m state –state INVALID -j DROP
-A INPUT -m state –state NEW -m set ! –match-set scanned_ports src,dst -m hashlimit –hashlimit-above 1/hour –hashlimit-burst 2 –hashlimit-mode srcip –hashlimit-name portscan –hashlimit-htable-expire 120000 -j SET –add-set port_scanners src –exist
-A INPUT -m state –state NEW -m set –match-set port_scanners src -j DROP
-A INPUT -m state –state NEW -j SET –add-set scanned_ports src,dst
###
-A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
########################
Далее переходим в самое тугое – прикручивание IPSET к системе.
Для начала создаем файлик инициализации правил
#### /etc/init.d/S01ipset
#!/bin/sh
### INIT INFO
# Provides: ipset
### END INIT INFO
# ipset Start the ipset daemon.
ipset create port_scanners hash:ip family inet hashsize 32768 maxelem 65536 timeout 7200
ipset create scanned_ports hash:ip,port family inet hashsize 32768 maxelem 65536 timeout 300
########################
задаем права на исполнение
# chmod 755 /etc/init.d/S01ipset
Теперь, поскольку у нас зачупательский CentOS7 переходим к пляскам с бубном, и создаем файл запуска сервиса
#### /lib/systemd/system/ipset.service
[Unit]
Description=ipset firewall
Wants=network-online.target
After=syslog.target
Before=shorewall.service iptables.service
[Service]
Type=oneshot
RemainAfterExit=yes
StandardOutput=syslog
ExecStart=/etc/init.d/S01ipset start
[Install]
WantedBy=basic.target
########################
Говорим сервису стартовать при загрузке
# systemctl enable ipset.service
Теперь немного рихтуем iptables.service чтобы он у нас стартовал после ipset.service, так что приводим раздела [Unit] файла сервиса iptables.service к следующему виду, убрав из поля After значение syslog.target
### /lib/systemd/system/iptables.service
[Unit]
Description=IPv4 firewall with iptables
Before=ip6tables.service
After=ipset.service
AssertPathExists=/etc/sysconfig/iptables
########################
После этого можем смело ребутить нас сервер и наслаждаться картиной молотилок. Откровенно говоря, полагал, что если отключить пинг, то обращений будет не особо много, но тем не менее сканеры долбятся рандомно на разные порты, причем некоторые явно работают профессионально, т.к с одного IP сетки отправляют не более одного запроса.
Больше всего, конечно, обращений в закрытый порт SSH – в принципе можно со спокойной совестью таких посетителей отправлять в бан сразу.
Самое интересное, что обнаружил что с сеток Comtrade LLC и Selectel идет массированный скан, причем используют все адреса по порядку из адресных пространств 45.136.108/45.136.109/92.119.160, а также с сетки 185.176.27 какого то казанского парня Юрия Дунаева
Защита от сканирования портов средствами IPTABLES,