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

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

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Данная статья является частью единого цикла статьей про сервер 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.

Видео

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

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

  1. Влад есетуки

    Зачем делать отдельное правило запрет форварда в локальную сеть из ван интерфейса, если по дефолту правило форварда стоит дроп.
    Или я что-то не улавливаю?

  2. Василий

    Спасибо Вам, огромнейшее, всё внятно, доступно, по делу и методически выверено! Очень сильно помогли.

  3. Аноним

    Добрый день. Возможно не по теме, но может приходилось сталкиваться. Есть сервер 1с 8.3.21.1624 на Centos 7, есть конфигурация Бухгалтерия Казахстан типовая(править ее не очень хочется). есть модуль обновления курса валют , в самом коде прописана ссылка откуда курсы валют подтягивать по http в веб варианте. На винде все работаеn так как там срабатывает редирект на https протокол и получаем файл с данными. На Centos 7 при обращение по http на сайт национального банка казахстана то получаем ошибку, если обращаемся по https по той же ссылке до данные получаем. проверял из консоли через curl с записью результата в файл.

    • Николай

      Продолжу, суть вопроса какая? Возможно ли на сервере запрос с http перенаправить на https на той стороне корректно его принял и выдал соответствующий результат. Данные получаем по этой ссылке http://www.nationalbank.kz/rss/get_rates.cfm?fdate=22.03.2023

    • Curl по умолчанию не следует редиректам, поэтому по http и не открывается. Добавьте ключ -L и обращение по http тоже сработает. Так что вариант, либо ключ к curl добавить, либо изменить сам запрос с http на https.

      • Николай.

        Это проблемы не решает при обращении из базы 1с, так как там жестко указана ссылка с http в коде и она записана в переменную.

        • Николай

          curl использовался чтобы понимать что сам сервер получает в ответ от сайта банка.

        • Я бы просто поменял эту ссылку в коде. В 1С это довольно просто сделать. Мне кажется, это будет быстрее, чем разобраться и понять, почему конкретно в Centos эта ссылка не отрабатывает корректно.

  4. Владимир, добрый день. Отличная материал! А у вас есть статья\пример по настройке файервола при использовании сервера для Астериска (CentOS7+Asterisk16).

    • Там нет никаких нюансов. Для подключения абонентов достаточно разрешить доступ к порту 5060. Но я бы 10 раз подумал, прежде чем открывал прямой доступ к астериску из интернета.

  5. А правила же применяются сразу. Надо первым правилом оставить разрешение ssh и потом дропать.

  6. В статье нужно поменять местами очистку: вначале -F (правила), потом -X (цепочки), потому что при наличии в цепочках правил будет ошибка.

  7. Автор!, случайно пролистал до коментов, увидел срач, вобщем пользуюсь твоим сайтом уже несколько лет, все понятно и доступно, респект и уважуха! Пиши дальше!

  8. А в каком сегменте iptables нужно добавить правило для порта tcp 873 (бэкапить сервер через rsync) и какой синтаксис команды?
    Спасибо!

  9. Дмитрий

    Здравствуйте, Владимир.

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

    Поделитесь, пожалуйста, решением, если вы этим занимались.

  10. Александр

    Спасибо,отличная статья.Все подробно изложено.

  11. Добрый день! Есть такой пакет iptables-persistent, для сохранения правил файрвола после перезагрузки. Вы его не используете по какой то причине?

    • Добрый день! Есть такой пакет iptables-persistent, для сохранения правил файрвола после перезагрузки. Вы его не используете по какой то причине? Или это чисто для Debian?

    • Он по сути делает то же самое, что и я в скрипте - сохраняет текущие правила фаервола, чтобы их потом загрузить при старте системы.

  12. Доброго дня!
    "Мы рассмотрим ситуацию, когда сервер является шлюзом в интернет для локальной сети" - а если сервер стоит в дата центре и напрямую выходит в интернет? тогда нужен другой скрипт - у вас случаем такого не завалялось? ;)

  13. Разобрался сам нужно было в /etc/sysconfig/network-scripts/ifcfg-ens160 прописать ещё DOMAIN=ваш домен.

  14. Здравствуйте, не знал в какую статью написать подумал что может сюда лучше, проблема не пингуются компьютеры в сети по имени, с сервера centos 8 ping до ya.ru и т.п. идёт без проблем а к внутренним машинам не хочет только по IP. В resolv.conf прописаны наши внутренyие DNS, в iptables.sh разрешён udp 53 порт. Сам Centos пингуется и по IP и по имени. В чём ещё может быть проблема, где можно посмотреть?

  15. Автор дятел, код нужно писать текстом, для копипаста

    • Не рассматриваешь вариант, что дятел ты?
      https://t.me/srv_admin/321

      • Демьян

        Владимир, спасибо Вам за статьи, угораю с дятлов в комментах, которые клавиатуру осилить не в состоянии)) Делайте код текстом, пускай лишний раз сбегают в серверную, а может ещё и в тыкву получат, так усваивается лучше))

        • Так самое главное, что в конце все есть в отдельном текстовом файле. Но люди не хотят читать и понимать, они хотят сразу копипастить.

      • У тебя блок "Включение логов" вставлен картинкой.

  16. В статье код - это картинки? серьёзно?)

    https://prnt.sc/tx4r9i

  17. Есть ли у кого идея, как лучше это реализовать? Всю голову сломал, а суть вот в чём: нужно разрешить подключаться из интернета к устройству в локальной сети, только с одного определённого IP адреса и только на заданные порты..Просто выполнить проброс - не проблема, а вот с этим пока туплю..Cent OS 8, фаерволл iptables.

  18. Андрей

    Если я сижу за NAT смысла в настройке iptables нет?

    • Есть. Все зависит от ситуации. С помощью фаервола не только от интернета закрываются.

      • Андрей

        Так вроде работает но почему то после запуска скрипта выдает:
        root@debian:~# ./iptables.sh
        Bad argument `MASQUERADE'
        Try `iptables -h' or 'iptables --help' for more information.
        root@debian:~# iptables -t nat -L -v -n
        Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
        pkts bytes target prot opt in out source destination

        Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
        pkts bytes target prot opt in out source destination

        Chain POSTROUTING (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

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

    • Я тоже раньше так думал. Пока не наткнулся на статью.
      https://habr.com/ru/post/134638/

  19. Добрый день, а как вы от syn флуда защищаетесь, если не секрет?) Что это за правило у вас в iptables?

  20. Владимир

    Настроил шлюз по Вашей инструкции, все хорошо, но не работает проброс портов.
    Заменил IP из Вашего примера, но по RDP так и не дает подключиться.
    iptables -L -v -n

    Chain INPUT (policy DROP 13 packets, 925 bytes)
    pkts bytes target prot opt in out source destination
    8 1116 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
    2984 1326K ACCEPT all -- enp2s1 * 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
    1734 269K 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 -- enp4s3 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3390
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:465
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:995
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:993
    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
    0 0 ACCEPT udp -- enp4s3 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53

    Chain FORWARD (policy DROP 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    1730 537K 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 tcp -- enp4s3 * 0.0.0.0/0 10.1.1.106 tcp dpt:3389
    42 2177 ACCEPT all -- enp2s1 enp4s3 0.0.0.0/0 0.0.0.0/0
    0 0 REJECT all -- enp4s3 enp2s1 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
    8 1116 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
    3387 328K ACCEPT all -- * enp2s1 0.0.0.0/0 0.0.0.0/0
    2784 1323K ACCEPT all -- * enp4s3 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

  21. Афтар, мог бы текст конфигов не делать картинками - копипастить людям проще, или ты хотел сумничать?

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

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

  22. Володя

    Нужна помощь. Запутался в правах. Приобрели видеорегистратор, требуется пробросить к нему доступ в VPN, причем все устройства из VPN пингуются, кроме видеорегистратора. Для этого написал правило:

    $IPT -A INPUT -s 10.3.3.0/24 -p tcp -m multiport --dports 8000,554 -j ACCEPT
    $IPT -A INPUT -s 10.3.3.0/24 -p udp -m multiport --dports 8000,554 -j ACCEPT

    где 10.3.3.0 - VPN сеть, а 8000 и 554 порты видеорегитратора.
    вывод iptables -L -n -v не показывает порты ни в блокируемых, ни в открытых. Так же как и netstat -tnupl | grep 8000 (554) ничего нет.
    Подскажите где я накосячил

    • Доступ в vpn это не только правила фаервола, но и маршрутизация. Проверяйте все. У регистратора должны быть маршруты в vpn сеть, как и у других устройств из vpn маршруты до регистратора.

      • Володя

        так, как мне надо что бы любой клиент мог войти на регистратор мог войти любой клиент, пробовал делать так:
        $IPT -t nat -A PREROUTING -d 10.3.3.0/24 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 192.168.0.160:8000
        $IPT -t nat -A POSTROUTING -d 192.168.0.160 -p tcp -m tcp --sport 8000 -j SNAT --to-source 10.3.3.0/24

        либо есть где-то то что блокирует, либо я не до конца разобрался с пробросом. поэтому и прошу совета

      • Володя

        и вообще я в Iptables для VPN прописал
        # Разрешаем OpenVPN
        $IPT -A INPUT -p all -i tun+ -j ACCEPT
        $IPT -A OUTPUT -p all -o tun+ -j ACCEPT
        $IPT -A FORWARD -p all -i tun+ -j ACCEPT

        Разрешаем доступ между сети и vpn
        $IPT -A FORWARD -p all -i $LAN1 -o tun+ -j ACCEPT
        $IPT -A FORWAED -p all -o $LAN1 -i tun+ -j ACCEPT

        По идеи должно все работать

  23. Добрый день!
    Подскажите, как открыть порты для подключения внешней базы данных?
    Пытаюсь wordpress подключить к внешней базе.

    Делал так - "Ошибка соединения БД"

    iptables -I INPUT -p tcp --dport 3306 -m state --state NEW -j ACCEPT
    systemctl restart iptables

  24. Здравствуйте!
    Большое спасибо за статью!
    Есть один вопрос. Хочу ограничить доступ к серверу (CentOS7). На сервере крутятся несколько программ для мониторинга сети; доступ к интерфейсам программ - через вэб-интерфейс с паролем. У сервера - два интерфейса: первый - с "белым" адресом (через него осуществляется доступ к страницам), второй - "серым" (через него осуществляются snmp-запросы к мониторируемому оборудованию). В логах httpd - множество записей типа:
    ..."POST /415.php HTTP/1.1" 404 205...
    ..."POST /ffr.php HTTP/1.1" 404 205...
    Ломятся, в основном, с китайских IP. Я так понимаю, что подыскивают уязвимость через php-скрипт.
    В тексте вашей статьи касаемо блокировок адресов указано:
    "Следом за этими правилами рекомендуется поставить правила на запрет доступа с определенных IP, если у вас имеется такая необходимость. Например, вас задолбал адрес 84.122.21.197 брутом ssh. Блокируем его:
    $IPT -A INPUT -s 84.122.21.197 -j REJECT"
    А, если, скажем, мне нужно в принципе режектить любые запросы с определённых IP? Я так понимаю, что нужно изменить параметр -s, но на что? Подскажите, пожалуйста?..
    Спасибо!

    • Сделайте проще - откройте http порт только для ограниченного списка ваших ip адресов. Вот пример.

      export HTTP_ALLOW=77.38.225.139,94.145.151.246,133.21.15.74
      $IPT -A INPUT -i $WAN -s $HTTP_ALLOW -p tcp --dport 80 -j ACCEPT

      Доступ к http порту будут иметь только ip адреса 77.38.225.139 94.145.151.246 133.21.15.74.

      • Спасибо!
        Да, я понимаю, что проще разрешить что-то конкретное, чем выцеплять и блокировать ненужное... Но, к сожалению, не знаю, откуда и кому может внезапно понадобиться мой сервер, например, если кто-то (у кого есть доступ) пожелает подключиться с мобильного телефона: пулов адресов мобильных операторов я не знаю...
        Но всё равно спасибо за подсказку - утащил в закладки! :)

      • Ну а в общем случае, если мне нужно блокировать доступ с интернетов к сайту, то строку
        $IPT -A INPUT -s 84.122.21.197 -j REJECT
        необходимо будет заменить на
        $IPT -A INPUT -i $WAN -s 84.122.21.197 -p tcp --dport 80 -j REJECT
        Верно я понимаю?

        • Да, верно, если хотите заблокировать доступ только к 80-му порту. Но если уж вы хотите блокировать тех, кто пытается ваши скрипты сканить на уязвимости, имеет смысл блокировать полностью все, как показано в моем примере
          $IPT -A INPUT -s 84.122.21.197 -j REJECT

  25. Александр

    $IPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 27000:27030 -j ACCEPT
    для диапазона верная строка?

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

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

    • Вот тут пример для обычного сервера - 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. во многих инструкциях говорится о необходимости открытия 8080 порта для локалхоста, можете ли Вы это прокомментировать или если нужно, какой командой лучше это сделать (т.к. в сети много разных, противоречивых версий)?

  29. тыжпрограммист

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

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

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

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

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

        • Не понял конечную идею. Скриптом сначала формировать набор правил, а потом их через 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

  30. Аврил Лавин

    А 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 не срабатывает по причине того, что сервис и так мертв.

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

    • systemctl enable iptables.service
      systemctl start iptables.service

  31. Сергей

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

  32. Сергей

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

  33. Михаил

    Добрый день. Делал все по вашему конфигу. 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

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

  34. Алексей

    День добрый. Делал все по Вашему мануалу - базовая настройка работает. Спасибо. В 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. Все работает спасибо.

  35. Дмитрий

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

    • Владимир

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

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

  36. Дмитрий

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

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

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

    из локалки пингую 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

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

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

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

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

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

  39. Сергей

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

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

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

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

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

    $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

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

  42. Кирилл

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

  43. Владимир

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

    /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: команда не найдена

    Поможешь?

    • Владимир

      Разобрался!

      • Аврил Лавин

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

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

  44. Николай

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

  45. Дмитрий

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

  46. Валерий

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

    • Обычно это делают средствами прокси серверов, не 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

  47. Сергей

    Сделал вроде все верно, но теперь я не могу через 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
  48. Аноним

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

  49. Андрей

    Ну вот ничего не понял, что есть 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, поэтому мне проще, когда у меня есть универсальный инструмент для всех систем.

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

  51. Анатолий

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

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

    • Зачем делать отдельное правило запрет форварда в локальную сеть из ван интерфейса, если по дефолту правило форварда стоит дроп.
      Или я что-то не улавливаю?

  53. Как обезопасить себя от потери доступа к удаленному серверу:
    Используем для этих целей 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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar