< meta name="referrer" content="origin">
Home » Linux » CentOS » Настройка iptables в CentOS 7

Настройка iptables в CentOS 7

На защиту сервера от внешних угроз в первую очередь встает межсетевой экран, который фильтрует входящий и исходящий траффик. Настройкой iptables — частного случая фаервола на CentOS я хочу заняться в данной статье, а также рассказать о его установке и отключении. Мое руководство не будет исчерпывающим, я рассмотрю лишь те аспекты, которые считаю наиболее важными и сам использую в своей работе.

Вступление

Iptables в настоящее время является стандартом де-факто в среде современных linux дистрибутивов. Я даже сходу не могу припомнить, что еще используют в качестве фаервола. Так что любому администратору линукс приходится сталкиваться в своей работе с настройкой этого межсетевого экрана.

К этому фаерволу существуют разные обвязки, которые используются для более «удобной» настройки. В ubuntu есть ufw, в centos — firewalld, с другими не знаком. Лично я не вижу никакого удобства в использовании этих инструментов. Я привык настраивать линуксовый фаервол по-старинке, как научился в самом начале работы. Мне кажется это наиболее простым и удобным способом, которым я с вами и поделюсь. Суть его сводится к тому, что создается скрипт с правилами фаервола. Этот скрипт можно легко редактировать под свои нужды и переносить с сервера на сервер.

Отключение firewalld

Вопрос отключения firewalld я уже касался в теме по настройке сервера. Первым делом отключим firewalld, который присутствует в centos 7 по-умолчанию сразу после установки:

# systemctl stop firewalld

Теперь удалим его из автозагрузки, чтобы он не включился снова после рестарта:

# systemctl disable firewalld

После этого на сервере настройки сетевого экрана становятся полностью открытыми. Посмотреть правила iptables можно командой:

# iptables -L -v -n

Просмотр правил iptables

Дальше пойдет информация исключительно по конфигурированию только iptables. Темы firewalld я больше касаться не буду.

Установка iptables

На самом деле фаервол у нас на сервере уже стоит и работает, просто нет никаких правил, все открыто. Установить нам нужно будет дополнительные утилиты управления, без которых конфигурировать iptables невозможно. Например, нельзя будет перезапустить фаервол:

# systemctl restart iptables.service
Failed to issue method call: Unit iptables.service failed to load: No such file or directory.

Или добавить в автозапуск не получится:

# systemctl enable iptables.service
Failed to issue method call: No such file or directory

Чтобы подобных ошибок не было, установим необходимый пакет с утилитами:

# yum -y install iptables-services

Теперь можно добавить iptables в автозагрузку и запустить:

# systemctl enable iptables.service
# systemctl start iptables.service

Настройка фаервола

Для управления правилами фаервола я использую скрипт. Создадим его:

# mcedit /etc/iptables.sh

Далее будем наполнять его необходимыми правилами. Я буду разбирать все значимые части скрипта, а полностью его приведу в виде текстового файла в конце статьи. Правила сделаны в виде картинок, чтобы запретить копирование и вставку. Это может привести к ошибкам в работе правил, с чем я сам столкнулся во время подготовки статьи.

Мы рассмотрим ситуацию, когда сервер является шлюзом в интернет для локальной сети.

Первым делом зададим все переменные, которые будем использовать в скрипте. Это не обязательно делать, но рекомендуется, потому что удобно переносить настройки с сервера на сервер. Достаточно будет просто переназначить переменные.

Перед применением новых правил, очищаем все цепочки:

Блокируем весь трафик, который не соответствует ни одному из правил:

Разрешаем весь трафик локалхоста и локалки:

Разрешаем делать ping:

Если вам это не нужно, то не добавляйте разрешающие правила для icmp.

Открываем доступ в инет самому серверу:

Если вы хотите открыть все входящие соединения сервера, то добавляйте дальше правило:

Делать это не рекомендуется, привожу просто для примера, если у вас появится такая необходимость.

Дальше разрешим все установленные соединения и дочерние от них. Так как они уже установлены, значит прошли через цепочки правил, фильтровать их еще раз нет смысла:

Теперь добавим защиту от наиболее распространенных сетевых атак. Сначала отбросим все пакеты, которые не имеют никакого статуса:

Блокируем нулевые пакеты:

Закрываемся от syn-flood атак:

Следом за этими правилами рекомендуется поставить правила на запрет доступа с определенных IP, если у вас имеется такая необходимость. Например, вас задолбал адрес 84.122.21.197 брутом ssh. Блокируем его:

Если вы не ставите ограничений на доступ из локальной сети, то разрешаем всем выход в интернет:

Следом запрещаем доступ из инета в локальную сеть:

Чтобы наша локальная сеть пользовалась интернетом, включаем nat:

Чтобы не потерять доступ к серверу, после применения правил, разрешаем подключения по ssh:

И в конце записываем правила, чтобы они применились после перезагрузки:

Мы составили простейший конфиг, который блокирует все входящие соединения, кроме ssh и разрешает доступ из локальной сети в интернет. Попутно защитились от некоторых сетевых атак.

Сохраняем скрипт, делаем исполняемым и запускаем:

# chmod 0740 /etc/iptables.sh
# /etc/iptables.sh

Выполним просмотр правил и проверим, все ли правила на месте:

# iptables -L -v -n
Обращаю ваше внимание — применять правила нужно лишь в том случае, если у вас имеется доступ к консоли сервера. При ошибке в настройках вы можете потерять доступ. Убедитесь, что в нештатной ситуации вы сможете отключить фаервол и скорректировать настройки.

Открытие портов

Теперь немного расширим нашу конфигурацию и откроем в iptables порты для некоторых сервисов. Допустим, у нас работает веб-сервер и необходимо открыть к нему доступ из интернета. Добавляем правила для веб-трафика:

Было добавлено разрешение на входящие соединения по 80-му и 443-му портам, которые использует web сервер в своей работе.

Если у вас установлен почтовый сервер, то нужно разрешить на него входящие соединения по всем используемым портам:

Для корректной работы DNS сервера, нужно открыть UDP порт 53

И так далее. По аналогии можете открыть доступ для всех необходимых сервисов.

Проброс (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

Включение логов

Во время настройки полезно включить логи, чтобы мониторить заблокированные пакеты и выяснять, почему отсутствует доступ к необходимым сервисам, которые мы вроде бы уже открыли. Я отправляю все заблокированные пакеты в отдельные цепочки (block_in, block_out, block_fw), соответствующие направлению трафика и маркирую в логах каждое направление. Так удобнее делать разбор полетов. Добавляем следующие правила в самый конец скрипта, перед сохранением настроек:

Все заблокированные пакеты вы сможете отследить в файле /var/log/messages.

После того, как закончите настройку, закомментируйте эти строки, отключив логирование. Обязательно стоит это сделать, так как логи очень быстро разрастаются. Практического смысла в хранении подобной информации лично я не вижу.

Как отключить iptables

Если вы вдруг решите, что firewall вам больше не нужен, то отключить его можно следующим образом:

# systemctl stop iptables.service

Эта команда останавливает фаервол. А следующая удаляет из автозагрузки:

# systemctl disable iptables.service

Отключив сетевой экран, мы разрешили все соединения.

Заключение

Как и обещал, выкладываю готовый скрипт с основным набором правил, которые мы рассмотрели iptables.sh

Хочу еще раз обратить внимание, что при настройке iptables необходимо быть предельно внимательным. Не начинайте это дело, если не имеете доступа к консоли сервера. Даже во время написания этой статьи я потерял доступ к серверу из-за нелепой ошибке в правилах. Ошибка эта возникла из-за копирования и потери двойного тире — оно заменилось на одинарное.

А представляете, если это был бы удаленный сервер? Ко мне так обратился один знакомый, который попросил настроить firewall на веб-сервере. Предыдущий админ заставил его 2 раза приезжать к размещению машины и сбрасывать настройки неправильно сконфигурированного экрана, что в конечном счете и привело к прекращению сотрудничества. Это было давно, но случай мне запомнился. Сейчас практически все хостинги предлагают платно или бесплатно удаленный KVM доступ. Лучше озаботиться об этом заранее.

Видео


Помогла статья? Есть возможность отблагодарить автора

Дополнительные материалы по CentOS

Рекомендую полезные материалы по CentOS:
Настройки системы
  • Установка
  • Базовая настройка
  • Настройка времени
  • Настройка сети
  • Настройка репозиториев
  • Настройка iptables
Установка CentOS 7 в конфигурации minimal или netinstall с загрузочной флешки или по сети на диск или raid раздел.
Базовая настройка CentOS 7 для работы с любым функционалом. Приведены практические советы по улучшению безопасности и удобства администрирования.
Как установить точное время на сервере CentOS, настроить часовой пояс, синхронизировать время с помощью ntpdate и ntpd и другое.
Подробное описание настройки сети в CentOS 7 - задать ip адрес, dhcp, отключить ipv6, dns, hostname, статические маршруты и др.
Установка репозиториев epel, rpmforge и др. Добавление, удаление, обновление rpm репозиториев в CentOS.
Рассмотрены основные моменты настройки iptables в Centos 7 - установка, добавление правил, проброс портов, nat, логирование и д.р.
Настройка программных комплексов
 
  • Прокси сервер
  • Шлюз
  • Asterisk
  • Asterisk+Freepbx
  • Сервер VPN
  • Web сервер Apache
  • Web сервер Nginx
  • Почтовый сервер
Подробное описание настройки прокси сервера на базе CentOS 7 со связкой squid+AD+sams2, реализован запрет доступа по url и группам пользователей.
Простая и быстрая настройка шлюза на базе CentOS 7 для организации доступа в интернет из локальной сети.
Описание установки и настройки asterisk - популярной современной sip атс. Описан расширенный функционал, покрывающий большинство потребностей стандартного офиса в современной телефонии.
Подробное описание установки voip сервера asterisk и панели управления freepbx на CentOS 7.
Установка и настройка OpenVPN сервера на CentOS для объединения офисов и подключения удаленных пользователей
Настройка web сервера CentOS 7 на базе связки http сервера apache, php и сервера db mysql, или коротко - установка lamp.
Установка и настройка высокопроизводительного web сервера на базе nginx и php fpm. В качестве кэша используется APC.

Описание установки и настройки почтового сервера iRedMail на основе готовой сборки на CentOS 7. Обзор основных возможностей и рекомендации по настройке.

Самостоятельная настройки почтового сервера postfix + dovecot а так же дополнительных полезных модулей для полноценной и удобной работы почты.

Размышления на тему выбора почтового сервера для малых и средних компаний.

Настройка отдельных программ
 
  • Zabbix
  • Phpmyadmin
  • Webmin
  • Ruby
  • Обновление php
  • Vsftpd
  • Bind
  • Unison
  • Observium
  • Syslog-NG
Видео и подробное описание установки и настройки Zabbix 3.2, а также установка агентов на linux и windows и подключение их к мониторингу.
Подробное описание установки и настройки панели управления phpmyadmin на веб сервер apache и nginx под управлением Centos 7.
Подробное описание установки и настройки Webmin на CentOS 7 для удаленного подключения и управления сервером.
Подробное описание установки языка Ruby последней версии на веб сервер под управлением CentOS 7.
Подробное описание установки или обновления php 7 на CentOS 7. Рассмотрен вариант отката обновления и возврата на php 5.6 или 5.4.
Подробное описание с видео установки и настройки ftp сервера vsftpd, примеры с локальными и виртуальные пользователями в mysql.
Настройка DNS сервера BIND (Named) в CentOS 7. Рассмотрены наиболее популярные конфигурации, в том числе подробное логирование.
Установка Unison в CentOS 7 для двухсторонней синхронизации файлов.
Инструкция по установке и настройке сервера мониторинга Observium на CentOS 7. В качестве примера в конце добавлено одно устройство для мониторинга.
Настройка сервера для централизованного сбора логов с удаленных устройств и серверов с помощью программы syslog-ng.
Разное
  • Настройка ssl в Apache
  • Бэкап с помощью rsync
Настройка работы веб сервера apache с виртуальными хостами по протоколу https с использованием бесплатного ssl сертификата.
Подробное описание настройки бэкапа с помощью rsync на примере скрипта инкрементного архива на системе Centos, Debian, Ubuntu, Windows.

24 комментария

  1. Как обезопасить себя от потери доступа к удаленному серверу:
    Используем для этих целей iptables-apply или собираем свой шелл скрип на примере приведенном ниже.
    Суть в том, что «испортив» правила iptables вы теряете доступ к серверу, и не можете указать скрипту, что вы желаете сохранить настройки. Скрипт, не получив ответ на свой вопрос восстанавливает исходные настройки правил.
    Пример для Debian/Ubuntu:

    #!/bin/sh

    safeMode=»y» # y/n
    if [ «$safeMode» = «y» ] ; then
    printf «\n Сохраняем исходные правила в файл /etc/network/iptables.up.run …\n»
    /sbin/iptables-save > /etc/network/iptables.up.run
    fi
    #===============================================================
    export IPT=»iptables»
    # Очищаем все цепочки правил iptables
    $IPT -F
    $IPT -F -t nat
    $IPT -F -t mangle
    $IPT -X
    $IPT -t nat -X
    $IPT -t mangle -X
    # Блокируем весь трафик не соответствующий ни одному из правил
    $IPT -P INPUT ACCEPT
    $IPT -P OUTPUT ACCEPT
    $IPT -P FORWARD ACCEPT
    #===============================================================
    if [ «$safeMode» != «y» ];then exit;fi
    printf «\n Новые правила таблицы filter:\n»
    $IPT -S
    printf «\n Новые правила таблицы nat:\n»
    $IPT -t nat -S
    printf «\n Новые правила таблицы mangle:\n»
    $IPT -t mangle -S
    rc() {
    old=$(stty -g)
    stty raw min 0 time 255 #макс значение = 22.5 sec
    printf ‘%s’ $(dd bs=1 count=1 2>/dev/null)
    stty $old
    }
    printf «\n Восстановить исходные правила? (Y/n) \n 25 сек до восстановления…: »
    answer=$(rc)
    if [ «$answer» = «n» ] || [ «$answer» = «N» ] ; then
    printf «\n Сохраняем правила в файл /etc/network/iptables.up.rules …\n»
    /sbin/iptables-save > /etc/network/iptables.up.rules
    exit
    fi
    printf «\n Восстанавливаем исходные правила …\n»
    /sbin/iptables-restore < /etc/network/iptables.up.run

    printf "\n Исходные правила таблицы filter:\n"
    $IPT -S
    printf "\n Исходные правила таблицы nat:\n"
    $IPT -t nat -S
    printf "\n Исходные правила таблицы mangle:\n"
    $IPT -t mangle -S

  2. короче настроил все как пописано да включил серверную игру samp порт 777 порт в firewalld открыты но проверк кажет что порт закрыт на сайте

  3. Анатолий

    Можете подсказать, настроил все по вашим инструкциям, поставил апач и никак не могу зайти на него с сервера, порты разрешил. В чем может быть проблема?

  4. Отличный конфиг, всё очень подробно разобрано, взял ваш скрипт за основу.

  5. Андрей

    Ну вот ничего не понял, что есть firewalld и что есть iptables.
    Вот на моём CentOS 7 поставил iptables, и он работает! Всё замечательно ни раз терял управление потом исправлял и т.д.
    Но в один прекрасный день осознание работы системы linux демонов снова было разрушено вот таким выводом команд:
    [root@servyak ~]# systemctl | grep fire
    firewalld.service loaded active running firewalld — dynamic firewall daemon
    [root@servyak ~]# systemctl | grep iptables
    [root@servyak ~]#

    • firewalld надстройка над iptables для более удобного управления правилами. Она не заменяет самого iptables.

      • Алексей

        Фактически ваш скрипт это такая же надстройка как и firewalld. Разве нет?
        Ведь скрипт это обвязка над командами, пачка правил. Firewalld тоже самое. Просто более интерактивное чем скрипт.
        Я не фанат firewalld, но имел с ним дело — он очень юзабелен и логика у него относительно простая.

        • Фактически да, скрипт это тоже надстройка. Я никого не уговариваю за отказ от firewalld. Так удобно лично мне, поэтому описываю свой опыт. Я работаю не только с centos, поэтому мне проще, когда у меня есть универсальный инструмент для всех систем.

  6. Аноним

    Только проброс портов не работает, что мешает?

  7. Сергей

    Сделал вроде все верно, но теперь я не могу через ssh подключится к серверу

    • Значит что-то не верно 🙂 Надо отключить фаервол и еще раз проверить правила.

      • Сергей

        уже трижды все переписал и раз 20 пересмотрел) Я не очень понимаю в этом, но может проблема в том что мой сервер и комп с которого я управляю находятся в сети одного маршрутизатора. Может нужно какие-то пробросы делать?)

        • Приведи здесь вывод команды:
          iptables -L -v -n

          • Сергей

            Аппетит приходит во время еды)) Кажется проблема была обнаружена и решена.
            Но на всякий случай посмотрите, все правильно настроено?))
            [root@gj ~]# iptables -L -v -n
            Chain INPUT (policy DROP 3 packets, 100 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 — eth1 * 0.0.0.0/0 0.0.0.0/0
            85 6636 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
            0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 state INVALID
            0 0 DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
            0 0 DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
            0 0 ACCEPT tcp — enp3s0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
            0 0 ACCEPT udp — enp3s0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
            0 0 ACCEPT udp — enp3s0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:123

            Chain FORWARD (policy DROP 0 packets, 0 bytes)
            pkts bytes target prot opt in out source destination
            0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
            0 0 ACCEPT all — eth1 enp3s0 0.0.0.0/0 0.0.0.0/0
            0 0 REJECT all — enp3s0 eth1 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

            Chain OUTPUT (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 — * eth1 0.0.0.0/0 0.0.0.0/0
            58 6124 ACCEPT all — * enp3s0 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 DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
            [root@gj ~]# Chain INPUT (policy DROP 3 packets, 100 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 — eth1 * 0.0.0.0/0 0.0.0.0/0
            85 6636 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
            0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 state INVALID
            0 0 DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
            0 0 DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
            0 0 ACCEPT tcp — enp3s0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
            0 0 ACCEPT udp — enp3s0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
            0 0 ACCEPT udp — enp3s0 * 0.0.0.0/0 0.0.0.0/0

            • Очень трудно читать лог с таким форматированием. К тому же тут 2 разных куска смешались. Но порт 22 на вход судя по всему открыт, ssh должен работать.

              • Сергей
                [root@gj ~]# iptables -L -v -n
                Chain INPUT (policy DROP 89 packets, 5755 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  --  eth1   *       0.0.0.0/0            0.0.0.0/0                                                                                           
                  517 47950 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0                                                                                                    state RELATED,ESTABLISHED
                    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0                                                                                                    state INVALID
                    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0                                                                                                    tcp flags:0x3F/0x00
                    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0                                                                                                    tcp flags:!0x17/0x02 state NEW
                    2    96 ACCEPT     tcp  --  enp3s0 *       0.0.0.0/0            0.0.0.0/0                                                                                                    tcp dpt:22
                    0     0 ACCEPT     udp  --  enp3s0 *       0.0.0.0/0            0.0.0.0/0                                                                                                    udp dpt:53
                    0     0 ACCEPT     udp  --  enp3s0 *       0.0.0.0/0            0.0.0.0/0                                                                                                    udp dpt:123
                
                Chain FORWARD (policy DROP 0 packets, 0 bytes)
                 pkts bytes target     prot opt in     out     source               destination                                                                                         
                    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0                                                                                                    state RELATED,ESTABLISHED
                    0     0 ACCEPT     all  --  eth1   enp3s0  0.0.0.0/0            0.0.0.0/0                                                                                           
                    0     0 REJECT     all  --  enp3s0 eth1    0.0.0.0/0            0.0.0.0/0                                                                                                    reject-with icmp-port-unreachable
                
                Chain OUTPUT (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  --  *      eth1    0.0.0.0/0            0.0.0.0/0                                                                                           
                  478  124K ACCEPT     all  --  *      enp3s0  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 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
  8. Валерий

    А возможно заблокировать сети Vk, Одноклассники и спутники мейл.ру???

    • Обычно это делают средствами прокси серверов, не iptables. Хотя может и можно фаерволом, но я не занимался этим. В любом случае, firewall не то средство, с помощью которого удобно делать фильтрацию пользовательского доступа на уровне доменов. Лучше тогда squid настроить.

  9. Дмитрий

    Здравствуйте, когда пытаюсь запустить скрипт iptables.sh пишет iptables v1.4.21: no command specified
    В чем может быть проблема?

Добавить комментарий

Ваш e-mail не будет опубликован.