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

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

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

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Курс стоящий, все подробности читайте по ссылке. Есть бесплатные курсы.

Вступление

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 доступ. Лучше озаботиться об этом заранее.

Видео

Онлайн курсы по Mikrotik

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую пройти курсы по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Помимо официальной программы, в курсах будут лабораторные работы, в которых вы на практике сможете проверить и закрепить полученные знания. Все подробности на сайте . Стоимость обучения весьма демократична, хорошая возможность получить новые знания в актуальной на сегодняшний день предметной области. Особенности курсов:
  • Знания, ориентированные на практику;
  • Реальные ситуации и задачи;
  • Лучшее из международных программ.

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

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству.

70 комментариев

  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 ~]#

    • Zerox

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

      • Аватар
        Алексей

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

        • Zerox

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

  6. Аватар

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

  7. Аватар

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

    • Zerox

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

      • Аватар

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

        • Zerox

          Приведи здесь вывод команды:
          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

            • Zerox

              Очень трудно читать лог с таким форматированием. К тому же тут 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, Одноклассники и спутники мейл.ру???

    • Zerox

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

    • Аватар
      Прохожий

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

      На примере Facebook.

      1. Найти все адреса
      host -t a http://www.facebook.com
      # команда определит список адресов Facebook (31.13.65.17 — один из них)

      whois 31.13.65.17 | grep inetnum

      31.13.64.0 — 31.13.127.255

      2. Конвертировать вышеуказанный дипазон адресов в CIDR-notation (www.ipaddressguide.com/cidr) и получаем 31.13.64.0/18

      3. Запрет исходящих запросов к Facebook
      iptables -A OUTPUT -p tcp -i eth0 -o eth1 -d 31.13.64.0/18 -j DROP

  9. Аватар
    Дмитрий

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

  10. Аватар
    Николай

    Т.е. в iptables можно пробросить порт с eth0, на ip адрес локальной сети, имея на интерфейсе eth0, динамический белый ip ?

  11. Аватар
    Владимир

    Привет, сделал под копирку, при выполнении скрипта выдает

    /etc/iptables.sh: line 1: rt: команда не найдена
    /etc/iptables.sh: line 4: -F: команда не найдена
    /etc/iptables.sh: line 5: -F: команда не найдена
    /etc/iptables.sh: line 6: -F: команда не найдена
    /etc/iptables.sh: line 7: -X: команда не найдена
    /etc/iptables.sh: line 8: -t: команда не найдена
    /etc/iptables.sh: line 9: -t: команда не найдена
    /etc/iptables.sh: line 16: -P: команда не найдена
    /etc/iptables.sh: line 17: -P: команда не найдена
    /etc/iptables.sh: line 18: -P: команда не найдена
    /etc/iptables.sh: line 21: -A: команда не найдена
    /etc/iptables.sh: line 22: -A: команда не найдена
    /etc/iptables.sh: line 23: -A: команда не найдена
    /etc/iptables.sh: line 24: -A: команда не найдена
    /etc/iptables.sh: line 27: -A: команда не найдена
    /etc/iptables.sh: line 28: -A: команда не найдена
    /etc/iptables.sh: line 29: -A: команда не найдена
    /etc/iptables.sh: line 30: -A: команда не найдена
    /etc/iptables.sh: line 33: -A: команда не найдена
    /etc/iptables.sh: line 34: -A: команда не найдена
    /etc/iptables.sh: line 35: -A: команда не найдена
    /etc/iptables.sh: line 38: -A: команда не найдена
    /etc/iptables.sh: line 39: -A: команда не найдена
    /etc/iptables.sh: line 42: -A: команда не найдена
    /etc/iptables.sh: line 45: -A: команда не найдена
    /etc/iptables.sh: line 46: -A: команда не найдена
    /etc/iptables.sh: line 49: -A: команда не найдена
    /etc/iptables.sh: line 55: -N: команда не найдена
    /etc/iptables.sh: line 56: -N: команда не найдена
    /etc/iptables.sh: line 57: -N: команда не найдена
    /etc/iptables.sh: line 59: -A: команда не найдена
    /etc/iptables.sh: line 60: -A: команда не найдена
    /etc/iptables.sh: line 61: -A: команда не найдена
    /etc/iptables.sh: line 63: -A: команда не найдена
    /etc/iptables.sh: line 64: -A: команда не найдена
    /etc/iptables.sh: line 65: -A: команда не найдена
    /etc/iptables.sh: line 66: -A: команда не найдена
    /etc/iptables.sh: line 67: -A: команда не найдена
    /etc/iptables.sh: line 68: -A: команда не найдена

    Поможешь?

    • Аватар
      Владимир

      Разобрался!

      • Аватар
        Аврил Лавин

        Писать «разобрался», но не говорить, какое решение применил для этого — моветон.

        • Zerox

          У него понятно в чем проблема. Он переменную $IPT с ошибкой указал, поэтому везде, где использовалось $IPT были ошибки. Наверно просто опечатка была в команде iptables.

  12. Аватар

    Здравствуйте, уважаемые!
    Ситуация следующая:
    Имеется не большая локальная сеть 10-15 компьютеров + сервер на ЦентОС 7
    Интернет приходит по телефонной линии —> dsl модем —> сервер
    Сервер получает интернет по pppoe соединению к провайдеру и раздает на локальные компьютеры.
    Задача обеспечиль коректное функционирование vpn соединений с локальных компьютеров к серверу головного офиса в соседнем городе!
    Имеется интернет адрес сервера + ключи и пароли для локальных пользователей.
    Подскажите пожалуйста как настроить iptables что бы соединения проходили, сейчас при попытке подключиться с локальных компьютеров выдает ошибку 619.

  13. Аватар

    Возник вопрос почему в настройке указано:

    $iptables -A INPUT -p all -m state —state ESTABLISHED,RELATED -j ACCEPT

    Гайд старый? Или я что то не понимаю. Вроде state устарел и теперь настройка идет через conntrack.

    $iptables -A INPUT -p all -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT

    • Zerox

      Если честно, я не слышал про то, что state устарел. Я всегда использую его в таком виде, как это приведено тут.

  14. Аватар

    подскажите пожалуйста, я настраивал шлюз на Centos по Вашей статье, eth0 на который приходит инет от провайдера, eth1-локальная сеть и раздает интернет по dhcp через dnsmasq, iptables я тоже взял за основу Ваш, только подставил свои айпи пи название интерфйесов,все работает исправно, теперь мне нужно что бы появилась вторая локальная сеть, настроил я точно так же eth2 как и eth1, такие же сделал конфиги в iptables и dnsmasq, eth1 раздает инет и работает dhcp, а на eth2 не то, не другое, но интерфейс пингуется с другого системника через свитч. что нужно сделать?

    • Zerox

      Нужно аккуратно проверить все конфиги и правила iptables. Убедиться, что все везде корректно настроено, разрешено. Добавить еще один сетевой интерфейс это дело техники, ничего особенного делать не надо, поэтому какого-то конкретного совета я дать не могу. К тому же не понятно, в чем конкретно проблема. Могу предположить, что либо dnsmasq не обслуживает новый интерфейс, либо nat не настроен в iptables.

  15. Аватар

    Подскажите пожалуйста, у вас была, если не ошибаюсь, статья как в Centos 7 можно перейти
    с запуска при старте системы программ с systemd на традиционный systemV init? Спасибо за статьи!

    • Zerox

      Нет, у меня такой статьи нету. Да я и не вижу в этом смысла. Сейчас все популярные дистрибутивы перешли на systemd.

  16. Аватар

    Кто может подробней объяснить

    # Внешний интерфейс
    export WAN=eth0
    export WAN_IP=109.126.13.246

    # Локальная сеть
    export LAN1=eth1
    export LAN1_IP_RANGE=192.168.88.46/24

    Что за адреса?

  17. Аватар

    Сделал все по статье

    из локалки пингую WAN интерфейс шлюза, дальше не идет
    со шлюза пингую ВСЕ и локалку и интернет

    [root@fw ~]# iptables -L -v -n
    Chain INPUT (policy ACCEPT 1 packets, 40 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
    8 681 ACCEPT all — ens224 * 0.0.0.0/0 0.0.0.0/0
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 3
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 11
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
    56 4286 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
    1 40 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 — ens192 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

    Chain FORWARD (policy ACCEPT 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 DROP all — * * 0.0.0.0/0 0.0.0.0/0 state INVALID
    0 0 ACCEPT all — ens224 ens192 0.0.0.0/0 0.0.0.0/0
    0 0 REJECT all — ens192 ens224 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

    Chain OUTPUT (policy ACCEPT 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
    3 180 ACCEPT all — * ens224 0.0.0.0/0 0.0.0.0/0
    37 9582 ACCEPT all — * ens192 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

    Пните плиз в нужном направлении

  18. Аватар
    Дмитрий

    а как прописывать в строчке где айпи адрес, если получаем динамику?
    # Внешний интерфейс
    export WAN=eth0
    export WAN_IP=109.126.13.246???

    • Zerox

      Получается никак :) Не нужно использовать ip адрес, настраивать все через имя интерфейса. Нужно будет немного изменить мой скрипт.

  19. Аватар
    Дмитрий

    Попрошу скрипт под динамику в студию))

    • Аватар
      Владимир

      Не нужно ничего изменять же. Переменная WAN_IP объявлена, но нигде не используется в скрипте, так что либо не трогать, либо закомментировать/удалить ее вовсе.

      За статью спасибо, прочитал с удовольствием.

  20. Аватар
    Алексей

    День добрый. Делал все по Вашему мануалу — базовая настройка работает. Спасибо. В linux новичек, не могу решить оставшиеся пару задач. А именно доступ из локалки наружу для определенного списка ip (остальные блокировать) и блок некоторых хостов. Точнее порядок правил в скрипте. С первым еще поковыряю ipset. А вот со вторым не понятно. Настройка ($IPT -A OUTPUT -d mamba.ru -j DROP) легла, но но шлюз и клиенты по прежнему имеют доступ.

    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
    613 58797 ACCEPT all — ens192 * 0.0.0.0/0 0.0.0.0/0
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 3
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 11
    0 0 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
    58 8006 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 — ens160 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

    Chain FORWARD (policy DROP 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    3416 1419K 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
    147 41433 ACCEPT all — ens192 ens160 0.0.0.0/0 0.0.0.0/0
    0 0 REJECT all — ens160 ens192 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
    543 104K ACCEPT all — * ens192 0.0.0.0/0 0.0.0.0/0
    63 4878 ACCEPT all — * ens160 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 all — * * 0.0.0.0/0 193.0.170.23
    0 0 DROP all — * * 0.0.0.0/0 193.0.170.24
    0 0 DROP tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW

    • Аватар
      Алексей

      Разобрался. И для блока сайтов и для блока пользователей использовал ipset. Правило нужно было прописать выше всех ACCEPT в FORWARD. Скрипт не прокатил — выкидывал ошибку, правил ручками iptabels. Все работает спасибо.

  21. Аватар

    Добрый день. Делал все по вашему конфигу. Centos 6.10. iptables работает. Еще у меня несколько провайдеров настроено и соответственно маршрутизация между локалкой и ними, и, соответственно, несколько строчек с натом. Вопрос следующий. Периодически пропадает интернет, и появляется только после того как я с клиентского компа сделают tracert ya.ru. как только проден хоп со шлюзом центоса — пинги появляются, интернет тоже. Помогите с проблемой. В момент пропадания связи, в логах блочится всё и вся:
    kernel: —FW—BLOCKIN=eth0.1 OUT=eth0.201 SRC=192.168.1.178 DST=87.250.250.242 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=50941 PROTO=ICMP TYPE=8 CODE=0 ID=512 SEQ=51475

    kernel: —IN—BLOCKIN=eth0.1 OUT= MAC=00:14:c2:60:cf:49:08:00:27:13:04:a9:08:00 SRC=192.168.1.178 DST=192.168.1.16 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=50940 DF PROTO=TCP SPT=4874 DPT=3128 WINDOW=64240 RES=0x00 SYN URGP=0

    • Zerox

      Интересная ситуация. Я сталкивался с подобным, но не помню, как решал проблему. Было тоже что-то неведомое. Связь появлялась после пинга с какой-то стороны.

  22. Аватар

    Добрый день. У меня вопрос: не могу понять смысл правила блокировки правила «Закрываем доступ снаружи в локалку» ($IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT ), если в по умолчанию все равно все пакеты, не подошедшие под ни одно правило отбрасываются ($IPT -P FORWARD DROP), тем более, что оно и так стоит в конце всех правил в цепочке FORWARD. Я так понял, что оба эти действия имеют смысл «заглушки». Почему они применяются здесь одновременно?

  23. Аватар

    A теперь по-русски:
    Добрый день. У меня вопрос: не могу понять смысл правила «Закрываем доступ снаружи в локалку» ($IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT ), если по умолчанию все равно все пакеты, не подошедшие ни под одно правило отбрасываются ($IPT -P FORWARD DROP), тем более, что оно и так стоит в конце всех правил в цепочке FORWARD. Я так понял, что оба эти действия имеют смысл «заглушки». Почему они применяются здесь одновременно?

  24. Аватар
    Аврил Лавин

    А iptables.service не должен быть поднят чтобы правила заработали?
    Запустил ваш скрипт, iptables -L -v -n показывает, что правила применились, логи о блокировках сыпятся.
    Но сервис dead и inactive:

    systemctl status iptables.service

    ● iptables.service — IPv4 firewall with iptables
    Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
    Active: inactive (dead) since Wed 2019-03-06 11:11:06 MSK; 16min ago

    При этом, повторюсь, правила работают.
    А как тогда временно отключить их? systemctl stop iptables.service не срабатывает по причине того, что сервис и так мертв.

    • Zerox

      Я точно не помню, но вроде сервис iptables отвечает за загрузку правил при старте системы. Чтобы очистить правила, достаточно выполнить команду
      iptables -F
      Эта команда удаляет все правила.

  25. Аватар
    тыжпрограммист

    Не удержался,
    Автор, не маньячь, почитай матчасть про iptables-restore и его преимущества от используемого Вами подхода. Проще, эффективнее и не будет запоротых удалённых сетевых экранов из-за синтаксических ошибок. Keep it easy

    • Zerox

      Я себе ни один не запорол. Меня этот скрипт устраивает на 100%. При чем тут iptables-restore? Это просто способ загрузить правила после старта сервера.

      На смену идет nftables, надо уже его изучать.

      • Аватар
        тыжпрограммист

        Добрый день, Zerox! Вы создаёте bash-скрипт и запускаете его:
        /etc/iptables.sh
        Может возникнуть такая ситуация, в случае синтаксической ошибки в строке N, часть строк, (N-1), выполнится, остальная часть скрипта выполнена не будет. Если админ сидит за NAT-ом, то он потеряет управление сервером.
        В случае c iptables-restore, команда выдаст предупреждение об ошибке и правила применены не будут. Это, получается, следствие второго момента:
        2. Команда «iptables-restore < your.file" выполняет ВСЕ правила за ОДИН присест, за одно обращение к iptables. В то время, как bash-скрипт обращается многократно

        • Zerox

          Не понял конечную идею. Скриптом сначала формировать набор правил, а потом их через iptables-restore загружать? Или что-то другое имеется ввиду?

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

          • Аватар
            тыжпрограммист

            Один раз на этапе настройки сервера создаём набор правил, руками, и с помощью
            iptables-save -t raw > your.file
            iptables-save -t mangle >> your.file
            iptables-save -t filter >> your.file

            Загружаем набор правил
            iptables-restore < your.file

            В дальнейшем после радактирования правил в файле your.file применяем изменения
            iptables-restore < your.file

  26. Аватар

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

  27. Аватар

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

    • Zerox

      Вот тут пример для обычного сервера — https://serveradmin.ru/centos-7-nastroyka-servera/#_firewall
      Надо только не забыть открыть еще 80 и 443 порт.

      • Аватар

        Большое спасибо. Все получилось. Было бы круто если присутствовали в статье несколько вариантов скриптов для того или иного сервера на выбор.

      • Аватар

        Как можно реализовать проброс по порту. Например 1 сеть вида 192.168.0.11 другая сеть 10.129.128.11 эти настройки прописаны на 1 сетевой карте. Пользователи из сети 192.168.0.* например набирающие 192.168.0.11:88 и попадали в сервисы 10.129.128.7:88

  28. Аватар

    Здравствуйте, вот мой сервер не давно задосили, в поддержке сказали что это обычный флуд от которого можно защититься средствами сервера, в числе которых был iptables. Эта статья ведь подходит чтобы защитить сервак от простого флуда? А то этот человек просто губит мой магазинчик (пока что открыт в тестовом режиме и дохода не приносит) небольшой, это ладно, но если будет губить связной сайт (с помощью которого раскручиваю этот магазинчик скажем так, на котором небольшие посещения, но необходимые для жизни в дальнейшем) то мне реально хана, я на позициях и так мизирных в поисковиках, а этот шакал губит мой сервер!

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

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.