На защиту сервера от внешних угроз в первую очередь встает межсетевой экран, который фильтрует входящий и исходящий траффик. Настройкой iptables - частного случая фаервола на CentOS я хочу заняться в данной статье, а также рассказать о его установке и отключении. Мое руководство не будет исчерпывающим, я рассмотрю лишь те аспекты, которые считаю наиболее важными и сам использую в своей работе.
Научиться настраивать 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 невозможно. Например, нельзя будет перезапустить фаервол:
# 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.
Зачем делать отдельное правило запрет форварда в локальную сеть из ван интерфейса, если по дефолту правило форварда стоит дроп.
Или я что-то не улавливаю?
Спасибо Вам, огромнейшее, всё внятно, доступно, по делу и методически выверено! Очень сильно помогли.
Добрый день. Возможно не по теме, но может приходилось сталкиваться. Есть сервер 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 эта ссылка не отрабатывает корректно.
Владимир, добрый день. Отличная материал! А у вас есть статья\пример по настройке файервола при использовании сервера для Астериска (CentOS7+Asterisk16).
Там нет никаких нюансов. Для подключения абонентов достаточно разрешить доступ к порту 5060. Но я бы 10 раз подумал, прежде чем открывал прямой доступ к астериску из интернета.
А правила же применяются сразу. Надо первым правилом оставить разрешение ssh и потом дропать.
В статье нужно поменять местами очистку: вначале -F (правила), потом -X (цепочки), потому что при наличии в цепочках правил будет ошибка.
прошу прощения, поспешил. удалите...
Автор!, случайно пролистал до коментов, увидел срач, вобщем пользуюсь твоим сайтом уже несколько лет, все понятно и доступно, респект и уважуха! Пиши дальше!
А в каком сегменте iptables нужно добавить правило для порта tcp 873 (бэкапить сервер через rsync) и какой синтаксис команды?
Спасибо!
Здравствуйте, Владимир.
А как вы настраиваете iptables в связке с docker? Чтобы они не мешали друг другу, чтобы при перезагрузке правил iptables не приходилось перезагружать и docker? В сети есть несколько рецептов, но все они не совсем полные на мой взгляд.
Поделитесь, пожалуйста, решением, если вы этим занимались.
Пример того, как надо взаимодействовать с докером в контексте iptables, можно посмотреть в отдельной статье - https://serveradmin.ru/zablokirovat-dostup-k-kontejneram-docker-iz-interneta/
Спасибо,отличная статья.Все подробно изложено.
Добрый день! Есть такой пакет iptables-persistent, для сохранения правил файрвола после перезагрузки. Вы его не используете по какой то причине?
Добрый день! Есть такой пакет iptables-persistent, для сохранения правил файрвола после перезагрузки. Вы его не используете по какой то причине? Или это чисто для Debian?
Он по сути делает то же самое, что и я в скрипте - сохраняет текущие правила фаервола, чтобы их потом загрузить при старте системы.
Доброго дня!
"Мы рассмотрим ситуацию, когда сервер является шлюзом в интернет для локальной сети" - а если сервер стоит в дата центре и напрямую выходит в интернет? тогда нужен другой скрипт - у вас случаем такого не завалялось? ;)
Вот здесь есть пример правил для этого случая. Там все значительно проще и правил меньше.
https://serveradmin.ru/centos-nastroyka-servera/#Nastraivaem_firewall
Я сам лично постоянно использую этот набор правил для серверов в датацентре.
Разобрался сам нужно было в /etc/sysconfig/network-scripts/ifcfg-ens160 прописать ещё DOMAIN=ваш домен.
Здравствуйте, не знал в какую статью написать подумал что может сюда лучше, проблема не пингуются компьютеры в сети по имени, с сервера centos 8 ping до ya.ru и т.п. идёт без проблем а к внутренним машинам не хочет только по IP. В resolv.conf прописаны наши внутренyие DNS, в iptables.sh разрешён udp 53 порт. Сам Centos пингуется и по IP и по имени. В чём ещё может быть проблема, где можно посмотреть?
Автор дятел, код нужно писать текстом, для копипаста
Не рассматриваешь вариант, что дятел ты?
https://t.me/srv_admin/321
Владимир, спасибо Вам за статьи, угораю с дятлов в комментах, которые клавиатуру осилить не в состоянии)) Делайте код текстом, пускай лишний раз сбегают в серверную, а может ещё и в тыкву получат, так усваивается лучше))
Так самое главное, что в конце все есть в отдельном текстовом файле. Но люди не хотят читать и понимать, они хотят сразу копипастить.
У тебя блок "Включение логов" вставлен картинкой.
В статье код - это картинки? серьёзно?)
https://prnt.sc/tx4r9i
https://t.me/srv_admin/321
Есть ли у кого идея, как лучше это реализовать? Всю голову сломал, а суть вот в чём: нужно разрешить подключаться из интернета к устройству в локальной сети, только с одного определённого IP адреса и только на заданные порты..Просто выполнить проброс - не проблема, а вот с этим пока туплю..Cent OS 8, фаерволл iptables.
В чем проблема то? Это реализуется штатно одним правилом проброса. Через ключ -s указывается адрес источника, для которого будет работать проброс.
Спасибо!!! Помогло.
Если я сижу за 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/
Добрый день, а как вы от syn флуда защищаетесь, если не секрет?) Что это за правило у вас в iptables?
Настроил шлюз по Вашей инструкции, все хорошо, но не работает проброс портов.
Заменил 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
Афтар, мог бы текст конфигов не делать картинками - копипастить людям проще, или ты хотел сумничать?
Специально для таких внимательных, как ты, это сделал, которые читают по диагонали, копипастят не задумываясь, а потом жалуются в комментариях, что доступ к серверу потеряли.
"Далее будем наполнять его необходимыми правилами. Я буду разбирать все значимые части скрипта, а полностью его приведу в виде текстового файла в конце статьи. Правила сделаны в виде картинок, чтобы запретить копирование и вставку. Это может привести к ошибкам в работе правил, с чем я сам столкнулся во время подготовки статьи."
Нужна помощь. Запутался в правах. Приобрели видеорегистратор, требуется пробросить к нему доступ в 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
По идеи должно все работать
Добрый день!
Подскажите, как открыть порты для подключения внешней базы данных?
Пытаюсь wordpress подключить к внешней базе.
Делал так - "Ошибка соединения БД"
iptables -I INPUT -p tcp --dport 3306 -m state --state NEW -j ACCEPT
systemctl restart iptables
Разобрался - надо было входящие и исходящие открывать!
Здравствуйте!
Большое спасибо за статью!
Есть один вопрос. Хочу ограничить доступ к серверу (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 адресов. Вот пример.
Доступ к 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
Ещё раз большое вам спасибо! :)
А то в iptables ни в зуб ногой...
$IPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 27000:27030 -j ACCEPT
для диапазона верная строка?
Здравствуйте, вот мой сервер не давно задосили, в поддержке сказали что это обычный флуд от которого можно защититься средствами сервера, в числе которых был iptables. Эта статья ведь подходит чтобы защитить сервак от простого флуда? А то этот человек просто губит мой магазинчик (пока что открыт в тестовом режиме и дохода не приносит) небольшой, это ладно, но если будет губить связной сайт (с помощью которого раскручиваю этот магазинчик скажем так, на котором небольшие посещения, но необходимые для жизни в дальнейшем) то мне реально хана, я на позициях и так мизирных в поисковиках, а этот шакал губит мой сервер!
Почитайте мои статьи на тему защиты от ddos. Там есть ответы на ваши вопросы. Методы подберете сами на основе своих знаний и возможностей:
https://serveradmin.ru/ddos-ataka-na-sajt-zashhita-ot-ddos/
https://serveradmin.ru/zashhita-web-servera-ot-ddos/
Доброго времени суток. Вы не могли бы выложить для примера готовый скрипт не для шлюза, а для 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
во многих инструкциях говорится о необходимости открытия 8080 порта для локалхоста, можете ли Вы это прокомментировать или если нужно, какой командой лучше это сделать (т.к. в сети много разных, противоречивых версий)?
Не удержался,
Автор, не маньячь, почитай матчасть про 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
А 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
A теперь по-русски:
Добрый день. У меня вопрос: не могу понять смысл правила "Закрываем доступ снаружи в локалку" ($IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT ), если по умолчанию все равно все пакеты, не подошедшие ни под одно правило отбрасываются ($IPT -P FORWARD DROP), тем более, что оно и так стоит в конце всех правил в цепочке FORWARD. Я так понял, что оба эти действия имеют смысл "заглушки". Почему они применяются здесь одновременно?
Добрый день. У меня вопрос: не могу понять смысл правила блокировки правила "Закрываем доступ снаружи в локалку" ($IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT ), если в по умолчанию все равно все пакеты, не подошедшие под ни одно правило отбрасываются ($IPT -P FORWARD DROP), тем более, что оно и так стоит в конце всех правил в цепочке FORWARD. Я так понял, что оба эти действия имеют смысл "заглушки". Почему они применяются здесь одновременно?
Добрый день. Делал все по вашему конфигу. 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
Интересная ситуация. Я сталкивался с подобным, но не помню, как решал проблему. Было тоже что-то неведомое. Связь появлялась после пинга с какой-то стороны.
День добрый. Делал все по Вашему мануалу - базовая настройка работает. Спасибо. В 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. Все работает спасибо.
Попрошу скрипт под динамику в студию))
Не нужно ничего изменять же. Переменная WAN_IP объявлена, но нигде не используется в скрипте, так что либо не трогать, либо закомментировать/удалить ее вовсе.
За статью спасибо, прочитал с удовольствием.
а как прописывать в строчке где айпи адрес, если получаем динамику?
# Внешний интерфейс
export WAN=eth0
export WAN_IP=109.126.13.246???
Получается никак :) Не нужно использовать ip адрес, настраивать все через имя интерфейса. Нужно будет немного изменить мой скрипт.
Сделал все по статье
из локалки пингую 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
Пните плиз в нужном направлении
Форвард пакетов между интерфейсами возможно не включен
# mcedit /etc/sysctl.conf
net.ipv4.ip_forward = 1
https://serveradmin.ru/nastroyka-shlyuza-dlya-lokalnoy-seti-na-centos-7/#_firewall_nat
Либо правило nat неверное. Посмотреть его можно так:
# iptables -L -v -n -t nat
Спасибо большое заработало
Кто может подробней объяснить
# Внешний интерфейс
export WAN=eth0
export WAN_IP=109.126.13.246
# Локальная сеть
export LAN1=eth1
export LAN1_IP_RANGE=192.168.88.46/24
Что за адреса?
Подскажите пожалуйста, у вас была, если не ошибаюсь, статья как в Centos 7 можно перейти
с запуска при старте системы программ с systemd на традиционный systemV init? Спасибо за статьи!
Нет, у меня такой статьи нету. Да я и не вижу в этом смысла. Сейчас все популярные дистрибутивы перешли на systemd.
подскажите пожалуйста, я настраивал шлюз на Centos по Вашей статье, eth0 на который приходит инет от провайдера, eth1-локальная сеть и раздает интернет по dhcp через dnsmasq, iptables я тоже взял за основу Ваш, только подставил свои айпи пи название интерфйесов,все работает исправно, теперь мне нужно что бы появилась вторая локальная сеть, настроил я точно так же eth2 как и eth1, такие же сделал конфиги в iptables и dnsmasq, eth1 раздает инет и работает dhcp, а на eth2 не то, не другое, но интерфейс пингуется с другого системника через свитч. что нужно сделать?
Нужно аккуратно проверить все конфиги и правила iptables. Убедиться, что все везде корректно настроено, разрешено. Добавить еще один сетевой интерфейс это дело техники, ничего особенного делать не надо, поэтому какого-то конкретного совета я дать не могу. К тому же не понятно, в чем конкретно проблема. Могу предположить, что либо dnsmasq не обслуживает новый интерфейс, либо nat не настроен в iptables.
Возник вопрос почему в настройке указано:
$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 устарел. Я всегда использую его в таком виде, как это приведено тут.
Здравствуйте, уважаемые!
Ситуация следующая:
Имеется не большая локальная сеть 10-15 компьютеров + сервер на ЦентОС 7
Интернет приходит по телефонной линии ---> dsl модем ---> сервер
Сервер получает интернет по pppoe соединению к провайдеру и раздает на локальные компьютеры.
Задача обеспечиль коректное функционирование vpn соединений с локальных компьютеров к серверу головного офиса в соседнем городе!
Имеется интернет адрес сервера + ключи и пароли для локальных пользователей.
Подскажите пожалуйста как настроить iptables что бы соединения проходили, сейчас при попытке подключиться с локальных компьютеров выдает ошибку 619.
vpn на чем построен? Какая реализация используется?
Привет, сделал под копирку, при выполнении скрипта выдает
/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.
Т.е. в iptables можно пробросить порт с eth0, на ip адрес локальной сети, имея на интерфейсе eth0, динамический белый ip ?
А почему нет? Можно. В данном случае не имеет принципиального значения, по dhcp получен адрес или нет.
спасибо!)
Здравствуйте, когда пытаюсь запустить скрипт iptables.sh пишет iptables v1.4.21: no command specified
В чем может быть проблема?
Возможно iptables-services не установлены.
А возможно заблокировать сети 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
Сделал вроде все верно, но теперь я не могу через 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 должен работать.
та же фигня))) пора в бан))
Порт 22 открыт, по нему пакеты идут. Все должно работать.
спасибо, все корректно вроде работает)
Только проброс портов не работает, что мешает?
Ну вот ничего не понял, что есть 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, поэтому мне проще, когда у меня есть универсальный инструмент для всех систем.
Отличный конфиг, всё очень подробно разобрано, взял ваш скрипт за основу.
Можете подсказать, настроил все по вашим инструкциям, поставил апач и никак не могу зайти на него с сервера, порты разрешил. В чем может быть проблема?
Очевидно, где-то ошибка :)
короче настроил все как пописано да включил серверную игру samp порт 777 порт в firewalld открыты но проверк кажет что порт закрыт на сайте
Зачем делать отдельное правило запрет форварда в локальную сеть из ван интерфейса, если по дефолту правило форварда стоит дроп.
Или я что-то не улавливаю?
Как обезопасить себя от потери доступа к удаленному серверу:
Используем для этих целей 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
Еще можно в cron команду сброса файрвола добавить перед запуском скрипта.
Удобнее использовать команду at для запуска запланированных задач.