Защита VPS от нечисти с помощью fail2ban и iptables
Как только в цифровом океане интернета рождается новый маленький беззащитный VPS, злые боты сбегаются со всех уголков Сети сканировать его наивно открытые миру порты и доступные веб-адреса с целью найти брешь и доложить своему хозяину. Юному серверу приходится учиться, как нарастить толстый панцирь, который убережёт его от большинства вредных тварей.
В этой заметке я расскажу, как помочь ему в этом. Однако, хоть дальнейшее повествование и будет на все сто правдиво только для сервера с ОС Debian, единственной задачей которого является хостинг сайтов, я думаю, что кому-то оно будет полезно и в некоторых других случаях.
Основным инструментом в построении защиты Linux-хоста является утилита iptables, которая управляет работой межсетевого экрана. Утилита fail2ban тоже использует iptables для блокировки пакетов с забаненных IP-адресов и python для детектирования таких адресов. Для большей безопасности я рекомендую сменить стандартный порт SSH на какой-нибудь экзотический.
С этого и начнём. Это легко, и делается в два коротких шага. Сначала отредактируем файл конфига демона SSH:sudo nano /etc/ssh/sshd_configСменим порт 22 на что-то сложное и пятизначное.
Во избежание возможных конфликтов с другими программами, необходимо выбирать из диапазона динамических портов, а это значения от 49152 до 65535:# What ports, IPs and protocols we listen for #Port 22 Port 49681Сохраним изменения (Ctrl+O), выйдем из nano (Ctrl+X) и перезапустим SSH-демона: Готово! При следующем подключении необходимо явно указать порт: Я бы не рекомендовал держать на сервере с сайтами ещё какие-либо открытые в Сеть сервисы, под них лучше выделить отдельный VPS, и настроить его соответственно. В случае, когда единственной функцией является веб-хостинг, можно закрыть все порты, кроме тех двух, куда обычно направлены браузеры живых посетителей ресурса – 80 (HTTP) и 443 (HTTPS), и ещё одного, куда подключается администратор сервера по SSH (мы сменили его выше на 49681). Для начала создадим файл с правилами iptables:sudo touch /etc/iptables.firewall-rulesПомещаем внутрь следующее содержимое:*filter # Разрешаем весь внутренный трафик на интерфейсе lo и запрещаем внутренний трафик, который не использует lo -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Разрешаем все уже установленные входящие соединения -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT # Разрешаем весь исходящий трафик -A OUTPUT -j ACCEPT # Разрешаем все входящие HTTP и HTTPS соединения -A INPUT -p tcp –dport 80 -j ACCEPT -A INPUT -p tcp –dport 443 -j ACCEPT # Разрешаем подключение на порт 49681 для SSH -A INPUT -p tcp -m state –state NEW –dport 49681 -j ACCEPT # Разрешаем пинг -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT # Запишем в лог все соединения, что были сброшены файерволом -A INPUT -m limit –limit 5/min -j LOG –log-prefix “iptables denied: ” –log-level 7 # Запретим все соединения, что явно не разрешены -A INPUT -j REJECT -A FORWARD -j REJECT
COMMIT
Теперь необходимо написать скрипт, который будет применять эти правила автоматически при загрузке системы. Создадим пустой файл и сразу сделаем его исполняемым:sudo touch /etc/network/if-pre-up.d/firewall
sudo chmod +x /etc/network/if-pre-up.d/firewallЕго содержимое должно быть примерно следующим:#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall-rules
Первый раз указанную в скрипте команду нужно выполнить вручную от суперпользователя, чтобы сразу после настройки включить защиту, а при дальнейших перезагрузках ОС правила будет добавлять скрипт.
Проверить, какие правила добавлены в iptables можно следующим способом: Fail2ban обычно не входит в базовый набор утилит системы, и её нужно установить:sudo apt-get install fail2banПеред началом работы рекомендуется сделать копию конфигурационного файла и вносить изменения только в него, так как оригинальный конфиг может быть перезаписан при обновлении:cd /etc/fail2ban/ && cp jail.conf jail.localУтилита fail2ban из коробки имеет несколько готовых фильтров для Apache, но я бы рекомендовал создать свои: один для лога access, а второй – для error. Виртуальные хосты следует настроить таким образом, чтобы эти логи для всех сайтов были общими, что позволяет защищать все сайты на сервере сразу при помощи всего лишь двух фильтров. Создадим пустые файлы для фильтров:cd /etc/fail2ban/filter.d/ touch apache-access.conf touch apache-error.confПримерное содержимое для фильтра apache-access.conf:# Apache Access Filter [Definition] failregex = ^.* ‹HOST› .*///.* ^.* ‹HOST› .*\.* ^.* ‹HOST› .*w00tw00t.* ^.* ‹HOST› .*WinHttpRequest.*
ignoreregex =
Его можно и нужно дополнять новыми строками в секции failregex на основании того, какую подозрительную активность вы нашли в логе access.log. Выше блокируются запросы, содержащие слова “w00tw00t”, “WinHttpRequest” или по три слеша в ту или другую сторону. Фильтр для error.
log имеет точно такую же структуру:# Apache Error Filter [Definition] failregex = ^.*[client ‹HOST›].*w00tw00t.at.ISC.SANS.DFind.* ^.*[client ‹HOST›].*Lost connection to MySQL server during query.* ^.*[client ‹HOST›].*client denied by server configuration.* ^.*[client ‹HOST›].*Invalid URI in request.* ^.*[client ‹HOST›].
*/admin.php' not found or unable to stat ^.*[client ‹HOST›].*/wp-login.php' not found or unable to stat ^.*[client ‹HOST›].*/vam_rss2_info.php' not found or unable to stat ^.*[client ‹HOST›] File does no exist: .*typo3 ^.*[client ‹HOST›] File does no exist: .*hostcmsfiles ^.
*[client ‹HOST›] File does no exist: .*administrator ^.*[client ‹HOST›] File does no exist: .*bitrix ^.*[client ‹HOST›] File does no exist: .*bbadmin ^.*[client ‹HOST›] File does no exist: .*WebAdmin ^.*[client ‹HOST›] File does no exist: .*webmanage ^.*[client ‹HOST›] File does no exist: .*fck ^.
*[client ‹HOST›] File does no exist: .*fckeditor ^.*[client ‹HOST›] File does no exist: .*web
ignoreregex =
В файл конфига jail.local в разделе HTTP servers необходимо подключить недавно созданные фильтры. Правильно укажите пути до файлов с логами, иначе работать не будет:[apache-access] enabled = true port = http,https filter = apache-access logpath = /path/to/access.log maxretry = 1 findtime = 600 bantime = 86400 [apache-error] enabled = true port = http,https filter = apache-error logpath = /path/to/error.log maxretry = 1 findtime = 600 bantime = 86400Полезно заодно включить (поменять с false на true поле enabled) предустановленные фильтры [ssh] и [ssh-ddos]. Для того, чтобы активировать защиту, перезапустим fail2ban:sudo service fail2ban restartПосле этого фильтры fail2ban и список заблокированных за плохое поведение IP-адресов можно будет увидеть в выводе команды: Пришло время подвести итог. Наш юный сервер стал уже не таким доверчивым, он не реагирует на пакеты, приходящие на порты, отличные от HTTP, HTTPS и SSH. Он может оценить, хорошо ли ведёт себя тот или иной клиент, и забанить в противном случае. Он будет защищаться при попытке взлома SSH.Войдите на сайт, чтобы присоединиться к обсуждению.
Источник: https://yareg.com/linux/zashchita-vps-ot-nechisti-s-pomoshchyu-fail2ban-i-iptables
Баним поднебесную. Как закрыть доступ на сайт для целой страны
Итак, приступим к блокированию китайских пользователей и всех, кто прячется за их файрволлами.
В предыдущей статье я писал о том, что буду блокировать на уровен веб-сервера с использованием модуля GeoIP, но решил я всё-таки от этого отойти в пользу блокировки прямо на файрволле.
Почему? Экономия ресурсов и более высокий уровень защиты. По сути мне нужно прикрывать не только WEB, но ещё и SSH, потому что на него тоже идут атаки с поднебесной.
Да и кроме того, блокировка на подходе намного более эффективная, чем блокировка на самом веб-сервере. Сравнить это можно с аэропортом.
Гораздо проще поставить защиту на главный вход, чтобы не пропускать террористов даже на порог, чем фильтровать каждого при входе в самолёт.
Поскольку файрволл стоит ближе к ядру и первый получит пакеты – пусть он и принимает решение сразу пропускать или отбрасывать запросы. Не дожидаясь последствий.
Списки адресов
Настроить GeoIP + Iptables у меня не получилось, какая-то проблема с виртуализацией и заголовками ядра, думаю, ещё потом поковыряю на досуге, а пока что решил записывать все диапазоны китайцев напрямую в iptables-таблицу.
Адреса я взял отсюда:
https://ipdeny.com/ipblocks/data/countries/cn.zone
Там вообще по любой стране диапазоны есть, только вот немало их. CN – Китай, для справки.
WGET-нем этот список себе во временную папочку пока. Будем последовательно применять правила на файрволл.
Применял подобным скриптом:
IPLIST=$(egrep -v “^#|^$” cn.zone) for ipaddr in IPLIST do /sbin/iptables -A BANLIST -s $ipaddr -j DROP
done
Сразу говорю, занимает это очень много времени. Можно это было ускорить посредством ipset, но решил без всяких ухищрений делать.
Итак, проверяем.
Проверка блокировки
Чтобы не мудрствовать лукаво, буду заходить на свой же сайт с китайским IP. В Инете полно списков бесплатных прокси-серверов, за которыми можно спрятаться! Возьму-ка я вот какой-то совершенно случайно!
Список проксей
Как настраивать прокси, думаю, не надо объяснять. Но на всякий случай скажу. Записываем IP и Порт прокси-сервера, открываем настройки браузера. (надо будет нажать ссылку и показать дополнительные настройки).
Chrome
Откроется окно изменения прокси-сервера в системе:
Системные параметры Proxy
Там жмём на кнопку “Настройка сети”
Прописываем данные
Прописываем там данные нашего прокси-сервера, который запомнили до этого. Всё, проверяем:
Заходим на сайт 2ip.ru
Сработало!
А потом можно на yoip.ru
Наш IP
Как видите, везде фигурирует адрес нашего прокси! Т.е. для других веб-сайтов мы с адресом Китая. Хех, откроем-ка наш любимый (правда?) сайт:
Оп-па
Вот незадача! Сайт не открывается. Если включить логирование на файрволле, то увидим, что пакеты просто отбрасываются. Это экономит наш трафик и вообще со всех сторон хорошо!
P.S. Если у вас возникли проблемы с заходом на сайт – непременно напишите в комментах! Будем разбираться.
Источник: https://litl-admin.ru/linux/banim-podnebesnuyu-kak-zakryt-dostup-na-sajt-dlya-celoj-strany.html
CentOS 7. Доступ к серверу только из России. Iptables + ipset + ripe.net
Ограничить доступ к серверу только из России.
Предисловие
В моём распоряжении имеется сервер, на котором есть важный проект и куча сайтов на джумле. И я часто вижу в логах веб сервера, как много их брутфорсят из-за “бугра” (заграница ацкая). Перенести джумлосайты на другой сервер возможности пока нет. Использовать докер контейнеры – тоже.
Брутфорс админок даёт кое-какую нагрузку на сервер. Поэтому я решил: т.к. все сайты и проекты рассчитаны только на российскую аудиторию, то почему бы просто не ограничить доступ к серверу из-за “бугра”?
Решение
Чуть погуглив, рашил блокировать с помощью iptables всё (политика INPUT DROP), а разрешить только российские сети. На тостере мне подсказали, что для фильтрации большого количества адресов идеально подходит ipset модуль. А в качестве источника данных по сетям я взял региональный интернет-регистратор, который обслуживает Европу, Центральную Азию, Ближний Восток по данным ripe.net.
Реализация
Написал bash скрипт, который качает базу IP диапазонов, переводит их в маски, формирует лист для ipset и заносит правило в iptables:
/root/update_rusnetworks.sh
#!/bin/bash cd /root/sh wget -O ripe.db.inetnum.gz ftp://ftp.ripe.net/ripe/dbase/split/ripe.db.inetnum.gz if [ ! -f /root/sh/ripe.db.inetnum.gz ]; then echo “File ripe.db.inetnum.gz not found!” exit fi gunzip ripe.db.inetnum.gz rm -f ripe.db.inetnum.gz echo “Get ripe.db.inetnum lines count…” c=$(wc -l ripe.db.inetnum) php ranges.php $c rm -f ripe.db.inetnum c=$(wc -l ip.ru.ranges.txt) php ip2cidr.php $c rm -f ip.ru.ranges.txt if [ ! -f /root/ipset.rusnetworks.rules ]; then echo “File /root/ipset.rusnetworks.rules not found!” exit fi #echo “Stopping iptables service” #systemctl stop iptables echo “Remove iptables rule for rusnetworks” /usr/sbin/iptables -D INPUT -p tcp -m set –match-set rusnetworks src -m state –state NEW -m multiport –dports 80,443 -j ACCEPT echo “Remove set rusnetworks from ipset” ipset -X rusnetworks echo “Restore set rusnetworks from ipset.rusnetworks.rules” cat /root/ipset.rusnetworks.rules | ipset restore -! #echo “Starting iptables service” #systemctl start iptables echo “Add iptables rusnetworks rule” /usr/sbin/iptables -I INPUT 6 -p tcp -m set –match-set rusnetworks src -m state –state NEW -m multiport –dports 80,443 -j ACCEPT /usr/sbin/iptables -S | grep rusnetworks
/root/ranges.php
Источник: https://anart.ru/security/2017/04/12/centos7-ipset-iptables-russia-allow.html
Настройка iptables для чайников
Каждый компьютер, подключенный к сети, находится в потенциальной опасности.
В сети очень много угроз начиная от программ, которые будут пытаться любым способом проникнуть в систему и заканчивая хакерами, которые хотят получить доступ к нужному им компьютеру.
А программное обеспечение, установленное на компьютере, может содержать еще не известные и неисправленные уязвимости, которые и могут стать дырой в безопасности.
Если для домашних компьютеров это не очень актуально, так как они подключены к сети через роутеры и NAT, которые скрывают их от внешней сети, то для серверов это актуально как никогда. В операционной системе Linux в ядро встроен очень гибкий и надежный фаервол iptables.
Именно с помощью этой программы выполняется защита системы от внешних вторжений, перенаправление портов, а также еще очень много действий с трафиком. Но ее минус в том, что она немного сложна в настройке. В этой статье будет рассмотрена настройка iptables для чайников. Я надеюсь, что после нее вы сможете уверенно пользоваться базовыми возможностями iptables.
Что такое Iptables?
Подсистема iptables и Netfilter уже достаточно давно встроена в ядро Linux.
Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables.
Там эти пакеты поддаются проверкам и затем для каждой проверки, если она пройдена выполняется указанное в ней действие. Например, пакет передается дальше ядру для отправки целевой программе, или отбрасывается.
Виды пакетов
Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие – это те, которые были отправлены на этот компьютер, исходящие – отправленные из этого компьютера в сеть. А проходящие – это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.
Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:
- Input – обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
- forward – эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
- output – эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.ru или когда вы запускаете браузер и пытаетесь открыть любой сайт.
Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output.
Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях.
А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.
Правила и действия
Перед тем как перейти к созданию списка правил iptables нужно рассмотреть как они работают и какие бывают.
Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие.
Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:
- ACCEPT – разрешить прохождение пакета дальше по цепочке правил;
- DROP – удалить пакет;
- REJECT – отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
- LOG – сделать запись о пакете в лог файл;
- QUEUE – отправить пакет пользовательскому приложению.
Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.
Когда мы разобрались с правилами, можно вернутся обратно к цепочкам. Кроме перечисленных выше, есть еще две дополнительные цепочки правил:
- prerouting – в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
- postrouting – сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.
Но это еще не все. У нас еще есть таблицы iptables, с которыми тоже желательно разобраться.
Таблицы ipatables
Над цепочками правил в iptables есть еще один уровень абстракции, и это таблицы. В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output.
Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации.
Сейчас это для вас не так важно и будет достаточно знать что фильтрация пакетов iptables осуществляется в таблице filter. Но мы рассмотрим их все:
- raw – предназначена для работы с сырыми пакетами, пока они еще не прошли обработку;
- mangle – предназначена для модификации пакетов;
- nat – обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора;
- filter – основная таблица для фильтрации пакетов, используется по умолчанию.
С теорией почти все, теперь давайте рассмотрим утилиту командной строки iptables, с помощью которой и выполняется управление системой iptables.
Утилита Iptables
Подсистема iptables и netfilter встроены в ядро, но вот набор утилит для управления всем этим не всегда поставляется вместе с системой. Для установки утилиты в Ubuntu наберите:
sudo apt install iptables
А в дистрибутивах, основанных на Fedora, установка iptables выполняется немного по-другому:
sudo yum install iptables
Когда установка iptables будет завершена, можно переходить к настройке, но давайте сначала рассмотрим синтаксис утилиты. Обычно команда имеет такой общий вид:
$ iptables -t таблица действие цепочка дополнительные_параметры
Теперь давайте рассмотрим параметры iptables, таблица указывает таблицу, с которой нужно работать, этот параметр можно упустить, действие – нужное действие, например, создать или удалить правило, а дополнительные параметры описывают действие и правило, которое нужно выполнить.
Осталось рассмотреть основные действия, которые позволяет выполнить iptables:
- -A – добавить правило в цепочку;
- -С – проверить все правила;
- -D – удалить правило;
- -I – вставить правило с нужным номером;
- -L – вывести все правила в текущей цепочке;
- -S – вывести все правила;
- -F – очистить все правила;
- -N – создать цепочку;
- -X – удалить цепочку;
- -P – установить действие по умолчанию.
Дополнительные опции для правил:
- -p – указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,mh;
- -s – указать ip адрес устройства-отправителя пакета;
- -d – указать ip адрес получателя;
- -i – входной сетевой интерфейс;
- -o – исходящий сетевой интерфейс;
- -j – выбрать действие, если правило подошло.
Теперь вы можем перейти рассмотрению примеров того как выполняется настройка iptables.
Примеры настройки Iptables
Мы рассмотрим несколько основных примеров, чтобы вы смогли закрепить все прочитанное выше.
Список правил
Сначала давайте рассмотрим как выполняется просмотр правил iptables, для этого достаточно опции -L:
iptables -L
Также вы можете указать нужную цепочку, чтобы вывести правила только для нее:
iptables -L INPUT
Очистка правил
Вы не можете просто так отключить iptables остановив сервис обновления правил iptables через systemd или даже удалив набор утилит для настройки. Подсистема работает на уровне ядра и не зависит от того, что там у вас установлено. Поэтому если сделаете что-то не так, то нужно будет очистить правила. Для этого выполните:
sudo iptables -F
Или только для определенной цепочки:
sudo iptables -F Input
Напоминаю, что все эти действия выполняются для таблицы по умолчанию – filter.
Правила по умолчанию
Как я уже говорил, если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -p:
sudo iptables -p INPUT ACCEPT $ sudo iptables -p OUTPUT ACCEPT
$ sudo iptables -p FORWARD DROP
В этом примере мы разрешаем цепочки INPUT и OUTPUT, но запрещаем FORWARD.
sudo iptables -L
Блокировка пакетов
Для блокировки пакетов мы можем использовать действие DROP, фильтровать пакеты, которые нужно заблокировать мы можем по множеству критериев, например, протоколу, ip адресу, маске сети, порту и многому другому.
Источник: https://losst.ru/nastrojka-iptables-dlya-chajnikov
Настраиваем интернет шлюз с прозрачным обходом блокировок (а рекламу таки будем блокировать)
У вас есть старенький (или не очень) компьютер с двумя сетевыми картами? Вам надоела реклама и лишние телодвижения для обхода блокировок? Вы не хотите с этим мириться? Тогда добро пожаловать под кат.
Цель
Настроить интернет шлюз таким образом, чтобы клиенты внутри локальной сети без дополнительных настроек работали с интернетом без ограничений. К заблокированным сайтам доступ будет осуществляться через тор, к остальным через обычное интернет соединение. К .onion ресурсам доступ из любого браузера как к обычным сайтам.
В качестве бонуса, настроим блокировку рекламных доменов и доступ к условно заблокированным сайтам через тор (имеются в виду сайты, которые ограничивают функциональность для пользователей из РФ). Мой интернет провайдер чтоб тебе икнулось осуществляет перехват DNS запросов и подмену адресов (т.е.
при резольвинге запрещенных сайтов возвращает адрес своей заглушки), поэтому все DNS запросы я отправляю в тор.
Предупреждение
Все что описано ниже помогает обойти блокировки, но НЕ ОБЕСПЕЧИВАЕТ анонимности. От слова совсем.
Идеи и способы реализации взял отсюда и отсюда. Авторам этих статей большое спасибо.
Итак поехали
Предполагается, что на начальном этапе у вас уже есть установленная ОС (в моем случае Ubuntu server 16.04) на компьютере с двумя сетевыми интерфейсами. Один из которых (у меня это ppp0) смотрит в сторону провайдера, а второй (у меня это enp7s0) в локалку.
Внутренний IP шлюза 192.168.1.2. Локальная сеть 192.168.1.0/24.
Как подойти к этому этапу в данной статье не рассматривается, так как информации в сети более чем достаточно. Скажу только, что pppoe подключение к провайдеру удобно настраивать утилитой pppoeconf.
Подготовительный этап
Если вы, как и я, используете н{е|оу}тбук, то возможно вам захочется, чтобы он не засыпал при закрытии крышки.
sudo nano /etc/systemd/logind.confHandleLidSwitch=ignore
Разрешаем форвардинг в ядре. Я за одно отключил IPv6.
sudo nano /etc/sysctl.confnet.ipv4.ip_forward=1
# IPv6 disabled
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Применим изменения без перезагрузки.
sudo sysctl -p
Настройка DHCP
Мы хотим, чтобы клиенты настраивались автоматически, поэтому без DHCP сервера не обойтись.
$ sudo apt install isc-dhcp-server
$ sudo nano /etc/dhcp/dhcpd.conf
Приводим файл примерно к такому виду.
default-lease-time 600;
max-lease-time 7200; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option routers 192.168.1.2; option domain-name-servers 192.168.1.2, 8.8.8.8; option broadcast-address 192.168.1.255;
}Пояснение
subnet 192.168.1.0 netmask 255.255.255.0 — определяет сеть и маску,
range 192.168.1.100 192.168.1.200; — диапазон адресов, который будет выдаваться сервером,
option routers 192.168.1.2; — адрес шлюза
option domain-name-servers 192.168.1.2, 8.8.8.8; — адреса DN серверов
option broadcast-address 192.168.1.255; — широковещательный адрес.
Перезапустим сервер
sudo /etc/init.d/isc-dhcp-server restart
Настройка TOR
Устанавливаем и открываем настройки.
$ sudo apt install tor
$ sudo nano /etc/tor/torrc
Добавляем строки
#Определяем подсеть в которую тор будет разрешать имена onion
#такой диапазон достаточно жирный. Можно смело сокращать.
VirtualAddrNetworkIPv4 10.0.0.0/8
#Включаем DNS от луковицы
AutomapHostsOnResolve 1
#Определяем порты прозрачного прокси и DNS
TransPort 0.0.0.0:9040
DNSPort 0.0.0.0:5353
#Не пользуемся выходными узлами из этих стран
ExcludeExitNodes {RU}, {UA}, {BY}
Настройка DNS
Если вам не нужна блокировка рекламы, то данный пункт можно не выполнять. Если вы хотите просто пользоваться DNS от тора, добавьте в файл /etc/tor/torrc строку DNSPort 0.0.0.0:53 и всё.
Но я буду резать рекламу, а значит устанавливаем и открываем настройки
$ sudo apt install bind9
$ sudo nano /etc/bind/named.conf.options
Приводим файл к следующему виду
options { directory “/var/cache/bind”; forwarders { 127.0.0.1 port 5353; }; listen-on { 192.168.1.2; 127.0.0.1; }; dnssec-validation auto; auth-nxdomain no; listen-on-v6 { none; };
};
Если ваш провайдер не химичит с DNS запросами, можете направить трафик на другие днс серверы. Например на сервера гугла:
forwarders { 8.8.8.8; 8.8.4.4; };
Теоретически должно работать по шустрее, чем через тор.
К дальнейшей настройке DNS вернемся чуть позже. Пока этого достаточно. А сейчас перезапустим службу.
sudo /etc/init.d/bind9 restart
Настройка iptables
Вся магия будет твориться именно здесь.
Суть идеи
- Формируем список IP адресов на которые мы хотим ходить через тор.
- Заворачиваем запросы к этим адресам на прозрачный прокси тора.
- Заворачиваем DNS запросы к ресурсам .onion на DNS тора
- Тор при резольвинге имен из зоны .onion возвращает IP адрес из подсети 10.0.0.0/8 (которую мы указали при настройке ТОР). Разумеется, эта зона не маршрутизируется в интернете и нам нужно завернуть обращения на эту подсеть на прозрачный прокси тора.
Лирическое отступлениеИзначально я полагал, что можно обойтись без перенаправления DNS запросов к .onion в iptables. Что можно настроить bind таким образом, чтобы он перенаправлял запросы на тор DNS и возвращал адреса из 10-й зоны. У меня не получилось так настроить.forwarders { 127.0.0.1 port 5353; };
Не приводит к желаемому результату, так же как выделение отдельной зоны “.onion” с forwarders на 127.0.0.1 port 5353.
Если кто-нибудь знает почему так происходит и как это исправить, напишите в комментариях.
Полагаю, что iptables уже установлен. Устанавливаем ipset. С помощью этой утилиты мы сможем управлять списком заблокированных адресов и заворачивать пакеты в прозрачный прокси тора.
sudo apt install ipset
Далее последовательно из под рута выполняем команды по настройке iptables. Я поместил эти команды в /etc/rc.local перед exit 0 и они выполняются каждый раз после загрузки.
Предлагаю и вам поступить аналогично.
#Создаем ipset для списка блокировок
ipset -exist create blacklist hash:ip #Редирект запросов DNS на TOR для доменов onion. Средствами bind9 такой редирект настроить не удалось
iptables -t nat -A PREROUTING -p udp –dport 53 -m string –hex-string “|056f6e696f6e00|” –algo bm -j REDIRECT –to-port 5353
iptables -t nat -A OUTPUT -p udp –dport 53 -m string –hex-string “|056f6e696f6e00|” –algo bm -j REDIRECT –to-port 5353 #Редирект на ТОР IP адресов из списка блокировок
iptables -t nat -A PREROUTING -p tcp -m set –match-set blacklist dst -j REDIRECT –to-port 9040
iptables -t nat -A OUTPUT -p tcp -m set –match-set blacklist dst -j REDIRECT –to-port 9040 #Редирект на тор для ресурсов разрезольвенных тором в локалку 10.0.0.0/8
#обычно это .onion
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.0/8 -j REDIRECT –to-port 9040
iptables -t nat -A OUTPUT -p tcp -d 10.0.0.0/8 -j REDIRECT –to-port 9040 ###########################################
#Все что ниже относится к настройке самого шлюза, а не к обходу
#блокировок
###########################################
#Включаем NAT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # Рзрешаем пинги
iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp –icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp –icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT # Отбрасываем неопознанные пакеты
iptables -A INPUT -m state –state INVALID -j DROP
iptables -A FORWARD -m state –state INVALID -j DROP # Отбрасываем нулевые пакеты
iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP # Закрываемся от syn-flood атак
iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP
iptables -A OUTPUT -p tcp ! –syn -m state –state NEW -j DROP #Разрешаем входящие из локалки и локальной петли, и все уже установленные соединения
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i enp7s0 -j ACCEPT
iptables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT #Остальные входящие запрещаем
iptables -P INPUT DROP #Разрешаем форвардинг изнутри локалки.
iptables -A FORWARD -i enp7s0 -j ACCEPT
iptables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT #Остальной форвардинг запрещаем
iptables -P FORWARD DROP
После перезагрузки мы должны получить шлюз, который:
- Выдает IP адреса и настройки сети клиентам.
- Раздает интернет.
- Резольвит имена через тор DNS.
- Резольвит имена .onion и позволяет посещать эти ресурсы через обычный браузер.
- Закрывает нас от входящих подключений.
Обхода блокировок пока нет, так как несмотря на то, что мы создали blacklist и настроили маршрутизацию, сам blacklist пока пустой. Настало время это исправить.
Заполняем blacklist
Создаем каталог в котором будет лежать скрипт.
# mkdir -p /var/local/blacklist
Создаем скрипт
# nano /var/local/blacklist/blacklist-update.sh
со следующим содержимым
со следующим содержимым#! /bin/bash #Переходим в каталог скрипта
cd $(dirname $0)
#Скачиваем с github репозиторий со списком заблокированных ресурсов
git pull -q || git clone https://github.com/zapret-info/z-i.git .
#Обрабатываем dump.csv так чтобы получился файл blacklist.txt с IP адресами заблокированных ресурсов
cat dump.csv | cut -f1 -d; | grep -Eo '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | sort | uniq > blacklist.txt
#Обрабатываем файл my-blacklist c именами доменов, которые не под блокировкой
#но на которые мы хотим ходить через тор. Дополняем blacklist.txt
dig +short -f my-blacklist >> blacklist.txt
#Очищаем ipset
ipset flush blacklist
#Запиcываем новые данные
cat blacklist.txt | xargs -n1 ipset add blacklist
Делаем скрипт исполняемым
# chmod +x /var/local/blacklist/blacklist-update.sh
создаем файл my-blacklist, который в дальнейшем будем наполнять вручную теми ресурсами, на которые хотим ходить через тор.
# echo lostfilm.tv > /var/local/blacklist/my-blacklist
Выполняем скрипт
# /var/local/blacklist/blacklist-update.sh
Скрипт работает долго, будь пациентом be patient. Теперь должна открываться флибуста должны работать заблокированные сайты. Добавляем в конец файла /etc/rc.local, но перед exit 0
#Ждем минуту чтобы тор полностью загрузился, подключился,
#заработал тор DNS
sleep 60
#Заполняем список запрещенных сайтов. Длительная операция.
/var/local/blacklist/blacklist-update.sh
Настраиваем фильтр рекламы
Суть идеи
- Устанавливаем и запускаем микро HTTP сервер, который слушает 80 и 443 порты и на любой запрос возвращает картинку png с одним прозрачным пикселем.
- Получаем список рекламных доменов.
- Настраиваем bind как авторитативный сервер для них.
- Заворачиваем все запросы на рекламные домены на наш HTTP сервер с чудесной картинкой.
Приступим. Создаем скрипт
# nano var/local/blacklist/ad-update.sh
с содержимым
#! /bin/bash
cd /etc/bind/
curl “https://pgl.yoyo.org/adservers/serverlist.php?hostformat=bindconfig&showintro=0&mimetype=plaintext” | sed 's/null.zone.file//etc/bind/db.adzone/g' > named.ad.conf
rndc reload
Делаем его исполняемым
# chmod +x /var/local/blacklist/ad-update.sh
и выполняем
# /var/local/blacklist/ad-update.sh
Создаем файл зоны
# nano /etc/bind/db.adzone
со следующим содержимым
$TTL 86400 ; one day @ IN SOA ads.example.com. hostmaster.example.com. ( 2014090102 28800 7200 864000 86400 ) NS my.dns.server.org A 192.168.1.2
@ IN A 192.168.1.2
* IN A 192.168.1.2
Добавляем в файл
# nano /etc/bind/named.conf
строку
include “/etc/bind/named.ad.conf”;
Применяем изменения
rndc reload
Настраиваем обновление списка доменов при загрузке. Для этого открываем файл /etc/rc.local и добавляем после sleep 60
/var/local/blacklist/ad-update.sh
Последние штрихи
Для периодического обновления списков, создадим файл
# nano /etc/cron.daily/blacklist-update
Со следующим содержимым
#!/bin/bash
#Загружаем свежий список рекламных доменов для фильтрации
/var/local/blacklist/ad-update.sh
#Заполняем список запрещенных сайтов. Длительная операция.
/var/local/blacklist/blacklist-update.sh
Делаем его исполняемым
# chmod +x /etc/cron.daily/blacklist-update
.
Замечание для пользователей десктопных версий Ubuntu
Несмотря на то, что целью было создать шлюз, который не требует настроек клиентов, в моем случае получилось не совсем так. В качестве рабочей операционной системы я использую десктопную Ubuntu 16.04.
Для настройки сети в ней используется утилита NetworkManager, которая по умолчанию настроена таким образом, что адрес DN сервера с DHCP сервера, а устанавливается как 127.0.1.1:53. На этом порту висит dnsmasq и только по ему известным правилам резольвит имена.
В обычной жизни это никак не мешает, а в нашем случае делает совершенно неработоспособной зону .onion
Чтобы это исправить нужно в файле /etc/NetworkManager/NetworkManager.conf закоментировать строку
dns=dnsmasq
вот так
#dns=dnsmasq
После перезагрузки все работает.
Заключение лишь бы не под стражу
Клиенты на андроид работают нормально без дополнительных настроек. Windows не проверял, так как не использую, но думаю, проблем возникнуть не должно.
Ограничения для firefox и iOs описаны здесь
Прошу прощения за сумбурное изложение. Дополнения, исправления, замечания приветствуются.
Спасибо за внимание.
Источник: https://pvsm.ru/linux/263170
Минимальный набор правил Iptables для типовых задач
Ликбез
Не смотря на то, что в интернете полно статей об Iptables, довольно часто вижу просьбы подсказать набор правил для конкретной ситуации.
Так как ситуации довольно типичные, то можно давать ссылку на данную заметку без объяснений. Повторяю, это не пересказ туториала, который обязателен к прочтению.
Он и так достаточно хорош, а только наборы правил для начинающих с минимальными комментариями. Кое-что, конечно, стоит сказать для понимания:
Policy, ключ -P. Цитата из туториала:
Другими словами, если пакет, пришедший на сетевой интерфейс, не описан ни одним правилом, то он обрабатывается политикой по умолчанию. Из этого следует, что настраивать Iptables (да и любой фаервол) можно двумя путямиполитиками: 1. Разрешено все, что не запрещено. Т.е. разрешено вообще все. 2.
Запрещено все, кроме того, что разрешено явно. Очевидно, второй подход правильней, что и будет рассматриваться далее. Полиси для OUTPUT предлагаю оставить ACCEPT, иначе придется огрести много глюков. Когда ты будешь знать Iptables достаточно хорошо — сам поймешь почему и сможешь настроить в DROP.
И еще важное замечание. Подразумевается, что правила применяются скриптом, а не вводятся с консоли по очереди. В последнем случае, после команды iptable -P INPUT DROP потеряется коннект установленной SSH сессии. При применении правил скриптом сессия не разорвется, т.к. далее идет правило разрешения принимать уже установленные соединения.
Перед применением правил необходимо очистить все существующие цепочки, таблицы и политики:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
Минимальный набор правил iptables для десктопа
Задача: запретить все входящие подключения. Исходящие не ограничены.
# Правила по умолчанию
iptable -P INPUT DROP
iptable -P FORWARD DROP
iptable -P OUTPUT ACCEPT
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные входящие соединения
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
Минимальный набор правил iptables для сервера с приложением
Задача: дать доступ до сервиса, пусть это будет веб сервер, работающий на 80 порту, все остальное запретить.
Так как это сервер, то необходимо разрешить коннект для управления по SSH. По аналогии можно открыть любой нужный порт или наборы портов.
# Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные входящие соединения
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH
iptables -A INPUT -p TCP –dport 22 -j ACCEPT
# Разрешить HTTP порт
iptables -A INPUT -p TCP –dport 80 -j ACCEPT
Минимальный набор правил iptables для шлюза
Задача: 1. Раздать интернет в локальную сеть при помощи NAT’а. 2. Разрешить обращение машин из локальной сети к внешним HTTP, HTTPS и DNS серверам 3. Пробросить порт на веб сервер, находящийся в этой локальной сети.
### Переменные
# Интерфейс, смотрящий в интернет
INET_IF=”eth0″
# Белый IP адрес, принадлежащий $INET_IF
INET_IP=”x.x.x.x”
# TCP порты, по которым разрешено ходить в интернет машинам из локальной сети
FORWARD_TCP_PORTS=”53,80,443″
# UDP порты, по которым разрешено ходить в интернет машинам из локальной сети
FORWARD_UDP_PORTS=”53″
# Локальная сеть
LOCAL_NET=”192.168.0.0/24″
# IP адрес локального веб сервера
WEB_SERVER=”192.168.0.10″
# Путь до sysctl
SYSCTL=”/sbin/sysctl -w”
# Включить в ядре форвард IPv4 пакетов
if [ “$SYSCTL” = “” ]
then echo “1” > /proc/sys/net/ipv4/ip_forward
else $SYSCTL net.ipv4.ip_forward=”1″
fi ### Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT ### INPUT # Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить принимать уже установленные соединения
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH
iptables -A INPUT -p TCP –dport 22 -j ACCEPT ### FORWARD
# Разрешить уже установленные пересылаемые соединения
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
# Разрешить машинам локальной сети ходить в интернет по указанным TCP портам
iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport –dport $FORWARD_TCP_PORTS -j ACCEPT
iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport –dport $FORWARD_TCP_PORTS -j ACCEPT
# Разрешить машинам локальной сети ходить в интернет по указанным UDP портам
iptables -A FORWARD -p UDP -s $LOCAL_NET -m multiport –dport $FORWARD_UDP_PORTS -j ACCEPT
iptables -A FORWARD -p UDP -d $LOCAL_NET -m multiport –dport $FORWARD_UDP_PORTS -j ACCEPT ### NAT
# Включить NAT для локальной подсети
iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT –to-source $INET_IP
# Пробросить порт на локальный веб сервер
iptables -t nat -A PREROUTING -p TCP -d $INET_IP –dport 80 -j DNAT –to-destination $WEB_SERVER:80
Надо отметить, что если пробрасывается порт, отличный от списка $FORWARD_TCP_PORTS, то необходимо его туда добавить, т.к. он будет дропаться политикой по умолчанию.
В итоге, скрипт iptables для шлюза будет выглядеть следующим образом. Отличается от предыдущих правил.
#!/bin/sh
# Очистить все правила
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X ### Переменные
# Интерфейс, смотрящий в интернет
INET_IF=”eth0″
# Белый IP адрес, принадлежащий $INET_IF
INET_IP=”x.x.x.x”
# Локальная сеть
LOCAL_NET=”192.168.0.0/24″
# IP адрес локального веб сервера
WEB_SERVER=”192.168.0.10″ # Включить в ядре форвард IPv4 пакетов
# Путь до sysctl
SYSCTL=”/sbin/sysctl -w”
if [ “$SYSCTL” = “” ]
then echo “1” > /proc/sys/net/ipv4/ip_forward
else $SYSCTL net.ipv4.ip_forward=”1″
fi ### Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT ### INPUT # Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить принимать уже установленные соединения
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH только из локальной сети
iptables -A INPUT -p TCP -s $LOCAL_NET –dport 22 -j ACCEPT
# Разрешить запросы к кэширующему DNS серверу только из локальной сети
iptables -A INPUT -p TCP -s $LOCAL_NET –dport 53 -j ACCEPT
iptables -A INPUT -p UDP -s $LOCAL_NET –dport 53 -j ACCEPT ### FORWARD
# Разрешить уже установленные пересылаемые соединения
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT # TCP порты, по которым разрешено ходить в интернет машинам из локальной сети
FORWARD_TCP_PORTS=”80,443″
# Разрешить машинам локальной сети ходить в интернет по указанным TCP портам
iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport –dport $FORWARD_TCP_PORTS -j ACCEPT
iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport –dport $FORWARD_TCP_PORTS -j ACCEPT ### NAT
# Включить NAT для локальной подсети
iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT –to-source $INET_IP
# Пробросить порт на локальный веб сервер на нестандартный порт
iptables -t nat -A PREROUTING -p TCP -d $INET_IP –dport 80 -j DNAT –to-destination $WEB_SERVER:8090
Вывод текущих правил
Посмотреть правила для таблицы filter, т.е. команда покажет основные правила iptables:
iptables -L -n
Для конкретной таблицы, например nat и mangle:
iptables -t nat -L -n
iptables -t mangle -L -n
Источник: https://notessysadmin.com/minimum-rules-for-iptables
Настройка Linux-файрвола iptables: Руководство для начинающих
Iptables — это межсетевой экран для операционных систем Linux. Успешно применять этот инструмент могут не только продвинутые пользователи Linux, но и новички. В этом руководстве представлено описание базовых настроек конфигурации этого мощного файрвола.
Что такое iptables
Как сказано выше, iptables является утилитой, выполняющей функции межсетевого экрана. Ее настройка производится в командной строке, с помощью правил iptables можно разрешать или блокировать прохождение трафика.
Когда происходит попытка установления соединения с текущей машиной, iptables просматривает список правил в списке, чтобы понять, как нужно поступить в этом случае. Если правила нет, то выполняется действие по умолчанию.
Как правило, itpables предустанавливается на всех Linux-дистрибутивах. Чтобы обновить утилиту, или установить ее, если по каким-то причинам она отсутствует в базовой поставке, нужно воспользоваться следующей командой:
sudo apt-get install iptables
Существуют и графические инструменты-альтернативы iptables, например Firestarter, но и работа в командной строке не является очень уж сложной.
Однако следует соблюдать особенную осторожность при настройке iptables через удаленное ssh-соединение, поскольку одна неверная команда может заблокировать возможность подключения к удаленному серверу — придется каким-то образом вносить изменения в настройки машины физически получив к ней доступ.
Типы правил
Существует три типа правил iptables — input, forward и output.
Input — Такие цепочки используются для контроля поведения входящих соединений. К примеру, если пользователь попробует подключиться к серверу по SSH, то iptables сравнит его IP-адрес со своим списком, чтобы разрешить или запретить доступ.
Forward — Правила этого типа используются для обработки входящих сообщений, конечный пункт назначения которых не является текущим сервером.
К примеру, в случае маршрутизатора, к нему подключаются многие пользователи и приложения, но данные не посылаются на сам маршрутизатор, они лишь передаются ему, чтобы он мог перенаправить их адресату.
Если вы не занимаетесь настройкой маршрутизации или NAT, то правила этого типа использовать в работе не будете.
Output — Такие цепочки используются для исходящих соединений. К прмиеру, если пользователь пытается отправинг запрос ping к сайту 1cloud.ru, iptables изучит цепочку правил, чтобы понять, что нужно делать в случае ping и этого сайт, и только потом разрешит или запретит соединение.
Важный момент
Даже в случае пинга внешних хостов, нужно не только отправить пакеты к ним, но и получить ответ. При работе с iptables важно помнить, что многие протоколы передачи данных требуют двусторонней коммуникации. Поэтому нужно настраивать правила соответствующим образом — случаи, когда новички забывают разрешить работу с сервером по SSH случаются очень часто.
Поведение по умолчанию
Прежде чем приступать к непосредственной настройке межсетевого экрана, следует определиться с тем, каким должно быть поведение цепочек правил по умолчанию. Другими словами, что iptables нужно делать в том случае, если соединение не подпадает ни под одно из сконфигурированных правил?
Увидеть текущие настройки iptables по умолчанию можно с помощью команды iptables –L:
В данном случае мы также использовали команду grep, чтобы получить более четкий вывод. Как показано на скриншоте, все три цепочки по умолчанию разрешают прием трафика.
Чаще всего такое поведение более предпочтительно. Если вы ничего не меняли в правилах, то так оно и должно быть по умолчанию.
Если же что-то менялось, а теперь нужно вернуть прежние настройки, то сделать это можно с помощью таких команд:
iptables –policy INPUT ACCEPT iptables –policy OUTPUT ACCEPT
iptables –policy FORWARD ACCEPT
Предварительно разрешил весь трафик, затем уже можно запрещать соединения с определенных IP-адресов и на определенные порты.
Если же предпочтительнее пойти по другому пути и сначала запретить весь трафик, а затем выборочно разрешать его, то нужно воспользоваться командами из списка ниже:
iptables –policy INPUT DROP iptables –policy OUTPUT DROP
iptables –policy FORWARD DROP
Действия с соединениями
После настройки поведения межсетевого экрана по умолчанию, можно переходить к созданию правил обработки трафика, чтобы iptables понимал, что делать с конкретным соединением. Ниже мы рассмотрим три основных вида действий с соединениями.
- Accept — разрешить соединение;
- Drop — игнорировать соединение, вести себя так, будто его никогда не было. Действие подходит для случаев, когда нужно сделать так, чтобы источник запроса не узнал о его блокировке.
- Reject — заблокировать соединение и отправить в ответ сообщение об ошибке. Действие подходит для тех случаев, когда владелец сервера хочет дать понять, что соединение заблокировано файрволом.
Вот так выглядит ответ на пинг в каждом из трех случаев
Соединение разрешено:
Соединение проигнорировано:
Соединение отклонено:
Разрешаем и блокируем конкретные соединения
Настроив политики цепочек, можно переходить к работе с конкретными соединениями. В нашем руководстве мы будет по умолчанию их отклонять, но можно и разрешать или игнорировать.
Мы будем использовать комманду iptables –A, чтобы добавлять правила к существующим цепочкам. Iptables будет начинать с начала списка и проходить по всем правилам, пока не найдет совпадение. Если нужно поместить какое-то правило перед уже имеющимся, то можно использовать команду iptables -I [цепочка] [номер], чтобы указать номер позиции в списке, которую должно занять новое правило.
Соединения с одного IP-адреса
Источник: https://1cloud.ru/help/linux/nastrojka_linus-firewall_iptables
21 пример использования iptables для администраторов
Файрвол в системе linux контролируется программой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.
Знак # означает, что команда выполняется от root. Откройте заранее консоль с рутовыми правами – sudo -i в Debian-based системах или su в остальных.
1. Показать статус
# iptables -L -n -v
Примерный вывод команды для неактивного файрвола:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (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
Для активного файрвола:
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 state INVALID 394 43586 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 93 17292 ACCEPT all — br0 * 0.0.0.0/0 0.0.0.0/0 1 142 ACCEPT all — lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all — br0 br0 0.0.0.0/0 0.0.0.0/0 0 0 DROP all — * * 0.0.0.0/0 0.0.0.0/0 state INVALID 0 0 TCPMSS tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 wanin all — vlan2 * 0.0.0.0/0 0.0.0.0/0 0 0 wanout all — * vlan2 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all — br0 * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes) pkts bytes target prot opt in out source destination Chain wanin (1 references) pkts bytes target prot opt in out source destination Chain wanout (1 references) pkts bytes target prot opt in out source destination
Где: -L : Показать список правил. -v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
-n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).
2. Отобразить список правил с номерами строк
# iptables -n -L -v –line-numbers
Примерный вывод:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all — 0.0.0.0/0 0.0.0.0/0 state INVALID 2 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 4 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) num target prot opt source destination 1 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 2 DROP all — 0.0.0.0/0 0.0.0.0/0 state INVALID 3 TCPMSS tcp — 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 4 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 5 wanin all — 0.0.0.0/0 0.0.0.0/0 6 wanout all — 0.0.0.0/0 0.0.0.0/0 7 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain wanin (1 references) num target prot opt source destination Chain wanout (1 references) num target prot opt source destination
Вы можете использовать номера строк для того, чтобы добавлять новые правила.
3. Отобразить INPUT или OUTPUT цепочки правил
# iptables -L INPUT -n -v # iptables -L OUTPUT -n -v –line-numbers
4. Остановить, запустить, перезапустить файрвол
Силами самой системы:
# service ufw stop
# service ufw start
Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила:
# iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # iptables -t mangle -F # iptables -t mangle -X # iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
Где: -F : Удалить (flush) все правила. -X : Удалить цепочку. -t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
-P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).
5. Удалить правила файрвола
Чтобы отобразить номер строки с существующими правилами:
# iptables -L INPUT -n –line-numbers # iptables -L OUTPUT -n –line-numbers # iptables -L OUTPUT -n –line-numbers | less
# iptables -L OUTPUT -n –line-numbers | grep 202.54.1.1
Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:
# iptables -D INPUT 3
Или найдем IP адрес источника (202.54.1.1) и удалим из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
Где:
-D : Удалить одно или несколько правил из цепочки.
6. Добавить правило в файрвол
Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
# iptables -L INPUT -n –line-numbers
Примерный вывод:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all — 202.54.1.1 0.0.0.0/0 2 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Чтобы вставить правило между 1 и 2 строкой:
# iptables -I INPUT 2 -s 202.54.1.2 -j DROP
Проверим, обновилось ли правило:
# iptables -L INPUT -n –line-numbers
Вывод станет таким:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all — 202.54.1.1 0.0.0.0/0 2 DROP all — 202.54.1.2 0.0.0.0/0 3 ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
7. Сохраняем правила файрвола
Через iptables-save:
# iptables-save > /etc/iptables.rules
8. Восстанавливаем правила
Через iptables-restore
# iptables-restore < /etc/iptables.rules
9. Устанавливаем политики по умолчанию
Чтобы сбрасывать весь трафик:
# iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP
# iptables -L -v -n
Источник: https://vasilisc.com/21-examples-iptables