Дмитрий Кайдаш
29.10.2019
7860

Создание задач в сервисе «planfix» через отправку e-mail.

Настройка iptables Описание: в данной статье будут описаны два скрипа управления межсетевым экраном iptables, а так же основные средства внесения настроек и изменений. Базовая настройка iptables через скрипт shielder.sh Не всегда удобно оперировать с консолью в целях настройки файервола: требуется держать в памяти команды редактирования, их передаваемые им аргументы, распределение по интерфейсам сервера и прочие […]

Задачи в сервисе «planfix» через e-mail

Настройка iptables

Описание: в данной статье будут описаны два скрипа управления межсетевым экраном iptables, а так же основные средства внесения настроек и изменений.

  1. Базовая настройка iptables через скрипт shielder.sh

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

#!/bin/bash

# Приложение
IPT="iptables"

# Внешний интерфейс
WAN=eth1

# Локальная сеть
LAN=eth0

# Очищаем правила
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Запрещаем все, что не разрешено
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# Разрешаем localhost и локалку
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i $LAN -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o $LAN -j ACCEPT

# Рзрешаем пинги
$IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Разрешаем исходящие подключения сервера
$IPT -A OUTPUT -o $WAN -j ACCEPT
#$IPT -A INPUT -i $WAN -j ACCEPT

# разрешаем установленные подключения
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Отбрасываем неопознанные пакеты
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Отбрасываем нулевые пакеты
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Закрываемся от syn-flood атак
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

# Блокируем доступ с указанных адресов
#$IPT -A INPUT -s 84.122.21.197 -j REJECT

# Пробрасываем порт в локалку
#$IPT -t nat -A PREROUTING -p tcp --dport 23543 -i ${WAN} -j DNAT --to 10.1.3.50:3389
#$IPT -A FORWARD -i $WAN -d 10.1.3.50 -p tcp -m tcp --dport 3389 -j ACCEPT

# Разрешаем доступ из локалки наружу
$IPT -A FORWARD -i $LAN -o $WAN -j ACCEPT
# Закрываем доступ снаружи в локалку
$IPT -A FORWARD -i $WAN -o $LAN -j REJECT

# Открываем порты
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH"
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "WEB"
$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "WEB"
$IPT -A INPUT -p udp -m udp --dport 5060 -j ACCEPT  -m comment --comment "SIP"
$IPT -A INPUT -p udp -m udp --dport 4569 -j ACCEPT -m comment --comment "IAX2"
$IPT -A INPUT -p udp -m udp --dport 36600:39999 -j ACCEPT  -m comment --comment "RTP"

# Сохраняем правила
/sbin/iptables-save  > /etc/sysconfig/iptables
Скрипт предоставлен в ознакомительных целях, его не следует использовать на рабочих серверах в неизменном виде.

Как видно, в нём уже хранятся некоторые правила разрешения и запрета передачи пакетов по портам и ip-адресам. Внося некоторые правки, копируя уже существующие правила или дописывая собственные гораздо удобнее производить настройки. А главное в разы сокращается возможность «отрезать» самому себе доступ.

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

2. Использование скрипта different.sh

Что же делать если правки iptables уже, возможно были произведены в «ручном режиме»? Применение скрипта настройки – сотрёт все правила установленные до его запуска. Можно, конечно, выполнить «выгрузку» текущих правил, но можно сделать  и иначе: воспользоваться скриптом сравнения этой самой «выгрузки» и скрипта настройки shielder.sh Вот его исходный код:

#!/bin/bash

clear

r="\033[0;31m"
g="\033[0;32m"
y="\033[0;33m"
n="\033[0m"

echo -e "${y}[ status : start ] ${n}"
echo -e "${y}[ status : create file] ${n}"

service iptables save
cp fw_iptables.sh fw_iptables.sh.backup
iptables-save > firewall-to-verifing

# ======= Проверка успешности выгрузки =======
if [ -f "firewall-to-verifing" ]; then
	echo -e "${g}Файл текущей конфигурации файервола успешно создан и открыт ${n}"
else
	echo -e "${r}Не удалось создать и\или найти файл настроек файервола. Выполнение будет прервано${n}"
	echo -e "${y}[ status : faild ] ${n}"
	exit 0
fi

echo -e "${y}[ status : start verifing ip-address ] ${n}"

# ======= Проверка ip адресов: выгрузка -> скрипт =======
yi=0
ni=0
while read line
do
	line=${line##*'-s'}
        line=${line%%'-i'*}
        line=${line%%'-j'*}
	line=${line%%'/'*}
	if [ "${line:0:1}" == " " ]; then
		try=$( fgrep "$line" /root/fw_iptables.sh )
		if [ "$try" == "" ]; then
			echo -e "${r}Не найден в fw_iptables.sh :$line ${n}"
			let "ni=ni+1"
		else
			echo -e "${g}Найден в fw_iptables.sh :$line ${n}"
			let "yi=yi+1"
		fi
	fi
done < firewall-to-verifing

echo -e "${y}[ status : start verifing ports ] ${n}"

# ======= Проверка портов: выгрузка -> скрипт =======
yp=0
np=0
while read line
do
        line=${line##*'-m tcp'}
        line=${line##*'-m udp'}
        line=${line##*'-m icmp'}
        line=${line##*'-m limit'}
        line=${line%%' -j'*}
	if [ "${line:0:1}" == " " ] && [ "${line:0:4}" != " --t" ] && [ "${line:0:2}" != " !" ]; then
		# ------------ Подмена номеров портов icmp на названия ------------
		if [ "${line: -3}" == "e 8" ]; then
			line=${line%?}"echo-request"
		fi
		if [ "${line: -3}" == "3/4" ]; then
                        line=${line%???}"fragmentation-needed"
                fi
		if [ "${line: -3}" == " 11" ]; then
                        line=${line%??}"time-exceeded"
                fi
		# -----------------------------------------------------------------

                try=$( fgrep "$line" /root/fw_iptables.sh )
                if [ "$try" == "" ]; then
                        echo -e "${r}Не найден в fw_iptables.sh :$line ${n}"
                        let "np=np+1"
                else
                        echo -e "${g}Найден в fw_iptables.sh :$line ${n}"
                        let "yp=yp+1"
                fi
        fi
done < firewall-to-verifing

echo -e "${y}[ status : result ] ${n}"

let "yp=yp+yi"
let "np=np+ni"

echo -e "${g}Обнаружено : "$yp" совпадений ${n}"
echo -e "${r}Обнаружено : "$np" различий ${n}"

echo -e "${y}[ status : verdict ] ${n}"

if [ "$np" == 0 ]; then
	echo -e "${g}Конфигурация файервола соответствует скрипту настройки fw_iptables.sh, вмешательство не требуется ${n}"
else
	echo -e "${r}Конфигурация файервола не соответствует скрипту fw_iptables.sh, требуется настройка ${n}"
fi

echo -e "${y}[ status : completed ] ${n}"
Если вы не уверены в соответствии скрипта текущим настройкам, рекомендуем выполнять настройку выгрузкой, или обратиться в тех.поддержку. При выполнении «пустого» скрипта будет запрещен доступ всем подсетям и портам.
Скрипт приведён в ознакомительных целях и непригоден для копирования и использования «как есть».

Для применения следует скопировать в файл на целевой системе с расширением filename.sh, сделать исполняемым, при необходимости повысить права и выполнить из консоли через

./filename.sh

Выполнение скрипта возможно из любой директории. При запуске создается файл выгрузки, копирование файла скрипта fw_iptables.sh в fw_iptables.backup и построчное сравнение двух файлов.

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

Пример работы с нормальным результатом

Соответствие
Соответствие

Пример работы с портом который есть в выгрузке, но отсутствует в скрипте и, как следствие, при выполнении скрипта будет закрыт:

Несоответствие
Несоответствие
  • Установка и настройка «с нуля»

Важным шагом после установки новой системы является ее защита от вредоносного ПО. Особенно это касается серверов и прочего оборудования подключенного к сети Интернет. Пример команд выполняется от root-пользователя или с префиксом «sudo…»

Набор команд установки в систему:

Debian/Ubuntu

apt-get install ipset -y
apt-get install iptables -y

CentOS

yum install ipset –y
yum install iptables –y

Команды запуска и остановки имеют следующий вид:

Debian/Ubuntu

/etc/init.d/iptables start [stop]

CentOS

service iptables start [stop]

Для отображения настроенных разрешений служит команда:

iptables –L -nv

На данном этапе получим примерно такой результат

Iptables выключен
Iptables выключен

Заметим, что по умолчанию, с момента установки присутствуют три цепочки: INPUT, FORWARD и OUTPUT, которые в данный момент не содержат в себе правил. Приступим к созданию.

Есть два типа цепочек, разрешающие и запрещающие: ACCEPT и DROP соответственно. Рассмотрим на примерах.

iptables --policy INPUT DROP

Запрещает весь входящий трафик.

Если вы проводите удаленную настройку, например средствами ssh подключения, то следует соблюдать осторожность. Команды, аналогичные приведенной выше, разорвут доступ и предотвратят дальнейшие попытки подключений. Чтобы обезопаситься, следует открывать второе подключение. До момента перезапуска файервола, действующие подключения не будут сброшены.

Отмена предыдущей команды:

iptables --policy INPUT ACCEPT

То же самое применимо и для остальных цепочек. Т.е. в целом синтаксис:

iptables --policy [INPUT|FORWARD|OUTPUT] [DROP|ACCEPT]

То что следует знать, но не применять. Для удаления правил служит параметр –F.

iptables –F [|INPUT|FORWARD|OUTPUT]

Пустой первый блок – это не ошибка. Если применить команду без указания цепочки, будут удалены все правила iptables.

Но на текущий момент у нас все еще нет этих правил. Добавляем.

iptables –A INPUT –p tcp --dport 80 –j ACCEPT

Поясним:

«-A» параметр указывающий на добавление нового правила

«INPUT» цепочка, которой правило будет принадлежать

«-p tcp» протокол передачи ([p]rotocol)

«—dport 80» ([d]estination [port])

Этим действием мы разрешили доступ по 80-у порту, который используется для доступа к web-серверу Apache или его аналогам.

Для примера закрытия порта рассмотрим запрет на исходящие обращения по ssh:

iptables –A OUTPUT –p tcp --dport 22 –j DROP

Разрешение и запрет ip-адресов:

iptables –A INPUT –s 192.168.170.0/24 –j [ACCEPT|DROP]

Возможно комбинирование с портом:

iptables –A OUTPUT –p tcp –s 0/0 --dport 22 –j [ACCEPT| DROP]

Практический пример применения iptables: разрешим пинг (icmp) на и с нашего сервера.

iptables –A [INPUT|OUTPUT] –p  icmp --icmp-type 8 –j ACCEPT

4. Внесение изменений

Таким образом межсетевой экран настроен и функционирует, защищая нас от атак. Разберем настройку действующего файервола. Для этого нам понадобится:

  1. Применить правила которые были установлены ранее
service iptables save

2. Выгрузить настройки правил в файл. Путь и имя файла могут быть произвольными.

iptables-save > /tmp/firewall_rules

3. Произвести необходимые изменения в файле.

nano /tmp/firewall_rules

4. Восстановить правила из файла.

iptables-restore < /tmp/firewall_rules

5. Применить правила.

service iptables save

6. Перезапустить службы iptables и fail2ban

service iptables restart && service fail2ban restart

5. Другие полезные функции

Защита от «DDOS» атак средствами iptables.

iptables –A INPUT –p tcp --dport 80 –m limit --limit 10/minute --limit-burst 50 –j ACCEPT

Где:

«—limit 10/minute» период времени

«—limit-burst 50» количество успешных запросов

Логика: если в течении 10 минут превышен порог в 50 пакетов, то правило уже не выполнится. В связи с чем есть сложность: это правило должно сопровождаться запрещающей парой. Для примера выше это будет выглядеть как:

iptables –A INPUT –p tcp --dport 80 –m limit --limit 10/minute --limit-burst 50 –j ACCEPT
iptables –A INPUT –p tcp --dport 80 –j DROP

Защита от атаки вида «Ping-of-death»

iptables –A FORWARD –p tcp –icmp-type echo-request –m limit --limit 1/second –j ACCEPT
iptables –A FORWARD –p tcp –icmp-type echo-request –j DROP

Логика: запретить ответ на пинг (icmp) более чем раз в секунду.

Защита от «сканера портов»

iptables –N quarantine
iptables –A quarantine –p tcp --tcp-flags SYN,ACK,FIN,RST –m limit --limit 1/second –j RETURN
iptables –A quarantine –j DROP

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

Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

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

Безопасен в использовании.

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

Надежен в эксплуатации.

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

Гибкий в настройке.

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

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.