IPTables – Разрешить только трафик из определенных диапазонов

Вопрос или проблема

Я пытаюсь заблокировать весь трафик к веб-серверу, кроме определенных подсетей. Я проверил множество постов и думал, что правильно настроил 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            

Ваши правила работают следующим образом:

  1. Допускают трафик из подсети 10.10.0.0/16.
  2. Допускают трафик из подсети 172.30.0.0/16.
  3. Разрешают все соединения, исходящие от локального интерфейса (lo).

Однако, когда вы устанавливаете политику по умолчанию для цепочки INPUT на DROP, это означает, что всё остальное будет блокироваться. Но вы наблюдаете аномалию, так как сайт остаётся доступным и для IP-адресов, не входящих в указанные диапазоны. Это может быть связано как с порядком правил, так и с неправильным применением политик.

Правильная настройка правил

Важно, чтобы порядок правил определялся четко, так как iptables обрабатывает их последовательно от первого к последнему. Ваша цель — ввести более ясные правила:

  1. Очистите текущие правила. Это убережёт вас от случайных конфликтов:

    iptables -F
  2. Настройте политику по умолчанию для INPUT на DROP:

    iptables -P INPUT DROP
  3. Разрешите установленные и связанные соединения. Это правило критически важно — оно позволяет вашему серверу получать ответы на уже инициированные соединения:

    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  4. Разрешите локальные соединения:

    iptables -A INPUT -i lo -j ACCEPT
  5. Добавьте разрешения для необходимых подсетей:

    iptables -A INPUT -s 10.10.0.0/16 -j ACCEPT
    iptables -A INPUT -s 172.30.0.0/16 -j ACCEPT
  6. Добавьте дополнительные правила для публичных IP, если это необходимо:

    Например, если вам нужно разрешить доступ с конкретного публичного IP:

    iptables -A INPUT -s 203.0.113.5 -j ACCEPT
  7. Проверьте настройки:

    После внесения изменений вы можете проверить ваши правила:

    iptables -L -v

IPv6

Не забывайте, что iptables управляет трафиком IPv4, а для IPv6 необходимо использовать ip6tables. Убедитесь, что ваши команды применяются к обоим протоколам, если это применимо к вашему окружению.

Заключение

Следуя приведённым шагам, вы сможете обеспечить доступ к вашему веб-серверу только с тех IP-адресов и подсетей, которые вы определили, и заблокировать доступ всем остальным. Правильный порядок правил и акцент на управлении состоянием соединений критичен для стабильной работы вашего сервера. Настройка правил iptables требует внимательности, но при правильном подходе вы сможете создать надёжную защиту для своей инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...