Как настроить 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.

Комментарии

А не легче воспользоваться UFW? Если хотите лёгкой жизни пишите правила в ufw.

Легче. Но легкая тропа не бывает правильной.

Синтаксис iptables очень сложен и требует несколько дней (или даже недель) на изучение и запоминание. Зато потом моя стоимость как Linux-специалиста увеличивается. Я могу прописать в резюме, что я конфигурирую iptables с закрытыми глазами и потребовать увеличения зарплаты на 5-10 тыс.

А что дает освоение UFW? Работодатель спрашивает: а что это такое? Я говорю, мол, это приблуда для неосиливших iptables. У работодателя справедливо возникает вопрос: соискатель хвастается, что не осилил iptables. Не придурок ли он? И речь о повышении зарплаты, как вы понимаете, уже не идет.

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

Чаще просматривайте вакансии. Особенно те, в которых написано, что знание iptables будет преимуществом/плюсом к зарплате.

Да какой из меня админ, я скорее просто опытный пользователь. Только шефу не говори :))) он верит что я профи, уволит нафиг, :((( а мне кредиты ещё платить.
Кстати iptables я однажды настраивал на рабочем роутере EdgeRouter Lite но было это уже давненько, там ведь как, один раз настроил и забыл навсегда. Микротик скоро докупят, опять вспоминать придётся, но там вроде админка получше, возможно правила прям через админку можно писать, а не как в EdgeRouter по ssh через терминал или встроенный тормозной терминал.

у меня вопрос: после правил iptables -P INPUT DROP разрешены только эти 2
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

для чего еще другие 3 дропа на инпут, ведь и так все запрещено??

А очень просто: iptables -P INPUT DROP не отбрасывает все входящие пакеты, а устанавливает политику. То есть, сначала пакет будет разобран по всей цепочке и если для него не будет найдено правило, сработает политика запрета. Внимание, вопрос: а зачем битый пакет разбирать по всей цепочке, если его можно отбросить сразу?

обалдеть , наконец то мне становится более-менее понятна техникa iptables. Еще нравится статья про отличия append от insert. Очень интересно, можно было бы ваши советы по iptables объеденить в отдельную тему.

Ах да, что еще более важно. 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.

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

да и не только статьи, ответы на вопросы тоже очень познавательны. Обычно читаешь статью без комментов и такие бесценные объяснения просто упускаешь, а вместе с ними ингда и как раз то, что все разъясняет.

to PomodorTheGreat: Спасибо еще раз за статьи, занес правила из статьи в iptables, кроме 22 порта, сижу тут экспериментирую. Сразу после создания правил остался без инета, тк заблокировался dnsmasq на 53 порту, из чего стало понятно что все работает как надо. Но по ssh я зашел на локальный сервер сервер без проблем, хотя 22 порт я не открывал. Так ведь не должно быть, так как флаг у tcp должен быть state NEW , или я чегото не понимаю? Локальная сеть простая, рутер и к нему два компа:

рутер(192.168.0.1) — мой комп(192.168.0.3)
|
сервер (192.168.0.6)

э.. поправка, 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

А вы правила сохраняете? Что показывает iptables -L -n после перезагрузки?

Так ведь не должно быть, так как флаг у tcp должен быть state NEW , или я чегото не понимаю?

Думаю, что-то всё же недопонимаете. Правило со state NEW используется для защиты от syn-flood и никакого отношения к 22 порту не имеет. Как-нибудь точнее распишу смысл указанных строчек, раз появился спрос.

да я вообще тупой, ведь статус NEW получил пакет на стороне сервера, так как я делал запрос. Вот выдержка из туториала

Просто, как только трассировщик «увидел» первый (SYN) пакет, то присваивает ему статус NEW. Как только через трассировщика проходит второй пакет (SYN/ACK), то соединению присваивается статус ESTABLISHED.

Я работаю в rollout проектах, больше программистом, но последние события на работе заставляют меня искать другое место, хотел место администратора присмтортеть. Но смотрю что до админа мне как до китая пешком, я в простых то вещах путаюсь. Но с жду ваших статей, объясняете хорошо, концентрируете на важных деталях

С программиста на админа — это скорее даунгрейд. Не проще выучить что-нибудь востребованное из ЯП и искать работу программистом?

Да ну даунгрейд, админ должен знать СТОЛЬКО, требования в объявлениях о приеме просто заоблачные. Я не совсем программист — создаю или изменяю пакеты для автоматической раздачи через SCCM, Netinstall и другие похожие, дорабатываю MSI файлы, к exe-шникам делаю враперы с помощью vb, powershell или autoit, иногда на c#. Основной софт для меня adminstudio. Так что я и не прогаммист в смысле этого слова, даже не знаю как определить. Не нашел после учебы место админа, а нашел вот такое и не знаю куда податься. Мало по малу расширяю знания по всем направлениям, изучаю яву между делом :)

Описанное выше больше на админство похоже. Тогда советую пройти хороший курс, набраться знаний и идти Linux-админом.

Со страницы man руководства ufw:
«ufw не предназначен для обеспечения полной функциональности брандмауэра через свой командный интерфейс, но он предоставляет легкий способ добавления или удаления простых правил. Сейчас в большинстве случаев он используется для централизованных брандмауэров.»

Ну и где?
А то данный в посте набор, как я понял, требует коррекции и, прочтя всю тему с комментариями, я так и не понял, какой именно. Впишу правила — и заблокирую себе интернет и даже хелп не смогу найти)).

А мне кажется, что так Вы вставляете палки в колёса тем, кто сидит за натом. Например провайдерским. Может тяжёлую страницу облегчить? А то веб-серверы уже запарили ддосить мой нетбук своими тяжёлыми страницами. Открываешь очередную ссылку в новой вкладке, чтоб после дочитывания текущей прочитать, и начинается пошаговая стратегия, ибо в ОЗУ они уже не влазят.

Поискал netfilter-persistent и iptables-persistent — нет их ни в репозиториях manjaro, ни в AUR. Нашёл только ufw и gufw. Может не надо?

Ещё раз пишу: я домашний пользователь и нигде не работаю.

А для чего мои и свои комменты удалили?
"Что теперь меня извращенцы с каккерами засрут?"

Вроде успокоился:

Насколько рискованно заниматься серфингом в Интернете без брандмауэра с использованием Manjaro?
Обычно это не рискованно.
Linux не имеет кучи изворотливых портов, открытых для внешнего мира. Если программа не прослушивает какой-либо порт, порт закрывается так же плотно, без использования программного обеспечения брандмауэра. Закрытый порт — это безопасный порт.

Ещё более успокоился с этим высказыванием на одном из форумов:

Раньше пользовался ufw, но сейчас на ноутбуке нет никакого фаейрвола. Считаю, что на дом. компьютере можно и без него обойтись.

Кто что скажет об этом?

Раньше пользовался ufw, но сейчас на ноутбуке нет никакого фаейрвола. Считаю, что на дом. компьютере можно и без него обойтись.

Бред, ламера!
Фаер нужен по-дефолту, хоть на сервере, хоть на desktop, или на смарте/планшете и т.д.
Или ставить домашний шлюз, на малинке и там уже фильтровать! Дешево и сердито, получается!
Послезавтра решил, размять пальцы на малине, подцеплю холодильник и смартТВ, с медиа- сервером, посмотрю как будет работать, а отдельный "железный" фаер будет фильтровать более тяжелый трафик.

Извиняюсь за столь поздний ответ, но это потому что на сайте до сих пор нет уведомлений!
Я хотел купить малинку, но мамка не разрешает (я же школьнег) Цитата: "Хочешь программировать, занимайся на ноуте, малинка для программеров, но нужно собирать из компонентов, не дайбох что-нибудь сломаешь".
Сейчас вернулся к Manjaro. В ubuntu пакет есть, а в Manjaro нет. Но есть ufw. Пойдёт для desktop? А ubuntu нестабильна, так что-нибудь и отвалится после оптимизации, конфликты пакетов, снесёт полсистемы и т. п.

А ubuntu нестабильна, так что-нибудь и отвалится после оптимизации, конфликты пакетов, снесёт полсистемы и т. п.

Что за глупости?

Пардон, но после этого http://liberatum.ru/b/ubuntu-16.04-tuning-secrets Ubuntu падает ещё больше...
Не понимаю, как можно сидеть на таком дистрибутиве...

http://liberatum.ru/b/manjaro-linux-16.06-review
Или мнение о Manjaro у вас ухудшилось?

Не знаю, у меня ничего не падает.

Более того, писал несколько сложных Web-приложений, заказчик просил задеплоить на Ubuntu Server 16.04. Сначала я пытался отговорить, но потом из любопытства согласился. За полгода эксплуатации потребовалось 0 раз заходить по SSH и что-то чинить.

Ubuntu Server

Дак я не о серверах, а о desktop-пользователях, которых Manjaro удовлетворит чуть менее, чем полностью.
А в Ubuntu server нет вафли после установки, из коробки нет wpa-supplicant, wireless-tools, в результате не могу установить эти пакеты, нет сети. И так по кругу.

А я и про десктоп, и про сервер под высокой нагрузкой.

А в Ubuntu server нет вафли после установки

Что как бы логично. Зачем на сервере вафля?

в результате не могу установить эти пакеты, нет сети. И так по кругу.

dpkg никто не отменял.

Вы лучше скажите, вошёл ли Manjaro в пятёрку лучших, как указано в статье?

Простите за мою :( тупость. Наверное нужно достичь совершеннолетнего возраста, чтобы здесь высказывать своё мнение.

Вам кто-то мешает высказывать свое мнение?

Говори, Маугли!?:) Свободная стая — услышит ТЕБЯ:)

А в чем спор?

Пардон, я согласен, что Ubuntu стабильна, но только не на моём железе, заточенном под вантуз и прочую поприетарщину! А Manjaro удачно встал на это железо. Не больше и не меньше.

Пакета в репозиториях Manjaro нет (и, естесственно, других дистрибутивах Arch-based) Это просто скрипт, который читает текущие правила iptables и записывает их в файл + сервис (systemd), который при запуске (системы) восстаналивает из файла. Поэтому, я считаю, мне будет логичнее взять скрипт c github ,поместить в директорию /usr/share/netfilter-persistent/plugins.d и назначить сервис systemd.

Не думаю, что стоит заимствовать подход из Debian-based-дистрибутива и распространять его на Arch-based. Лучше почитать Вики к Арчу, там про iptables исчерпывающий мануал. В частности, в нем говорится, что скрипт для systemd уже написан.

О, точняк!;) Как я этого раньше не знал.

Читать и еще раз, читать мануалы! Поколение 21 века, не читает — а только видосы смотрит, отсюда вопросы все...

Учебный условный пример настройки 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

Особо ленивые, могут элементарно использовать: gufw, там проще настроить несколько правил и читать состояние экрана.

Комментировать

Filtered HTML

  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <strike> <code> <h2> <h3> <h4> <h5> <del> <img>
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.