Вопрос или проблема
Я пытаюсь заблокировать весь трафик к веб-серверу, кроме определенных подсетей. Я проверил множество постов и думал, что правильно настроил iptables, но по какой-то причине сайт все еще доступен вне подсетей, которые я определил в правилах. Может кто-нибудь прояснить, что я мог сделать не так? Я установил, что удаление правила 3 полностью останавливает доступ к сайту. Сам сайт находится в 10.10.0.0/16.
Цепочка INPUT (политика DROP 0 пакетов, 0 байт)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any any 10.10.0.0/16 anywhere
2 0 0 ACCEPT all -- any any 172.30.0.0/16 anywhere
3 0 0 ACCEPT all -- lo any anywhere anywhere
Цепочка FORWARD (политика ACCEPT 0 пакетов, 0 байт)
num pkts bytes target prot opt in out source destination
Цепочка OUTPUT (политика ACCEPT 0 пакетов, 0 байт)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any lo anywhere anywhere
Цель заключается в том, чтобы добавить различные белые списки публичных IP и ограничить доступ к сайту только для некоторых.
Правила были добавлены следующим образом:
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
iptables -I INPUT -s 10.10.0.0/16 -j ACCEPT
iptables -I INPUT -s 172.30.0.0/16 -j ACCEPT
iptables -P INPUT DROP
Порядок правил имеет значение в iptables. При использовании iptables -A
вы добавляете правила в конец набора правил. Но iptables -I
вставляет правило в верхнюю часть набора правил, если вы не указываете номер строки (вы этого не сделали). В результате правила не оцениваются в нужном порядке.
Вот пример конфигурации, который должен работать, основанный на этом посте. Очистите ваши правила перед этим, чтобы избежать дублирования.
iptables -P FORWARD DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 10.10.0.0/16 -j ACCEPT
iptables -A INPUT -s 172.30.0.0/16 -j ACCEPT
# добавьте еще несколько правил белого списка здесь
iptables -P INPUT DROP # Блокировать все, что мы не принимаем
Третье правило важно:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
иначе ваш сервер не получит ответы на соединения, которые он инициировал, например, DNS-запросы.
Кстати, iptables работает для IPv4, но не для IPv6, поэтому если ваш сервер поддерживает IPv6, возможно, у вас есть клиенты, подключающиеся через IPv6. Это возможно, если они подключаются по имени хоста, а не по IP-адресу, и имя хоста разрешается в действительный IPv6-адрес на вашем сервере. Вы, вероятно, об этом знаете, но многие люди все еще не знают, что iptables фильтрует IPv6-трафик (и атаки). Я бы добавил аналогичные правила ip6tables
, если это уместно для вашей конфигурации.
Ответ или решение
IPTables: Разрешение трафика только от определённых диапазонов
Настройка фильтрации трафика на веб-сервере с использованием iptables
— это важная задача для обеспечения безопасности вашей системы. В приведённом вами примере вы стремитесь заблокировать доступ к веб-серверу, разрешая его только из определённых подсетей. Давайте рассмотрим, как правильно настроить правила iptables
, чтобы добиться желаемого поведения.
Анализ предоставленных правил
На текущий момент ваш набор правил iptables
выглядит следующим образом:
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any any 10.10.0.0/16 anywhere
2 0 0 ACCEPT all -- any any 172.30.0.0/16 anywhere
3 0 0 ACCEPT all -- lo any anywhere anywhere
Ваши правила работают следующим образом:
- Допускают трафик из подсети
10.10.0.0/16
. - Допускают трафик из подсети
172.30.0.0/16
. - Разрешают все соединения, исходящие от локального интерфейса (
lo
).
Однако, когда вы устанавливаете политику по умолчанию для цепочки INPUT на DROP
, это означает, что всё остальное будет блокироваться. Но вы наблюдаете аномалию, так как сайт остаётся доступным и для IP-адресов, не входящих в указанные диапазоны. Это может быть связано как с порядком правил, так и с неправильным применением политик.
Правильная настройка правил
Важно, чтобы порядок правил определялся четко, так как iptables
обрабатывает их последовательно от первого к последнему. Ваша цель — ввести более ясные правила:
-
Очистите текущие правила. Это убережёт вас от случайных конфликтов:
iptables -F
-
Настройте политику по умолчанию для INPUT на DROP:
iptables -P INPUT DROP
-
Разрешите установленные и связанные соединения. Это правило критически важно — оно позволяет вашему серверу получать ответы на уже инициированные соединения:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-
Разрешите локальные соединения:
iptables -A INPUT -i lo -j ACCEPT
-
Добавьте разрешения для необходимых подсетей:
iptables -A INPUT -s 10.10.0.0/16 -j ACCEPT iptables -A INPUT -s 172.30.0.0/16 -j ACCEPT
-
Добавьте дополнительные правила для публичных IP, если это необходимо:
Например, если вам нужно разрешить доступ с конкретного публичного IP:
iptables -A INPUT -s 203.0.113.5 -j ACCEPT
-
Проверьте настройки:
После внесения изменений вы можете проверить ваши правила:
iptables -L -v
IPv6
Не забывайте, что iptables
управляет трафиком IPv4, а для IPv6 необходимо использовать ip6tables
. Убедитесь, что ваши команды применяются к обоим протоколам, если это применимо к вашему окружению.
Заключение
Следуя приведённым шагам, вы сможете обеспечить доступ к вашему веб-серверу только с тех IP-адресов и подсетей, которые вы определили, и заблокировать доступ всем остальным. Правильный порядок правил и акцент на управлении состоянием соединений критичен для стабильной работы вашего сервера. Настройка правил iptables
требует внимательности, но при правильном подходе вы сможете создать надёжную защиту для своей инфраструктуры.