Настройка межсетевого экрана linux

Обновлено: 07.07.2024

Не так важно, поставили вы себе Linux, чтобы стать со временем хакером-грозой Пентагона или, напротив, чтобы надежнее защитить свой компьютер от несанкционированного вторжения, вам предстоит изучить несколько несложных настроек и познакомиться с программами, которые помогают шифровать данные и сохранять конфиденциальность при работе в сети. Безопасность операционной системы Linux не вызывает сомнений, однако и при работе с ней вам придется приложить некоторые усилия, чтобы уберечься от злоумышленников. В этой статье мы коснемся некоторых аспектов сетевой безопасности: использования vpn, Tor Browser в Linux, смены DNS-адресов, и расскажем про настройку в Linux firewall.

Зачем устанавливать vpn на Linux

Для пользователей Linux, желающих скрыть IP-адрес, у нас есть отдельная статья, где мы пошагово рассказываем, как установить впн на Linux. Скажем сразу – мы считаем установку vpn обязательным условием безопасности вашего компьютера. Каждый день вы посещаете десятки сайтов, оставляя на них ваши данные, которые становятся доступными администраторам. Имея на руках ваш IP, вам могут как запретить доступ к ресурсам, так и использовать его для проникновения уже на ваш компьютер, если вы чем-то заинтересуете злоумышленников. Большую опасность несет в себе и работа с устройства Linux в незащищенных wi-fi сетях. Никогда не решайте важные финансовые и рабочие вопросы, подключившись к публичному wi-fi без защиты впн-программы!

Интернет-провайдеру тоже ни к чему знать, где вы бываете и что там делаете. Vpn для Linux поможет зашифровать данные и скроет от глаз провайдера посещаемые вами сайты. Таким образом, соединяясь через впн-серверы, вы сможете без проблем заходить даже заблокированные вашим провайдером (к примеру, по запросу Роскомнадзора) интернет-ресурсы. То же и с блокировкой по географическому положению – youtube, Netflix, другие подобные ресурсы очень любят прятать самые интересный контент от неугодных им стран. Но с впн на Linux эти запреты не для вас.

Про установку vpn на Linux читайте здесь, а мы лишь напомним, как включить openvpn на Linux, если он уже установлен, и как отключить, если вы готовы вернуться к своему реальному IP.

Подключаемся к выбранному конфигу openvpn, указав в –config путь до файла конфигурации необходимого сервера:

sudo openvpn --config ./Whoer_Netherlands_nl.ovp n

Чтобы проверить, что IP-адрес сменился, введите:

Чтобы отключить vpn в Linux:

sudo service openvpn stop

Обратите внимание на то, что vpn-подключение может идти по TCP или UDP-протоколу. О разнице между ними и том, какой выбрать в каком случае, вы можете подробно прочесть здесь, скажем лишь, что UDP немного более быстрый, хоть и не такой надежный. А как отредактировать ваши openvpn-конфиги для Linux и сменить протокол, мы показываем в видео-ролике на ютьюб Меняем TCP на UDP в OpenVPN. Также вы можете при редактировании конфигов отключить некоторые из IP-адресов страны, оставив только необходимые вам. Как это сделать, упоминается в видео Как использовать Whoer VPN в клиенте OpenVPN.

Возможно, вам удобнее будет подключать vpn на Linux через графическое приложение GNOME. Как установить его смотрите в видео Как установить графическое приложение VPN на Linux.

Как сменить DNS в Linux

После того, как вы сменили в Linux IP-адрес, вам нужно произвести замену DNS. О том, что такое DNS, и зачем его менять, можно прочесть в нашей статье или посмотреть видео на нашем youtube-канале Зачем менять DNS. Если кратко – DNS-сервер, к которому подключается ваш компьютер, раскрывает ваше географическое положение, что может привести к блокировкам по геоданным, либо из-за несоответствия IP-данных и DNS-адресов.

Сменить DNS-адрес в Linux системе можно двумя способами. К примеру, вы можете сделать это через интерфейс сетевых подключений: кликайте мышкой на значок сети, выбирайте подключенную сеть и открывайте параметры соединения.

В Настройках сети переходите во вкладку “IPv4”. Далее выбирайте автоматический метод и в поле DNS прописывайте адрес сервера. Адреса быстрых DNS-серверов вы можете найти в нашем блоге в статье Рекомендуемые публичные DNS сервера. Несколько адресов прописываются через запятую.

Если этот способ не сработал, попробуйте сменить DNS через терминал Linux. Как это сделать, мы пошагово рассказываем в видеоролике на нашем канале Как настроить DNS в Linux.

Как пустить vpn через TOR в Linux

TOR Browser совершенно необходим, если вы решили прогуляться по загадочному миру .onion сайтов, но и в качестве безопасного браузера, дающего дополнительный уровень анонимности, TOR для Linux неизменно популярен среди пользователей. Особенно, если настроить одновременное использование TOR с vpn на Linux. Настройка подобной цепочки позволяет на порядок повысить анонимность и конфиденциальность, поскольку скрывает от посещаемых сайтов сам факт использования TOR Browser.

Настройка firewall в Linux Ubuntu

Firewall, по-русски называемый межсетевым экраном или брандмауэром, занимает важное место в защите системы Linux. Файрвол Linux это пропускной пункт между внутренней и внешней сетью, в котором происходит контроль и управление входящим и исходящим сетевым трафиком. Правила контроля задаются пользователем в интерфейсе межсетевого экрана: здесь он решает, какие порты открыть и какие соединения разрешить.

Разработчики программ для Linux всерьез озабочены защитой операционной системы от несанкционированных вторжений: для скачивания и установки в дистрибутивы Linux доступны десятки брандмауэров с открытым исходным кодом. Но далеко ходить не нужно: встроенная изначально во всех дистрибутивах Linux файрвол-утилита Iptables отлично минимизирует риск хакерских атак и заражения вирусами. При попытке установления соединений с ПК, утилита обращается к своим правилам для проверки того, является ли соединение разрешенным или его следует запретить. Если по соединению нет информации – оно выполняется по умолчанию. Кроме этого, Iptables поможет выполнить резервное копирование и восстановление с файлами.

Если вдруг файрвола Iptables не обнаружилось в вашем дистрибутиве, или вы хотите обновить утилиту, введите следующую команду:

sudo apt-get install iptables

Iptables – первая линия системы безопасности Linux и любимец сетевых администраторов. Настраивается данный Linux файрвол через командную строку при помощи установленных команд. Проблема в том, что начинающему юзеру процесс контроля за поступлением и отправлением трафика бесчисленными командами iptables может показаться слишком сложным. К счастью, существует интерфейс, специально разработанный для упрощения процесса настройки утилиты Iptables: UFW (Uncomplicated Firewall или по-русски «простой брандмауэр»). Кстати, в Linux Ubuntu UFW встроен также по умолчанию. А если вы его удалили, то можете заново загрузить, введя в консоли:

sudo apt install ufw

Мы пошагово показываем настройку Uncomplicated Firewall Linux в нашем видео Как настроить фаервол в Ubuntu.

Заключение

Это лишь некоторые аспекты безопасного использования устройств с операционной системой Linux, но на первое время вам будет их достаточно, чтобы спокойно пользоваться компьютером и выходить в сеть. Не забывайте также своевременно обновлять программное обеспечение и устанавливайте только сильные пароли – из не менее 8 букв разного регистра, цифр и специальных знаков. Ну и, так как человеческий фактор – обычно самое слабое звено в цепи безопасности, посмотрите наше видео про то, Как хакеры используют Социальную Инженерию.

Читайте наши статьи, подписывайтесь на социальные сети и youtube-канал, и помните, что мы всегда стоит на страже вашей безопасности и конфиденциальности в сети!

Для новичков и продвинутых пользователей операционный системы Линукс был разработан специальный межсетевой экран (так называемый «файрвол») для защиты от угроз извне, который носит имя Iptables. Ниже в инструкции мы объясним, как его установить и настроить на любых машинах под ОС Linux.

Что представляет собой Iptables

Данная утилита – это надежный межсетевой экран, минимизирующий риск вирусных и хакерских атак. Процесс настройки файрвола происходит через командную строку при помощи установленных команд, которые позволяют юзеру самостоятельно контролировать поступление и отправление трафика. При попытке установки соединений с ПК, утилита обращается к своим правилам и проверяет, пропустить или ограничить соединение. В случае, когда никакого конкретного правила не выставлено, действия проходят по умолчанию.

Файрвол предусмотрен стандартно во всех операционных системах Линукс. Для установки, если его внезапно не оказалось в сборке, или обновления следует применить такую команду:

sudo apt-get install iptables

Альтернативой данной утилите может послужить Firestarter – он имеет графический интерфейс и разработан специально для пользователей, которые испытывают трудности с работой через командную строку.

В случае настроек Iptables по удаленному SSH-соединению, пользователю следует проявлять аккуратность: одно ошибочное правило способно прервать подключение и запретить юзеру доступ к удаленной машине.

Какие бывают правила

Для легкой работы с файрволом разработана тройка основных правил (команд):

1.Input.

Правило применяется, когда необходимо контролировать входящий трафик. Например, когда юзер подключается к удаленному серверу по протоколу Secure Shell, файрвол начнет сравнивать его айпи с другими айпи из своего списка. В зависимости от результата, то есть от наличия в списке запретов, доступ пользователю будет открыт или закрыт.

2.Forward.

3.Output.

Правило применяется к исходящим соединениям. Например, юзер хочет проверить пинг к одному из заданных сайтов – утилита вновь сверится со своими правилами из списка и определит, как поступить при пинге веб-сайта: разрешить или запретить.

Делая ping к внешнему хосту, машина не только отправляет пакет, но и дожидается обратного ответа. Поэтому, настраивая Iptables, не нужно забывать о наличии двухсторонних коммуникаций и запрещать подключение к серверам через протокол SSH.

Как определиться с назначением файрвола

Перед тем, как заниматься настройкой утилиты, потребуется разобраться с ее предназначением, а именно – действующими цепочками правил, то есть то, что она будет делать по умолчанию. Как отреагировать, когда запрашиваемые соединения не подходят ни к одному правилу?

Для начала потребуется понять, какие из настроек межсетевого экрана уже установлены. Для этого применяется команда –L:

Настройки межсетевого экрана

Скриншот №1. Настройки межсетевого экрана

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

Если в процессе эксплуатации Iptables конфигурация была кем-то изменена, значения могут стоять другие. Проверить это можно за пару секунд, достаточно ввести команды:

iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT iptables --policy FORWARD ACCEPT

Правильнее будет заблаговременно разрешить все входящие/исходящие подключения, после чего выставлять запреты под конкретный порт и айпи-адрес.

Можно поступить диаметрально противоположным методом: установить запрет на все соединения, после чего давать разрешения только некоторым из них. Это можно реализовать таким способом:

iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP

Что делать с соединением

Настроив поведение утилиты, которое будет происходить автоматически, следует приступать к правилам, обрабатывающим входящий/исходящий трафик. Основные способы взаимодействия с трафиком:

Accept – разрешение определенного соединения;

Drop – игнорирование запросов (межсетевой экран продолжает свое функционирование, будто никакого запроса не происходило, а запрашивающие ресурсы не узнают об игнорировании);

Пример того, как будет выглядеть ping для

Разрешенного соединения (Accept):

Ping для разрешенного соединения

Скриншот №2. Ping для разрешенного соединения

Проигнорированного трафика (Drop):

Ping для проигнорированного трафика

Скриншот №3. Ping для проигнорированного трафика

Отклоненного подключения (Reject):

Ping для отклоненного подключения

Скриншот №4. Ping для отклоненного подключения

Разрешение и блокировка указанных соединений Iptables

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

Воспользуемся командой –А. Она позволит добавить новое правило к уже имеющейся цепочке. Межсетевой экран начинает проверку с самого верха, проходя по каждому из правил до тех пор, пока не обнаружит совпадения или не закончит список.

В случае, когда необходимо разместить правила в определенное место (перед каким-то определенным), следует воспользоваться командой:

iptables -I [цепочка] [номер позиции по списку для нового правила]

Что делать с соединениями от одного айпи

Для блокировки трафика, поступающего из одного и того же источника (например, айпи 120.120.120.120) подойдет команда:

iptables -A INPUT -s 120.120.120.120 -j DROP

Для блокировки трафика, поступающего с нескольких айпишников в определенном диапазоне, следует воспользоваться стандартной записью масок посредством слэша:

iptables -A INPUT -s 120.120.120.0/24 -j DROP

Либо записью необходимого диапазона:

iptables -A INPUT -s 120.120.120.0/255.255.255.0 -j DROP

Подключения к определенному порту

Следующая команда сделает блокировку соединений типа Secure Shell с хостом 120.120.120.120:

iptables -A INPUT -p tcp --dport ssh -s 120.120.120.120 -j DROP

На месте Secure Shell допустимо применение любого протокола. После команды –р указывается тип подключений, в данном случае – TCP. В случае, когда используется другой тип, следует указывать его.

Любому айпишнику будет запрещено подключаться к машине по Secure Shell соединению, если выполнить:

iptables -A INPUT -p tcp --dport ssh -j DROP

О состояниях соединения

Существует множество протоколов, которым требуется двусторонняя коммуникация. К примеру, пользователю понадобилось поработать с SSH-соединением, ему придется внести правило сразу и в Output, и в Input.

Что делать, если юзер хочет предоставить разрешение исключительно входящему соединению? В этом случае поможет состояние соединения. Оно даст возможность пользователю описать любую двустороннюю коммуникацию, в которой разрешено подключение заданного направления.

Разрешим соединение типа SSH, приходящее через хост 120.120.120.120. Система будет отправлять данные по этому протоколу только, если сессия установлена.

iptables -A INPUT -p tcp --dport ssh -s 120.120.120.120 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 120.120.120.120 -m state --state ESTABLISHED -j ACCEPT

Как сохранить изменения в конфигурации файрвола

После всех изменений, которые мы внесли в цепочку межсетевого экрана, понадобится их сохранение. Иначе перезапуск утилиты удалит проделанные нами настройки. Команда сохранения будет различаться от дистрибутива к дистрибутиву Линукс.

Для Убунту команда выглядит так:

Для Red Hat и CentOS:

=/sbin/service iptables save

Дополнительно

Чтобы вывести сконфигурированное ранее правило:

Чтобы просмотреть данные о входящих/исходящих пакетах и трафике, достаточно добавить ключ –v.

Данные об имени хоста, протоколах, сетях появятся в цифровом виде, если дописать в команду –n.

В статье рассмотрена настройка межсетевого экрана с контекстной фильтрацией (stateful firewall) посредством iptables, с описанием основных правил и их назначения. Для удобства статья разбита на две части. В первой объясняется настройка межсетевого экрана на одиночной машине, во второй — настройка NAT-шлюза в дополнение к файрволу.

Важно: Правила ниже приводятся в порядке выполнения; такая настройка возможна только при локальном входе в систему. Если вы работаете с удалённой системой, то в процессе добавления правил соединение с ней будет потеряно. Чтобы этого избежать, используйте готовый файл настроек.

Contents

Требования

Примечание: Ядро Linux на вашей машине должно быть скомпилировано с поддержкой iptables. В стандартных ядрах Arch Linux поддержка iptables включена.

Прежде всего установите пакет iptables с набором пользовательских утилит, если он ещё не установлен.

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

Если всё же какие-то правила существуют, можно сбросить их, загрузив базовый набор:

Настройка межсетевого экрана

Примечание: Поскольку iptables проверяет правила в цепочке последовательно, сверху вниз, то имеет смысл переместить часто срабатывающие правила ближе к её началу. Разумеется, этот подход имеет свои ограничения, в зависимости от реализуемой логики. Кроме того, поскольку правила имеют определённую "стоимость" выполнения, не стоит изменять их порядок исключительно на основе эмпирических наблюдений за счётчиком байтов/пакетов.

Создание необходимых цепочек

Создадим две пользовательские цепочки, которые будут использоваться для открытия портов.

В дальнейшем при назначений правил для этих цепочек мы будем всякий раз указывать тип протокола (например, флагом -p tcp ). Этим обусловлен выбор названий цепочек, но вообще говоря, названия могут быть любыми.

Цепочка FORWARD

Цепочка OUTPUT

Цепочка OUTPUT может быть крайне полезной в деле фильтрации исходящего трафика, особено для серверов и других устройств, не использующих веб-браузеры и peer-to-peer программы для соединения с произвольными узлами сети Интернет. Тем не менее, правильная настройка цепочки OUTPUT требует понимания назначения конкретной системы. Наборы правил безопасности для настольной системы, ноутбука, облачного или домашнего сервера будут сильно отличаться.

В этом примере весь исходящий трафик разрешён, поэтому для цепочки OUTPUT задаётся политика ACCEPT. Этого недостаточно для полной безопасности, но будет работать на большинстве систем.

Цепочка INPUT

Назначаем политику DROP для цепочки INPUT на случай, если что-то каким-то образом проскочит мимо наших правил. Лучший способ создать надёжный файрвол — запретить весь трафик, отдельно указав то, что разрешено.

Важно: Если вы вошли в систему через SSH, следующий шаг немедленно прервёт SSH-сеанс. Чтобы этого избежать: (1) добавьте первое правило для цепочки INPUT, приведённое далее в этом же разделе; правило позволит сохранить существующее соединение, (2) добавьте обычное правило, разрешающее входящее SSH-подключение (чтобы иметь возможность восстановить соединение в случае потери связи) и только после этого (3) задайте политику.

Все входящие пакеты, предназначенные для этой машины и пришедшие на любой сетевой интерфейс, будут проходить через цепочку INPUT. Эта цепочка позволяет принимать только те пакеты, которые действительно нужны.

Состояние соединения ESTABLISHED подразумевает одну из двух ситуаций: либо первичная ( --ctstate NEW ) попытка соединения была ранее одобрена другим правилом, либо соединение уже было активно (например, удалённое SSH-подключение) на момент задания правила.

Второе правило разрешит весь трафик от петлевого (loopback) интерфейса, который необходим многим приложениям и службам:

Примечание: Аналогичным образом можно добавить и другие доверенные интерфейсы (например, "enp2s0"), если вы не хотите, чтобы проходящий через них трафик обрабатывался межсетевым экраном. Тем не менее, вы должны понимать, весь этот трафик, вне зависимости от его происхождения, пройдёт дальше, невзирая ни на какие иные настройки.

Третье правило будет отбрасывать все пакеты с состоянием INVALID. Существует четыре категории состояния (state): NEW, ESTABLISHED, RELATED и INVALID. Именно наличие категорий отличает межсетевой экран с контекстной фильтрацией от менее безопасного экрана без оной. Состояния отслеживаются модулями ядра nf_conntrack_* , которые загружаются автоматически после добавления правил.

Следующее правило разрешает входящие ICMP эхо-запросы (ECHO_REQUEST), известные как пинги. Только первый пакет будет считаться относящимся к категории NEW, остальные будут обрабатываться правилом "RELATED, ESTABLISHED". Если компьютер не является маршрутизатором, нет необходимости разрешать какой-либо другой ICMP-трафик с состоянием NEW.

Теперь мы прикрепим TCP- и UDP-цепочки к цепочке INPUT для обработки новых входящих соединений. Если соединение разрешено цепочкой TCP или UDP, оно обрабатывается правилом "RELATED, ESTABLISHED". TCP или UDP цепочки будут либо разрешать новые входящие соединения, либо вежливо отклонять их. Новые TCP соединения должны начинаться с SYN-сегмента.

Файл генерируется и сохраняется командой

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

Цепочки TCP и UDP

Цепочки TCP и UDP содержат правила для разрешения новых TCP-соединений и UDP-потоков к определённым портам.

Открытие портов для входящих соединений

Разрешить удаленные SSH-соединения (на порт 22):

Разрешить входящие TCP/UDP запросы для DNS-сервера (порт 53):

Более сложные правила, вроде проверки по нескольким портам, можно найти в iptables(8) .

Port knocking

Port knocking — способ открыть извне порты, которые файрвол по умолчанию держит закрытыми. Port knocking заключается в создании последовательности попыток соединений с заранее выбранными закрытыми портами. При получении корректной последовательности "простукиваний" межсетевой экран открывает определенный порт и разрешает соединение. Подробнее см. Port knocking.

Защита от спуфинга

Примечание: В файле /usr/lib/sysctl.d/50-default.conf параметр rp_filter установлен в значение 2 , поэтому в описанных ниже действиях нет необходимости.

Если из внешней сети пришёл пакет с зарезервированным (т.е. локальным) адресом отправителя, то имеет место подмена адреса (address spoofing). Стандартный способ блокирования таких пакетов — установить с помощью sysctl параметр rp_filter (Reverse Path Filter) в значение 1 , что включит встроенную в ядро Linux проверку адреса отправителя пакета. Встроенная проверка будет работать лучше, чем отдельные правила iptables на каждый случай. Добавьте в файл /etc/sysctl.d/90-firewall.conf (подробнее см. sysctl) следующую строку:

То же самое можно сделать посредством netfilter, если необходимо ведение статистики и лог-файлов:

Примечание: Включать эту функцию одновременно в двух местах не нужно. Реализованная в netfilter проверка вполне удовлетворительна и, кроме того, работает с адресами IPv6.

Для случая асинхронной маршрутизации используйте значение rp_filter=2 . Флаг --loose в модуле rpfilter делает то же самое посредством netfilter.

Защита от обнаружения

Если вы хотите сделать вашу машину менее заметной в сети, хорошей идеей будет блокировать некоторые входящие запросы.

Блокирование ping-запросов

Чтобы заблокировать эхо-запросы (echo requests), добавьте следующую строку в файл /etc/sysctl.d/90-firewall.conf (подробную информацию можно найти в статье sysctl):

Обман сканеров портов

Сканирование портов производится с целью обнаружения тех из них, которые открыты в настоящий момент. Это позволит атакующему определить запущенные на машине службы и подобрать к ним эксплойты.

Состояние INVALID в правилах iptables "позаботится" обо всех типах сканирования, за исключением сканирований UDP, ACK и SYN (флаги nmap -sU , -sA и -sS соответственно).

ACK-сканирование не используется для определения открытых портов, но зато покажет порты, защищённые межсетевым экраном. Подобно SYN-пакету в TCP-соединениях с состоянием NEW, каждый пакет ACK-сканирования будет отклонен с отправкой ответа TCP RESET по обратному адресу. Некоторые межсетевые экраны вместо этого просто отбрасывают такие пакеты, что позволяет атакующему определить действующие правила.

Модуль recent поможет обмануть остальные типы сканирования портов. Он добавляет хосты к списку недавних соединений, который используется для обнаружения и блокирования попыток атак. Просмотреть списки недавних соединений можно в каталоге /proc/net/xt_recent/ .

  • Система станет уязвимой к разновидности DoS-атаки. Атакующий посылает пакеты с подменёными IP-адресами, чтобы добиться их блокировки вашими службами.
  • Может оказаться заблокированным обычный IP-адрес, если несколько пакетов с этого адреса на порт получателя будут признаны INVALID модулем conntrack. Чтобы избежать занесения в чёрный список, следует разрешить все пакеты, поступающие на этот порт.
SYN-сканирование

При SYN-сканировании сканер портов посылает синхронизационные пакеты на каждый порт с целью создать TCP-соединение. Если порт закрыт, то возвращается ответ TCP RESET, межсетевой экран просто отбрасывает входящий пакет, а открытый порт возвращает ответ SYN ACK.

Модуль recent может использоваться для отслеживания хостов с отклонёнными попытками соединения и возвращения ответа TCP RESET для каждого SYN-пакета, поступившего на открытый порт, как если бы порт был закрыт. Если открытый порт оказался первым в порядке сканирования, то будет возвращён ответ SYN ACK, поэтому приложения вроде ssh следует размещать на нестандартных портах.

Сначала добавьте правило в начало цепочки TCP. Это правило будет отвечать пакетом TCP RESET любому хосту, входившему в список TCP-PORTSCAN в течение последних 60 секунд. Флаг --update управляет периодическим обновлением списка.

Затем необходимо модифицировать правило отклонения TCP-пакетов, чтобы добавлять все хосты с отклонёнными пакетами к списку TCP-PORTSCAN :

UDP-сканирование

Сначала добавляем правило отклонения пакетов от хостов из списка UDP-PORTSCAN в начало цепочки UDP:

Затем модифицируем правило отклонения пакетов для UDP:

Восстановление последнего правила

Если вы применили хотя бы один из способов защиты выше, бывшее последним правило цепочки INPUT более таковым не является. Теперь оно находится перед правилами защиты от сканирования и те по сути бесполезны. Просто удалите ( -D ) это правило, а затем добавьте его снова ( -A ), это переместит его в конец цепочки.

Защита от других типов атак

Атака полным перебором

Важно: Защита посредством занесения адресов в чёрный список остановит простые атаки, но она полагается на дополнительный демон и успешное логирование (в случае мощной атаки может закончиться свободное место разделе, содержащем каталог /var с лог-файлами). Кроме того, узнав ваш IP-адрес, атакующий может посылать пакеты с подменённым адресом отправителя, чтобы добиться вашей блокировки. Элегантное решение этой проблемы заключается в использовании ключей SSH.

Приложения Fail2ban и (в случае sshd ) Sshguard используются для блокировки IP-адресов при превышении допустимого количества попыток аутентификации. Суть их работы состоит в обновлении правил iptables с целью временно или навсегда воспрепятствовать будущим соединениям атакующих.

Ниже представлен пример правил iptables для предотвращения атак полным перебором на сервис SSH.

Предложенные выше правила могут использоваться для защиты любой службы, но демон SSH нуждается в ней наиболее часто.

Необходимо также убедиться, что правило -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH находится в верной позиции в последовательности iptables, перед точкой прикрепления цепочки TCP к цепочке INPUT. Это позволит успешно перехватывать новые попытки установления SSH-соединений. Если вы выполнили все предыдущие шаги в этой статье, порядок правил должен быть следующим:

Если вы не используете протокол IPv6, то лучше будет его отключить. В противном случае стоит создать соответствующий набор правил межсетевого экрана.

Скопируйте созданные ранее правила для протокола IPv4 и замените все IPv4-адреса на адреса формата IPv6:

Коды ошибок ICMPv6 перечислены в RFC 4443, согласно которому при блокировке межсетевым экраном попыток установления соединения необходимо использовать код --reject-with icmp6-adm-prohibited . Это проинформирует удалённую систему о том, что соединение было отклонено брандмауэром, а не прослушивающей порт службой.

This article or section needs expansion.

Следующее правило для протокола IPv6 настроит поведение межсетевого экрана по отношению к новым входящим пингам (ICMP echo requests):

Модуль conntrack не отслеживает действия ICMPv6 Neighbor Discovery Protocol (аналог протокола ARP), поэтому необходимо разрешить трафик ICMPv6 вне зависимости от его состояния для всех прилежащих подсетей. Следующее правило нужно вставить после правила отбрасывания некорректных пакетов --ctstate INVALID , но перед любыми другими правилами DROP или REJECT. Создаётся по одному правилу на каждую подсеть:

Если вы желаете включить DHCPv6, разрешите входящие соединения на UDP-порт 546:

Поскольку в ядре Linux нет встроенной фильтрации по обратному маршруту (reverse path filter) для протокола IPv6, то стоит включить её посредством ip6tables:

Сохранение правил

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

Сохраняем правила IPv4 и IPv6 командами:

В завершение включите и запустите службы iptables.service и ip6tables.service . Проверьте статус служб, чтобы убедиться, что правила загрузились корректно.

Настройка NAT-шлюза

В этом разделе рассмотрена настройка межсетевого экрана для NAT-шлюза. Предполагается, что вы уже прочитали первую часть данного руководства и настроили цепочки INPUT, OUTPUT, TCP и UDP как было предложено. До этого момента созданные правила относились к таблице filter, при настройке NAT-шлюза нам также понадобится таблица nat.

Таблица filter

Создание необходимых цепочек

Цепочка FORWARD

Настройка цепочки FORWARD схожа с настройкой цепочки INPUT в первой части.

Сначала добавляем правило с модулем conntrack, идентичное правилу из цепочки INPUT:

Затем включаем пересылку для доверенных интерфейсов и пропускаем все пакеты через цепочку fw-open:

Цепочки fw-interfaces и fw-open

Назначение цепочек fw-interfaces и fw-open будет объяснено позже, когда мы будем работать с цепочками POSTROUTING и PREROUTING соответственно в таблице nat.

Таблица nat

В этом разделе предполагается, что исходящий интерфейс (с публичным IP-адресом) носит имя ppp0. Если ваш интерфейс называется иначе, то во всех приведённых ниже правилах следует заменить название на настоящее.

Цепочка POSTROUTING

Сначала мы должны определить, кому разрешено подключаться к сети Интернет. Предположим, имеется подсеть 192.168.0.0/24 (т.е. в неё входят все адреса в диапазоне 192.168.0.0-255), подключённая к интерфейсу eth0. Чтобы разрешить исходящие соединения хостам в этой подсети, настраиваем цепочку fw-interfaces в таблице FORWARD:

Затем необходимо отредактировать все исходящие пакеты, чтобы в поле "адрес отправителя" значился публичный адрес шлюза вместо локального LAN-адреса. Для этого используем таргет MASQUERADE:

Не забудьте указать параметр -o ppp0 , потому что в противном случае сеть не будет функционировать.

Предположим, что есть другая подсеть, 10.3.0.0/16 (с адресами 10.3.*.*), подключённая к интерфейсу eth1. Добавляем аналогичные правила:

Наконец, нужно разрешить пересылку пакетов (если она ещё не включена).

Хосты данных подсетей теперь могут использовать вашу NAT-систему в качестве шлюза. Возможно, вы также захотите настроить DNS- и DHCP-сервер, например, dnsmasq или комбинацию BIND и dhcpd, с целью упрощения настройки разрешения имён (DNS resolving) на клиентских машинах, но эта тема выходит за рамки данного руководства.

Цепочка PREROUTING

В некоторых случаях может понадобиться изменить адрес получателя в заголовке входящего пакета с адреса шлюза на адрес хоста в локальной сети. Для этого нужно настроить созданную ранее цепочку fw-open, а также цепочку PREROUTING таблицы nat.

Например, чтобы изменить адрес получателя входящих SSH-пакетов (порт 22) на адрес ssh-сервера 192.168.0.5 выполните команды:

Во втором примере меняется не только адрес получателя, но и порт. Порт входящего соединения 8000 заменяется на порт 80 веб-сервера по адресу 192.168.0.6:

Настройка для UDP-пакетов производится аналогично.

Сохранение правил

Чтобы сохранить новые правила межсетевого экрана для NAT-шлюза, выполните:



Habib M’henni / Wikimedia Commons, CC BY-SA

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

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

Поэтому нужно завести другого юзера, а для рута отключить удалённое администрирование по SSH.

Новый пользователь заводится командой useradd :


Затем для него добавляется пароль командой passwd :


Наконец, этого пользователя нужно добавить в группу, которая имеет право выполнять команды с повышением привилегий sudo . В зависимости от дитрибутива Linux, это могут быть разные группы. Например, в CentOS и Red Hat юзера добавляют в группу wheel :


В Ubuntu он добавляется в группу sudo :

Брутфорс или утечка паролей — стандартный вектор атаки, так что аутентификацию по паролям в SSH (Secure Shell) лучше отключить, а вместо неё использовать аутентификацию по ключам.

Есть разные программы для реализации протокола SSH, такие как lsh и Dropbear, но самой популярной является OpenSSH. Установка клиента OpenSSH на Ubuntu:


Установка на сервере:


Запуск демона SSH (sshd) на сервере под Ubuntu:


Автоматический запуск демона при каждой загрузке:


Нужно заметить, что серверная часть OpenSSH включает в себя клиентскую. То есть через openssh-server можно подключаться к другим серверам. Более того, со своей клиентской машины вы можете запустить SSH-туннель с удалённого сервера на сторонний хост, и тогда сторонний хост будет считать удалённый сервер источником запросов. Очень удобная функция для маскировки своей системы. Подробнее см. статью «Практические советы, примеры и туннели SSH».

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

Итак, для своего нового юзера сначала нужно сгенерировать ключи SSH на компьютере, с которого вы будете заходить на сервер:


Публичный ключ хранится в файле .pub и выглядит как строка случайных символов, которые начинаются с ssh-rsa .

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname

Затем из-под рута создать на сервере директорию SSH в домашнем каталоге пользователя и добавить публичный ключ SSH в файл authorized_keys , используя текстовый редактор вроде Vim:

Наконец, установить корректные разрешения для файла:


и изменить владение на этого юзера:


На стороне клиента нужно указать местоположение секретного ключа для аутентификации:


Теперь можно залогиниться на сервер под именем юзера по этому ключу:


После авторизации можно использовать команду scp для копирования файлов, утилиту sshfs для удалённого примонтирования файловой системы или директорий.

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

Как упоминалось выше, в SSH нужно отключить аутентификацию для рута (по этой причине мы и заводили нового юзера).

На CentOS/Red Hat находим строку PermitRootLogin yes в конфигурационном файле /etc/ssh/sshd_config и изменяем её:


На Ubuntu добавляем строку PermitRootLogin no в конфигурационный файл 10-my-sshd-settings.conf :


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

На CentOS/Red Hat находим строку PasswordAuthentication yes в конфигурационном файле /etc/ssh/sshd_config и изменяем её следующим образом:


На Ubuntu добавляем строку PasswordAuthentication no в файл 10-my-sshd-settings.conf :


Инструкцию по подключению двухфакторной аутентификации по SSH см. здесь.

Файрвол гарантирует, что на сервер пойдёт только тот трафик по тем портам, которые вы напрямую разрешили. Это защищает от эксплуатации портов, которые случайно включились с другими сервисами, то есть сильно уменьшает поверхность атаки.

Перед установкой файрвола нужно убедиться, что SSH внесён в список исключений и не будет блокироваться. Иначе после запуска файрвола мы не сможем подключиться к серверу.

С дистрибутивом Ubuntu идёт Uncomplicated Firewall (ufw), а с CentOS/Red Hat — firewalld.

Разрешение SSH в файрволе на Ubuntu:


На CentOS/Red Hat используем команду firewall-cmd :


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

На CentOS/Red Hat запускаем сервис systemd для firewalld:


На Ubuntu используем такую команду:

Сервис Fail2Ban анализирует логи на сервере и подсчитывает количество попыток доступа с каждого IP-адреса. В настройках указаны правила, сколько попыток доступа разрешено за определённый интервал — после чего данный IP-адрес блокируется на заданный отрезок времени. Например, разрешаем 5 неудачных попыток аутентификации по SSH в промежуток 2 часа, после чего блокируем данный IP-адрес на 12 часов.

Установка Fail2Ban на CentOS и Red Hat:


Установка на Ubuntu и Debian:


В программе два конфигурационных файла: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf . Ограничения для бана указываются во втором файле.

Джейл для SSH включён по умолчанию с дефолтными настройками (5 попыток, интервал 10 минут, бан на 10 минут).


Кроме SSH, Fail2Ban может защищать и другие сервисы на веб-сервере nginx или Apache.

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

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

На CentOS/Red Hat нужно установить приложение dnf-automatic и включить таймер:

SSH был разработан в 1995 году для замены telnet (порт 23) и ftp (порт 21), поэтому автор программы Тату Илтонен выбрал порт 22 по умолчанию, и его утвердили в IANA.

Естественно, все злоумышленники в курсе, на каком порту работает SSH — и сканируют его вместе с остальными стандартными портами, чтобы узнать версию программного обеспечения, для проверки стандартных паролей рута и так далее.

Смена стандартных портов — обфускация — в несколько раз сокращает объём мусорного трафика, размер логов и нагрузку на сервер, а также сокращает поверхность атаки. Хотя некоторые критикуют такой метод «защиты через неясность» (security through obscurity). Причина в том, что эта техника противопоставляется фундаментальной архитектурной защите. Поэтому, например, Национальный институт стандартов и технологий США в «Руководстве по безопасности сервера» указывает необходимость открытой серверной архитектуры: «Безопасность системы не должна полагаться на скрытность реализации её компонентов», — сказано в документе.

Теоретически, смена портов по умолчанию противоречит практике открытой архитектуры. Но на практике объём вредоносного трафика действительно сокращается, так что это простая и эффективная мера.

Номер порта можно настроить, изменив директиву Port 22 в файле конфигурации /etc/ssh/sshd_config. Он также указывается параметром -p <port> в sshd. Клиент SSH и программы sftp тоже поддерживают параметр -p <port> .

Параметр -p <port> можно использовать для указания номера порта при подключении с помощью команды ssh в Linux. В sftp и scp используется параметр -P <port> (заглавная P). Указание из командной строки переопределяет любое значение в файлах конфигурации.

Если серверов много, почти все эти действия по защите Linux-сервера можно автоматизировать в скрипте. Но если сервер только один, то лучше вручную контролировать процесс.

На правах рекламы

Закажи и сразу работай! Создание VDS любой конфигурации и с любой операционной системой в течение минуты. Максимальная конфигурация позволит оторваться на полную — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Эпичненько :)

Читайте также: