Вопрос или проблема
Я хочу написать правила как для syn proxy, так и для connlimit. Я хочу, чтобы пакеты сначала отправлялись на syn proxy из-за проблем с производительностью.
Вот пример правила.
#правило syn proxy
iptables -t raw -A PREROUTING -i eth1 -p tcp -m tcp --syn -j CT --notrack
iptables -t filter -A FORWARD -i eth1 -p tcp -m tcp -m state --state INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -t filter -A FORWARD -i eth1 -m state --state INVALID -j DROP
#правило connlimit
iptables -t filter -A FORWARD -i eth1 -p tcp -m tcp --syn -m connlimit --connlimit-above 100 -j DROP
Проблема в том, что поскольку пакеты syn (пакеты, открывающие соединение) не могут пройти за пределы правила syn proxy, они не могут соответствовать connlimit. Я ищу альтернативный способ написать connlimit так, чтобы он работал с synproxy.
Я использовал то же правило (synproxy на мосту), но понял, что обычный tcp-запрос не будет работать, т.е. после внедрения правил synproxy ВСЕ запросы syn были заблокированы. Я мониторил это с помощью tcpdump. Интересно, работают ли ваши правила synproxy как ожидается?
Ответ или решение
Для эффективного использования правил syn proxy и connlimit в iptables важно правильно настроить порядок и условия, при которых эти правила будут действовать. Ваша задача заключается в том, чтобы правильно отправлять SYN-пакеты на обработку синхронизации (SYNPROXY) без блокировки других соединений, в то же время ограничивая количество соединений от одного IP-адреса. Рассмотрим, как это можно сделать.
1. Настройка правил SYNPROXY и connlimit
Сначала определим цель каждого правила:
- SYNPROXY применяется для защиты от SYN-флуд-атак путем отслеживания TCP-сессий и управления входящими соединениями.
- connlimit используется для ограничения числа одновременных соединений от одного IP-адреса.
2. Упорядочение правил
Поскольку SYN-пакеты, обрабатываемые через SYNPROXY, не могут достигать других правил, необходимо изменить порядок правил таким образом, чтобы возможность применения connlimit осталась доступной.
Вот пример того, как можно организовать правила:
# Устанавливаем правило для работы с SYN-пакетами и добавляем обработку connlimit
iptables -t raw -A PREROUTING -i eth1 -p tcp -m tcp --syn -j CT --notrack
# Добавляем правило для ограничения соединений
iptables -t filter -A FORWARD -i eth1 -p tcp -m tcp --syn -m connlimit --connlimit-above 100 -j DROP
# Применяем SYNPROXY для SYN-пакетов
iptables -t filter -A FORWARD -i eth1 -p tcp -m tcp -m state --state INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -t filter -A FORWARD -i eth1 -m state --state INVALID -j DROP
3. Пояснение порядка правил
-
Обработка SYN-пакетов в таблице raw: Это первое правило использует модуль CT для отслеживания соединений, что позволяет игнорировать отслеживание состояния для этих пакетов.
-
Применение connlimit перед SYNPROXY: Правило connlimit следует добавить до применения SYNPROXY, чтобы SYN-пакеты могли быть обработаны для ограничения соединений. В этом случае мы блокируем все SYN-пакеты от IP-адресов, которые превышают лимит в 100 соединений.
-
Обработка SYNPROXY: После этого мы обрабатываем пакеты SYN через SYNPROXY, управляя состоянием соединений.
4. Дополнительные меры
- Тестирование доступа: После настройки правил важно провести тестирование с помощью tcpdump или других инструментов, чтобы убедиться, что пакеты SYN корректно обрабатываются и не блокируются.
- Мониторинг: Регулярно мониторьте журналы системы и использование сети, чтобы убедиться в отсутствии неожиданных блокировок или отказов в связи.
Заключение
Правильная комбинация и порядок правил iptables поможет обеспечить безопасность вашей сети, одновременно ограничивая количество соединений для каждого IP-адреса. Внимательно следите за работой системы после внесения изменений, чтобы убедиться, что правила действуют так, как задумано, не создавая при этом дополнительных проблем.