Настройка iptables

Натройка брэндмауэра - один из основных и необходимых шагов настройки системы.

  1. Посмотрим текущие сетевые соединения:
    > 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
    
  2. Настройка брэндмауэра производится через утилиту 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
    
    
  3. Вносим правила:
    • разрешены соединения для локального интерфейса (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
      
  4. Проверка правил:
    > 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
    
  5. Для сохранения правил и их восстановления есть 2 утилиты:
    sudo iptables-save > /etc/sysconfig/iptables
    
    sudo iptables-restore < /etc/sysconfig/iptables
    
  6. Основная проблема в том, что после перезагрузки правила всегда нужно восстанавливать. Это можно делать вручную, а можно использовать утилиту 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 крутым продуктом и внедряю его везде, где могу.