LINUX.ORG.RU
ФорумAdmin

Мой вариант файервола на iptables для vps-ок

 ,


3

4

Привет, лор!

Прочитав работу «Techniques and Countermeasures of TCP-IP OS Fingerprinting on Linux Systems» и мануал Block and Slow Nmap with Firewalls, решил, что нужно разработать шаблон iptables для защиты своих vps-ок. Цель – по возможности скрыть пассивные отпечатки OS, а также фильтрация нежелательных подключений. Работа таблиц тестировалась в том числе и на реликтовом 2.6 ядре.

#!/bin/bash

# 1
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
ip6tables -P INPUT DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

# 2
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -N NMAP
iptables -N SSH

# 3
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

# 4
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT ! -i lo -s 127.0.0.0/8 -j DROP
iptables -A INPUT -m state --state UNTRACKED,INVALID -j DROP
iptables -t nat -A POSTROUTING -s XX.XX.XX.XX/24 -j SNAT --to-source XX.XX.XX.XX --persistent
iptables -A INPUT -i tun+ ! -s XX.XX.XX.XX/32 -p tcp --dport XXXXX -j REJECT --reject-with tcp-reset
iptables -A INPUT -i tun+ -j ACCEPT

# 5
iptables -A INPUT -p udp --dport XXXXX ! --sport 0 -m state --state NEW ! -f -m u32 --u32 "0>>22&0x3C@5&0xFF=0x38 && 0>>22&0x3C@34=0x3F3" -j ACCEPT

# 6
iptables -A INPUT -m recent --update --seconds 604800 --reap --name nmap -j DROP

# 7
iptables -A INPUT -p tcp -m multiport --dports XXXXX,XXXXX -m tcpmss --mss YYYY -m state --state NEW -j SSH
iptables -A SSH -m recent --update --seconds 604800 --reap --name ssh
iptables -A SSH -m recent --set --name ssh
iptables -A SSH -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
iptables -A SSH -j DROP

# 8
iptables -A INPUT -p icmp --icmp-type 8 -m length --length XXXX -m limit --limit 1/second --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-unreachable

# 9
iptables -A INPUT -p tcp --sport 0 -j NMAP
iptables -A INPUT -p udp --sport 0 -j NMAP
iptables -A INPUT -m state --state NEW -f -j NMAP
iptables -A INPUT -p tcp -m osf --genre NMAP -j NMAP
iptables -A INPUT -p udp -m length --length 20:28 -j NMAP
iptables -A INPUT -p tcp ! --tcp-flags ALL SYN -m state --state NEW -j NMAP
iptables -A INPUT -p tcp --tcp-flags SYN SYN -m state ! --state NEW -j NMAP
iptables -A NMAP -m recent --set --name nmap -j DROP

# 10
iptables -t mangle -A OUTPUT -p tcp -j ECN --ecn-tcp-remove
iptables -t mangle -A OUTPUT -p tcp -j DSCP --set-dscp-class XX
iptables -t mangle -A OUTPUT -p tcp --syn -j TCPMSS --set-mss XXXX
iptables -t mangle -A OUTPUT -p tcp -j TTL --ttl-set 128
iptables -t mangle -A OUTPUT -p udp -j TTL --ttl-set 32
iptables -t mangle -A OUTPUT -p icmp -j TTL --ttl-set 128

# 11
# XXXXX service
iptables -A INPUT -p tcp --dport XXXXX -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport XXXXX -m state --state NEW -j ACCEPT

exit 0
  • #1 Настройка политик по умолчанию. ipv6 обычно отключена, но ip6tables -P INPUT DROP оставляю на случай, если забуду v6 выключить.

  • #2 Очистка таблиц перед настройкой правил.

  • #3 Подтверждённые соединения больше не фильтруются. Без RELATED всё замечательно работает.

  • #4 Внутренний трафик должен приходить только с устройства lo. -j SNAT для vpn. ! -s XX.XX.XX.XX/32 на некоторые порты доступ закрыт в том числе друзьям внутри виртуальной сети. Остальной трафик внутри vpn -i tun+ принимается без фильтраций.

  • #5 Мне нужен стабильный доступ к vpn даже тогда, когда мой ip-шник занесён в список блокировки (во время тестов такое случается частенько). Есть подключение по vpn – доступ к ssh гарантирован. Так как этот порт не прикрыт чёрным списком, ему назначены дополнительные проверки: первый пакет не должен быть сегментирован, например. Модуль u32 – это нечто! Оооочень доступный мануал от Bill Stearn здесь. Меня напрягало, что OpenVPN отвечает на обе доступные пробы nmap -sV. Благо, первый openvpn udp пакет обладает уникальными для каждой конфигурации признаками в зависимости от сгенерированнного Diffie–Hellman ключа. 0>>22&0x3C@5&0xFF=0x38 матчится байт-маркер OpenVPN, 0>>22&0x3C@34=0x3F3 – бред, чтобы не копировали: здесь правило будет у всех разное, можно только его оставить. Ищется просто с помощью tcpdump, wireshark и т. д. В результате vps-ка больше не отвечает ни на какие пробы запущенной на порту службы.

  • #6 Чёрный список со сроком жизни каждой записи в одну неделю.

  • #7 К сожалению, первый пакет tcp соединения (ssh) невозможно фильтровать модулем u32 – пакет обычно пустой, а провайдер режет бит TOS. Поэтому придумал помечать SYN пакеты выставлением --mss (принимает значения до 1460 включительно). Выбрал нестандартное значение и voilà: для обычного сканера порт выглядит всегда закрытым, и не нужно городить «port-knocking» и прочие «f2b». Доступ к ssh разрешён только по сертификату + подключаюсь всегда только с одной машины. Разумеется, у клиента прописано правило -t mangle -A POSTROUTING -d XX.XX.XX.XX -p tcp --syn -m multiport --dports XXXXX,XXXXX -j TCPMSS --set-mss YYYY. Это резервное правило, потому что всегда подключаюсь к ssh по vpn. -m limit --limit 1/minute нужен для замедления атак на случай, если злоумышленник подберёт значение mss. Таблица -m recent --set --name ssh не участвует в блокировках, но мне нужна, чтобы я начал вовремя паниковать (время от времени просматриваю логи блокировок).

  • #8 icmp отвечает только если матчится --length XXXX. Во всех остальных случаях не drop, а --reject-with icmp-host-unreachable – никого нет дома! На мой взгляд это эффективнее.

  • #9 Детектор tcp и udp сканеров. Ответ на пакет с запрещённого 0-го порта – пассивный признак OS. Сканирование пустыми udp пакетами – верный признак nmap. Первый пакет tcp соединения должен быть помечен SYN флагом, и только так! Он не должен быть сегментирован. Всё остальное от лукавого!
    Меня не интересует блокировка случайных сканеров: каждый день они стучатся тысячами на 22 и т. п. порты. Постучатся разок, да и уходят. А вот nmap-щики отличаются настырностью, как о том свидетельствуют логи. Скан-товарищи появляются нечасто: 1 в день максимум, но таких лучше выявлять и отправлять в ж… на одну неделю.

  • #10 Затирание пассивных признаков OS. Цепочка -A OUTPUT транзитный трафик не изменяет, только ответы и соединения самого сервера. Бит TOS (он же ECN + DSCP) менять нужно 100%, он в дефолте выдаёт linux. «–set-mss XXXX» выставляю любой, который матчится скриптами nmap (благо исходники на гитхабе можно просмотреть и подобрать подходящее значение). По моему наблюдению удачными значениями являются 1000, 1400 и 1460. «–ttl-set 128» чаще бывает на M$. В итоге nmap после сканирования с пристрастием уверенно рапортует, что 98% на устройстве работает OS M$ 2000 server, а зная операционку, уже понятно какие надо применять эксплойты ;)

  • #11 Прописаны открытые порты для моих сервисов. Там их куча, оставил образец.

Изучил все расширения iptables. Больше ничего полезного для себя не нашёл. Если есть ещё интересные способы прикрытия файервола на iptables – прошу поделиться опытом. Может быть какие-то неочевидные ошибки допустил – прошу поправить. Буду рад, если мой опыт кому-нибудь пригодится.
От атак «я-у-мамы-кул-хацкеров» такие правила должны защитить. В случае с профессионалами, наверно, это не защита, но таким до моих vps-ок нет никакого дела :)

★★

Ответ на: комментарий от init_6

iptables против скана от boatman. 2005й год.

Так, разберусь чуть позже – бежать надо. Меня вот другое смущает: на форуме находил, что в матче «-f» смысла нет, потому что до filter таблицы доходят уже дефрагментированные пакеты. Так ли это? И зачем тогда эта опция есть? В какой таблице она работает?

rmu ★★
() автор топика

Такие заметки лучше постить на совем блоге. Т.к. здесь эта тема потеряется среди других подобных.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

Это же ещё неготовое решение – я за советами пришёл. Один-два спеца заглянут в тему – уже будет классно. И вот тогда уже можно в блог отправлять.

rmu ★★
() автор топика

А нахрена этот архаизм если есть nft?

Да и сама цель

скрыть пассивные отпечатки OS

более чем странная. В смысле нахрена?

zabbal ★★★★★
()
Ответ на: комментарий от zabbal

А нахрена этот архаизм если есть nft?

Какие в nft есть киллер-фичи, ради которых стоит переучиваться на синтаксис, кардинально отличный от iptables? У меня нет высоконагруженных серверов.

rmu ★★
() автор топика
Ответ на: комментарий от init_6

Посмотрел – ничего интересного нет, а нагромождение правил со флагами заменяют две строчки:

iptables -A INPUT -p tcp ! --tcp-flags ALL SYN -m state --state NEW -j NMAP
iptables -A INPUT -p tcp --tcp-flags SYN SYN -m state ! --state NEW -j NMAP
rmu ★★
() автор топика
Ответ на: комментарий от rmu

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

zabbal ★★★★★
()
Ответ на: комментарий от ValdikSS

С этим ПО гораздо удобней поддерживать правила iptables.

Не понял, зачем это нужно? Это же то же самое, только нужно ещё учить синтаксис этой тулзы. Опции iptables вполне логичные и понятные, на мой взгляд.

rmu ★★
() автор топика
Ответ на: комментарий от zabbal

там и без того плюшек хватает

Посмотри вот здесь – это с их вики страницы.

Упрощённый синтаксис? Меня таковой у iptables не напрягает. Раз написал правила и забыл.

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

IPv6 я отключаю. Мне пока не нужен.

Где, какие у nft киллер-фичи? Всё это разбивается о то, что, например, одна из моих vps-ок работает на ядре 2.6. И проверенные годами iptables одинаково хорошо работают и на новых и на старых машинах.

rmu ★★
() автор топика
Последнее исправление: rmu (всего исправлений: 2)
Ответ на: комментарий от rmu

Эта утилита позволяет писать правила iptables с переменными, циклами, функциями и инклюдами.

ValdikSS ★★★★★
()
Ответ на: комментарий от Tanger

Ну как бы да, тогда уж логичнее на nftables переходить. Не в моём случае, конечно.

rmu ★★
() автор топика
Ответ на: комментарий от vodz

Как раз в тему подогнали Умеет ли nftables в string match?

Угу. Уже видел и весьма удивился.
Когда писал первый пост, я вспомнил замены ipset, как по мне достаточно красиво сделали, поэтому автоматом транслировать из старого не могут.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.