четверг, 20 апреля 2017 г.

Немного об iptables часть 2

Отличная статья по iptables
Cстатистика:
Статистика неудачных подключений в auth.log
 cat /var/log/auth* | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c
Количество установленных соединений на порт, отображение IP:
netstat -ntu
Количество подключений по IP:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
1. Сохранение правил iptables
В некоторых дистрибутивах Linux после перезагрузки не сохраняются правила iptables.
Поэтому для простоты ставим:
 apt-get install iptables-persistent 
после этого правила хранятся в /etc/iptables/rules.v4 и /etc/iptables/rules.v6 и их можно редактировать либо вносить изменения через iptables.
Для применения изменений:
 service iptables-persistent reload
2.  Просмотр правил:
iptables -S #простой вывод
iptables -nL
iptables -nvL #более подробный вывод
3. Примеры цепочек:
iptables -F #Очищаем все цепочки таблицы filter
# Установка политик по умолчанию
iptables -P INPUT DROP # Важно, еcли настройка идет удаленно по SSh, то сначала открыть ssh порт, а потом закрывать все входящие порты, иначе потеряем связь с сервером или iptables -P INPUT DROP сделать в конце настройки iptables а в начале открыть все входящие подключения iptables -P INPUT ACCEPT 
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT 
#Принимаем пакеты для программ, которые уже установили соединение или требуют создание нового соединения, например чтобы не закрылось текущее SSH соединение
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
#Разрешаем сеть например вордпреса
-A INPUT -s 192.0.64.0/16 -j ACCEPT
#Разрешаем подключение к портам
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #ssh лучше поменять на другой порт
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
#Открыть резолв DNSа иначе доменные имена не доступны
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 --dport 1024:65535 -j ACCEPT
#Как пример можно закрыть некоторые нежелательные сети
-A INPUT -s 153.99.0.0/16 -j DROP
-A INPUT -s 218.64.0.0/16 -j DROP
# Защита от спуфинга
-A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j LOG --log-level info --log-prefix "DROP SYN,ACK:"
-A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset
#icmp
-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
-A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#Защита от сканера портов
-A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
-A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
#SSh защита вариант 1. С одного ip разрешаем не больше трех соединения (! --connlimit-above 2) на 22 порт, пропускаем 3 пакета в минуту с запросом на соединение (NEW), все
остальные пакеты (NEW) c этого ip блокируется
 -A INPUT -p tcp --dport 22 -m state --state NEW -m connlimit ! \ --connlimit-above 3 -m limit --limit 5/m --limit-burst 5 -j ACCEPT
#Shh защита вариант 2. Входящий TCP трафик на порт 22 проверяется модулем recent. ЕСЛИ за последние 120 секунд прошло 3 или более пакетов, то перейти к цели REJECT, при этом добавить последнее время попытки подключения на этот порт. Если же первое правило не сработало, то вторым правилом добавляется или обновляется последняя запись о входящем пакете и пакет пропускается внутрь.
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name ssh --update --seconds 120 --hitcount 3 -j REJECT
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name ssh --set
#Ограничить количество параллельных подключений по HTTP на порт 80 с одного ip, в примере 25 соединений, не забываем про NAT пользователей, такие тоже могут быть:
-A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 25 -j REJECT