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

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

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

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти вступительный тест.

Вступление

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

Видео

Онлайн курс "DevOps практики и инструменты"

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Проверьте себя на вступительном тесте и смотрите программу детальнее по ссылке.

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

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

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

    Поможешь?

  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. Я так понял, что оба эти действия имеют смысл «заглушки». Почему они применяются здесь одновременно?

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

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

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