Настройка iptables
Натройка брэндмауэра - один из основных и необходимых шагов настройки системы.
- Посмотрим текущие сетевые соединения:
> netstat -tulpn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3084/sshd tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 3008/postmaster tcp6 0 0 :::22 :::* LISTEN 3084/sshd tcp6 0 0 :::5432 :::* LISTEN 3008/postmaster - Настройка брэндмауэра производится через утилиту
iptables. Текущие правила можно посмотреть командой:> sudo iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination - Вносим правила:
- разрешены соединения для локального интерфейса (localhostб 127.0.0.1)
> sudo iptables -A INPUT -i lo -j ACCEPT > sudo iptables -A OUTPUT -o lo -j ACCEPT - разрешены пакеты для уже установленных соединений
> sudo iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT > sudo iptables -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT > sudo iptables -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT - открываем порты
> sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT > sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT > sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT - выключаем фрагментацию пакетов. Необходимо из-за разных значений MTU
> sudo iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu - отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
> sudo iptables -A INPUT -m state --state INVALID -j DROP > sudo iptables -A FORWARD -m state --state INVALID -j DROP - защита от syn-flood.
Согласно процессу «трёхкратного рукопожатия» TCP, клиент посылает пакет с установленным флагом SYN (synchronize). В ответ на него сервер должен ответить комбинацией флагов SYN+ACK (acknowledges). После этого клиент должен ответить пакетом с флагом ACK, после чего соединение считается установленным.
Принцип атаки заключается в том, что злоумышленник, посылая SYN-запросы, переполняет на сервере (цели атаки) очередь на подключения. При этом он игнорирует SYN+ACK пакеты цели, не высылая ответные пакеты, либо подделывает заголовок пакета таким образом, что ответный SYN+ACK отправляется на несуществующий адрес. В очереди подключений появляются так называемые полуоткрытые соединения (англ. half-open connection), ожидающие подтверждения от клиента. По истечении определенного тайм-аута эти подключения отбрасываются. Задача злоумышленника заключается в том, чтобы поддерживать очередь заполненной таким образом, чтобы не допустить новых подключений. Из-за этого клиенты, не являющиеся злоумышленниками, не могут установить связь, либо устанавливают её с существенными задержками.
sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP - (???) блокирует нулевые пакеты (смотрит все флаги и все флаги выключены)
> sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP - (???) блокирует пакеты XMAS (смотрит все флаги и все флаги включены)
> sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP - правила по умолчанию - все входящие пакеты отбрасываем
> sudo iptables -P INPUT DROP
- разрешены соединения для локального интерфейса (localhostб 127.0.0.1)
- Проверка правил:
> sudo iptables -nvL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 544 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 - Для сохранения правил и их восстановления есть 2 утилиты:
sudo iptables-save > /etc/sysconfig/iptablessudo iptables-restore < /etc/sysconfig/iptables - Основная проблема в том, что после перезагрузки правила всегда нужно восстанавливать.
Это можно делать вручную, а можно использовать утилиту
iptables-services. Устанавливаем эту утилиту и помещаем её в автозагрузку:sudo yum install -y iptables-services sudo systemctl enable iptables.serviceСохраняем текущие правила брэндмауэра:
sudo /usr/libexec/iptables/iptables.init saveПо-умолчанию, правила сохраняются в файл
/etc/sysconfig/iptables. Теперь, при старте системы эта утилита будет подгружать сохраненные правила.
Евгений Вдовенко
Физик по образованию, занимаюсь веб-разработкой на PHP с 2013 года. Нравится ковырятся в Zend Framework/Expressive и Joomla CMS/Framework. В процессе разборок с Python. Подумываю посмотреть Go. Считаю PostgreSQL крутым продуктом и внедряю его везде, где могу.