Как настроить iptables для защиты компьютера с Linux от взлома
Хотя Linux славится своей надежностью и безопасностью, светить открытыми портами в сеть, где полно каккеров и прочих извращенцев — не самая хорошая идея. Рассмотрим как обнести все потенциально уязвимые отверстия огненной стеной.
[TOC Настройка IPTables]
Что такое iptables
Для этих целей добрые программисты запилили в Линукс фаейрвол iptables. Он быстр, надежен и бесплатен, однако, мало кто им пользуется по причине сложной и запутанной настройки. Интернет-издание Либератум первым в мире предлагает простой конфиг. Скописатил, запустил, забыл.
Как сохранять настройки iptables в Ubuntu и Debian
Но сначала небольшое отступление. Программа iptables устроена таким хитрым образом, что все сделанные настройки слетят при первой же перезагрузке. Поэтому неопытные админы стараются сохранить настройки в .sh-файле, а сами файлы раскидывают где попало. Мы не будем уподобляться этим наивным слепцам и сделаем все правильно. Есть программа, предоставляющая для iptables стандартный интерфейс Linux-сервиса и умеющая сохранять и восстанавливать правила. Имя ей — iptables-persistent.
apt-get install iptables-persistent
Вот теперь можно переходить к созданию правил для файервола. Все делается от имени суперпользователя.
Базовая настройка iptables
iptables -F
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
Этот конфиг предполагает следующее поведение:
- все входящие соединения выпиливаются — это для каккеров;
- все исходящие соединения устанавливаются — это для хозяина системы;
- пропускаются все уже установленные соединения;
- пропускается всё в обоих направлениях на интерфейсе lo;
- выпиливаются нулевые и syn-flood-пакеты — от пионеров;
- пропускаются входящие соединения на 22й порт (это для того, чтобы можно было зайти по ssh, а также для того, чтобы продемонстрировать как пользователь может самостоятельно открыть любой порт — нужно скопировать эту строку и заменить номер порта).
Теперь проверим, правильно ли iptables понял наши указания:
iptables -L -v
Получаем следующую картину:
iptables -L -v
Chain INPUT (policy DROP 3710 packets, 163K bytes)
pkts bytes target prot opt in out source destination
851 77161 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
2 80 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
3 180 ACCEPT all -- lo any anywhere anywhere
1 52 ACCEPT tcp -- any any anywhere anywhere tcp dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1017 packets, 424K bytes)
pkts bytes target prot opt in out source destination
Да, все верно. И что интересно, iptables уже показывает сколько пакетов удалось отбросить — policy DROP 3710 packets. То есть, не успели мы еще настроить всё как следует, а компьютер уже попытались отыметь каккеры — какое всё же опасное место этот ваш интернет!
Netfilter Persistent
Теперь сохраняем правила для последующего употребления:
iptables-save > /etc/iptables/rules.v4
И перезапустим сервис:
service iptables-persistent restart
Все, теперь девственности портов ничего не угрожает.
Примечание
В новых версиях Ubuntu и Debian служба iptables-persistent может называться netfilter-persistent.
Комментарии
Чингачгук
25 мая, 2014 - 17:30
А не легче воспользоваться UFW? Если хотите лёгкой жизни пишите правила в ufw.
pomodor
26 мая, 2014 - 16:17
Легче. Но легкая тропа не бывает правильной.
Синтаксис iptables очень сложен и требует несколько дней (или даже недель) на изучение и запоминание. Зато потом моя стоимость как Linux-специалиста увеличивается. Я могу прописать в резюме, что я конфигурирую iptables с закрытыми глазами и потребовать увеличения зарплаты на 5-10 тыс.
А что дает освоение UFW? Работодатель спрашивает: а что это такое? Я говорю, мол, это приблуда для неосиливших iptables. У работодателя справедливо возникает вопрос: соискатель хвастается, что не осилил iptables. Не придурок ли он? И речь о повышении зарплаты, как вы понимаете, уже не идет.
Чингачгук
27 мая, 2014 - 15:13
Мой работодатель не знает что такое iptables и его это не волнует, главное что бы всё работало. А за повышением зарплаты к нему если придти и открыть дверь в его кабинет, то увидишь картину маслом — двух метровая жаба душит шефа, он кричит просит помочь, но жаба не отпускает и похоже не отпустит уже некогда :(((
pomodor
29 мая, 2014 - 16:57
Чаще просматривайте вакансии. Особенно те, в которых написано, что знание iptables будет преимуществом/плюсом к зарплате.
Чингачгук
29 мая, 2014 - 19:12
Да какой из меня админ, я скорее просто опытный пользователь. Только шефу не говори :))) он верит что я профи, уволит нафиг, :((( а мне кредиты ещё платить.
Кстати iptables я однажды настраивал на рабочем роутере EdgeRouter Lite но было это уже давненько, там ведь как, один раз настроил и забыл навсегда. Микротик скоро докупят, опять вспоминать придётся, но там вроде админка получше, возможно правила прям через админку можно писать, а не как в EdgeRouter по ssh через терминал или встроенный тормозной терминал.
Чингачгук
6 сентября, 2016 - 10:19
Со страницы man руководства ufw:
«ufw не предназначен для обеспечения полной функциональности брандмауэра через свой командный интерфейс, но он предоставляет легкий способ добавления или удаления простых правил. Сейчас в большинстве случаев он используется для централизованных брандмауэров.»
Чингачгук
8 мая, 2015 - 21:44
to PomodorTheGreat: Спасибо еще раз за статьи, занес правила из статьи в iptables, кроме 22 порта, сижу тут экспериментирую. Сразу после создания правил остался без инета, тк заблокировался dnsmasq на 53 порту, из чего стало понятно что все работает как надо. Но по ssh я зашел на локальный сервер сервер без проблем, хотя 22 порт я не открывал. Так ведь не должно быть, так как флаг у tcp должен быть state NEW , или я чегото не понимаю? Локальная сеть простая, рутер и к нему два компа:
рутер(192.168.0.1) — мой комп(192.168.0.3)
|
сервер (192.168.0.6)
Чингачгук
8 мая, 2015 - 23:23
э.. поправка, 22 порт и не надо было открывать, это я стормозил. его же только сервер использует, а мой отвечает на одном из Registered ports в данном случае 40052
bob@boblin:~$ netstat -anlt
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:48910 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:30000 0.0.0.0:* LISTEN
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 192.168.0.2:40052 192.168.0.6:22 TIME_WAIT
tcp 0 0 192.168.0.2:698 192.168.0.6:2049 VERBUNDEN
tcp 0 0 192.168.0.2:33191 216.58.213.35:80 TIME_WAIT
tcp6 0 0 :::38603 :::* LISTEN
tcp6 0 0 :::111 :::* LISTEN
все равно не пойму почему прошел к серверу по ssh
pomodor
9 мая, 2015 - 18:04
А вы правила сохраняете? Что показывает iptables -L -n после перезагрузки?
pomodor
9 мая, 2015 - 18:05
Думаю, что-то всё же недопонимаете. Правило со state NEW используется для защиты от syn-flood и никакого отношения к 22 порту не имеет. Как-нибудь точнее распишу смысл указанных строчек, раз появился спрос.
jtad
9 мая, 2015 - 19:47
да я вообще тупой, ведь статус NEW получил пакет на стороне сервера, так как я делал запрос. Вот выдержка из туториала
Я работаю в rollout проектах, больше программистом, но последние события на работе заставляют меня искать другое место, хотел место администратора присмтортеть. Но смотрю что до админа мне как до китая пешком, я в простых то вещах путаюсь. Но с жду ваших статей, объясняете хорошо, концентрируете на важных деталях
pomodor
9 мая, 2015 - 19:48
С программиста на админа — это скорее даунгрейд. Не проще выучить что-нибудь востребованное из ЯП и искать работу программистом?
jtad
9 мая, 2015 - 20:06
Да ну даунгрейд, админ должен знать СТОЛЬКО, требования в объявлениях о приеме просто заоблачные. Я не совсем программист — создаю или изменяю пакеты для автоматической раздачи через SCCM, Netinstall и другие похожие, дорабатываю MSI файлы, к exe-шникам делаю враперы с помощью vb, powershell или autoit, иногда на c#. Основной софт для меня adminstudio. Так что я и не прогаммист в смысле этого слова, даже не знаю как определить. Не нашел после учебы место админа, а нашел вот такое и не знаю куда податься. Мало по малу расширяю знания по всем направлениям, изучаю яву между делом :)
pomodor
9 мая, 2015 - 20:54
Описанное выше больше на админство похоже. Тогда советую пройти хороший курс, набраться знаний и идти Linux-админом.
Чингачгук
7 мая, 2015 - 12:09
у меня вопрос: после правил
iptables -P INPUT DROP
разрешены только эти 2iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
для чего еще другие 3 дропа на инпут, ведь и так все запрещено??
pomodor
7 мая, 2015 - 16:46
А очень просто: iptables -P INPUT DROP не отбрасывает все входящие пакеты, а устанавливает политику. То есть, сначала пакет будет разобран по всей цепочке и если для него не будет найдено правило, сработает политика запрета. Внимание, вопрос: а зачем битый пакет разбирать по всей цепочке, если его можно отбросить сразу?
pomodor
7 мая, 2015 - 17:20
Ах да, что еще более важно. 22-й порт-то открыт и даже с iptables -P INPUT DROP на него можно слать испорченные пакеты, чтобы вызвать отказ в обслуживании. Вот «другие 3 дропа на инпут» как раз для предотвращения этого.
Я даже больше скажу. На рабочих Web-серверах я добавляю еще одно правило:
-A INPUT -p tcp -m connlimit --connlimit-above 4 --connlimit-mask 32 --connlimit-saddr -j REJECT --reject-with icmp-port-unreachable
Оно ограничивает количество подключений к порту. 4 штуки
в одни рукис одного IP. Без этого правила любой пионер на широком канале может открыть кучу параллельных соединений на какую-нибудь тяжелую страницу и вызвать маленький DoS.Чингачгук
4 октября, 2016 - 00:27
А мне кажется, что так Вы вставляете палки в колёса тем, кто сидит за натом. Например провайдерским. Может тяжёлую страницу облегчить? А то веб-серверы уже запарили ддосить мой нетбук своими тяжёлыми страницами. Открываешь очередную ссылку в новой вкладке, чтоб после дочитывания текущей прочитать, и начинается пошаговая стратегия, ибо в ОЗУ они уже не влазят.
jtad
7 мая, 2015 - 17:16
обалдеть , наконец то мне становится более-менее понятна техникa iptables. Еще нравится статья про отличия append от insert. Очень интересно, можно было бы ваши советы по iptables объеденить в отдельную тему.
pomodor
7 мая, 2015 - 17:22
Да, я тоже уже подумал об этом. Надо как-то систематизировать статьи, а то они довольно хаотично раскиданы по сайту.
jtad
7 мая, 2015 - 17:37
да и не только статьи, ответы на вопросы тоже очень познавательны. Обычно читаешь статью без комментов и такие бесценные объяснения просто упускаешь, а вместе с ними ингда и как раз то, что все разъясняет.
Чингачгук
30 сентября, 2016 - 17:56
Ну и где?
А то данный в посте набор, как я понял, требует коррекции и, прочтя всю тему с комментариями, я так и не понял, какой именно. Впишу правила — и заблокирую себе интернет и даже хелп не смогу найти)).
leserf50
8 июля, 2017 - 10:42
Поискал netfilter-persistent и iptables-persistent — нет их ни в репозиториях manjaro, ни в AUR. Нашёл только ufw и gufw. Может не надо?
Ещё раз пишу: я домашний пользователь и нигде не работаю.
leserf50
3 августа, 2017 - 12:44
А для чего мои и свои комменты удалили?
"Что теперь меня извращенцы с каккерами засрут?"
leserf50
7 августа, 2017 - 14:36
Вроде успокоился:
Ещё более успокоился с этим высказыванием на одном из форумов:
Кто что скажет об этом?
Texnoline
7 августа, 2017 - 14:52
Бред, ламера!
Фаер нужен по-дефолту, хоть на сервере, хоть на desktop, или на смарте/планшете и т.д.
Или ставить домашний шлюз, на малинке и там уже фильтровать! Дешево и сердито, получается!
Послезавтра решил, размять пальцы на малине, подцеплю холодильник и смартТВ, с медиа- сервером, посмотрю как будет работать, а отдельный "железный" фаер будет фильтровать более тяжелый трафик.
leserf50
5 февраля, 2018 - 21:29
Извиняюсь за столь поздний ответ, но это потому что на сайте до сих пор нет уведомлений!
Я хотел купить малинку, но мамка не разрешает (я же школьнег) Цитата: "Хочешь программировать, занимайся на ноуте, малинка для программеров, но нужно собирать из компонентов, не дайбох что-нибудь сломаешь".
Сейчас вернулся к Manjaro. В ubuntu пакет есть, а в Manjaro нет. Но есть ufw. Пойдёт для desktop? А ubuntu нестабильна, так что-нибудь и отвалится после оптимизации, конфликты пакетов, снесёт полсистемы и т. п.
pomodor
5 февраля, 2018 - 22:50
Что за глупости?
leserf50
5 февраля, 2018 - 23:21
Пардон, но после этого http://liberatum.ru/b/ubuntu-16.04-tuning-secrets Ubuntu падает ещё больше...
Не понимаю, как можно сидеть на таком дистрибутиве...
http://liberatum.ru/b/manjaro-linux-16.06-review
Или мнение о Manjaro у вас ухудшилось?
pomodor
5 февраля, 2018 - 23:27
Не знаю, у меня ничего не падает.
pomodor
5 февраля, 2018 - 23:29
Более того, писал несколько сложных Web-приложений, заказчик просил задеплоить на Ubuntu Server 16.04. Сначала я пытался отговорить, но потом из любопытства согласился. За полгода эксплуатации потребовалось 0 раз заходить по SSH и что-то чинить.
leserf50
5 февраля, 2018 - 23:44
Дак я не о серверах, а о desktop-пользователях, которых Manjaro удовлетворит чуть менее, чем полностью.
А в Ubuntu server нет вафли после установки, из коробки нет wpa-supplicant, wireless-tools, в результате не могу установить эти пакеты, нет сети. И так по кругу.
pomodor
5 февраля, 2018 - 23:46
А я и про десктоп, и про сервер под высокой нагрузкой.
Что как бы логично. Зачем на сервере вафля?
dpkg никто не отменял.
leserf50
5 февраля, 2018 - 23:52
Вы лучше скажите, вошёл ли Manjaro в пятёрку лучших, как указано в статье?
pomodor
6 февраля, 2018 - 00:03
12-е место: http://top.liberatum.ru/distro/manjaro
leserf50
6 февраля, 2018 - 00:12
Простите за мою :( тупость. Наверное нужно достичь совершеннолетнего возраста, чтобы здесь высказывать своё мнение.
pomodor
6 февраля, 2018 - 00:15
Вам кто-то мешает высказывать свое мнение?
Texnoline
6 февраля, 2018 - 06:50
А в чем спор?
leserf50
6 февраля, 2018 - 09:33
Пардон, я согласен, что Ubuntu стабильна, но только не на моём железе, заточенном под вантуз и прочую поприетарщину! А Manjaro удачно встал на это железо. Не больше и не меньше.
Texnoline
6 февраля, 2018 - 06:50
Говори, Маугли!?:) Свободная стая — услышит ТЕБЯ:)
leserf50
6 февраля, 2018 - 19:10
Пакета в репозиториях Manjaro нет (и, естесственно, других дистрибутивах Arch-based) Это просто скрипт, который читает текущие правила iptables и записывает их в файл + сервис (systemd), который при запуске (системы) восстаналивает из файла. Поэтому, я считаю, мне будет логичнее взять скрипт c github ,поместить в директорию /usr/share/netfilter-persistent/plugins.d и назначить сервис systemd.
pomodor
6 февраля, 2018 - 19:14
Не думаю, что стоит заимствовать подход из Debian-based-дистрибутива и распространять его на Arch-based. Лучше почитать Вики к Арчу, там про iptables исчерпывающий мануал. В частности, в нем говорится, что скрипт для systemd уже написан.
leserf50
6 февраля, 2018 - 19:26
О, точняк!;) Как я этого раньше не знал.
Texnoline
7 февраля, 2018 - 14:26
Читать и еще раз, читать мануалы! Поколение 21 века, не читает — а только видосы смотрит, отсюда вопросы все...
Чингачгук
24 декабря, 2018 - 03:18
Учебный условный пример настройки firewalld для домашнего компьютера:
# apt-get install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# firewall-cmd —permanent —add-port=80/tcp
# firewall-cmd —permanent —add-port=443/tcp
# firewall-cmd —permanent —add-port=8080/tcp
# firewall-cmd —permanent —add-port=21/tcp
# firewall-cmd —permanent —add-port=22/tcp
# firewall-cmd —permanent —add-port=3128/tcp
Как вы видите, здесь мы открываем порты: 80 443 8080 21 22 3128
Texnoline
25 декабря, 2018 - 11:30
Особо ленивые, могут элементарно использовать: gufw, там проще настроить несколько правил и читать состояние экрана.
Комментировать