Назад | Перейти на главную страницу

Упрощение поддержки iptables

Моя сеть полностью заблокирована, за исключением нескольких сайтов, занесенных в белый список. Все это делается через iptables, который выглядит примерно так:

# Allow traffic to google.com
iptables -A zone_lan_forward -p tcp -d 1.2.3.0/24 -j ACCEPT
iptables -A zone_lan_forward -p udp -d 1.2.3.0/24 -j ACCEPT
iptables -A zone_lan_forward -p tcp -d 11.12.13.0/24 -j ACCEPT
iptables -A zone_lan_forward -p udp -d 11.12.13.0/24 -j ACCEPT
iptables -A zone_lan_forward -p tcp -d 101.102.103.0/24 -j ACCEPT
iptables -A zone_lan_forward -p udp -d 101.102.103.0/24 -j ACCEPT
...

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

# Allow traffic to google.com
iptables -A zone_lan_forward -p tcp -d google.com -j ACCEPT
iptables -A zone_lan_forward -p udp -d google.com -j ACCEPT

Я считаю, что это возможно, поскольку man iptables говорит:

Адрес может быть либо сетевым именем, имя хоста (обратите внимание, что указывать любое имя, которое должно быть разрешено с помощью удаленного запроса, например DNS, является действительно плохой идеей), сетевой IP-адрес (с / mask) или простой IP-адрес.

Но что меня беспокоит, так это часть, в которой говорится «указание любого имени, которое будет разрешено с помощью ... DNS - действительно плохая идея». Почему это плохая идея? Он просто все тормозит?

Если мне действительно не следует использовать имена хостов в правилах iptables, что мне делать, чтобы упростить свой брандмауэр?

  • DNS-имена разрешаются при добавлении правил, а не при проверке пакетов. Это нарушает ожидания большинства людей.
    • Правило не обновляется для отражения измененных результатов DNS. Это решается при добавлении, и все. Вам нужно будет периодически перезагружать правила, иначе некоторые сайты могут сломаться.
  • Есть небольшая проблема с безопасностью, заключающаяся в том, что вы в основном делегируете управление правилами вашего брандмауэра внешнему объекту.
    • Что делать, если ваш родительский DNS-сервер скомпрометирован и возвращает ложные данные.

Если ваша цель - заблокировать доступ по протоколу HTTP, то вам, как правило, гораздо лучше настроить программу, предназначенную для фильтрации на этом уровне (например, squid + squidquard).

Если вы используете имена хостов в брандмауэре, ваш брандмауэр теперь зависит от DNS. Это открывает брандмауэр для ряда проблем:

  • Поиск DNS в больших объемах может вызвать задержку.
  • Изменения DNS не распространяются мгновенно. Таким образом, ваш брандмауэр может использовать кешированные IP-адреса.
  • DNS можно подделать, взломать, взломать.
  • DNS может дать сбой - это означает, что ваш брандмауэр не работает.
  • Ваши правила брандмауэра теперь контролируются третьей стороной.

Если вы используете имена хостов и не контролируете DNS, то кто-то другой эффективно контролирует ваши правила IPtables. Ошибки, ошибки или проблемы с безопасностью со своей стороны становятся для вас проблемами.

Единственный раз, когда я видел, как хорошо используются имена хостов, это для внутренних операций. Я работал в офисе, где IP-адреса и имена хостов назначались через DHCP. Брандмауэры использовали имена хостов для создания барьеров между различными группами. Поскольку все это находилось под внутренним контролем, все работало хорошо.

Вы можете использовать оболочку вокруг iptables, например shorewall, чтобы упростить управление вашими правилами.

Я лично назначаю имя хоста ip вручную в / etc / hosts а затем используйте его в iptables.

Таким образом вы

  1. Не выгружайте правила брандмауэра на внешний объект
  2. Иметь легко обслуживаемые iptables

Как уже говорили другие, вы не должны использовать разрешаемые имена DNS в правилах iptables. Они неточные, контролируются третьей стороной и, как правило, являются Плохой вещью (tm). Я также хотел бы добавить, что ваш DNS может выйти из строя или может быть недоступен во время запуска службы iptables. В этом случае правило не будет добавлено вообще, и могут возникнуть проблемы совершенно нового типа (например, потеря доступа по ssh после перезапуска).

Что вы можете сделать:

  1. Используйте настраиваемые цепочки для логического разделения правил
  2. Использовать ipsets чтобы адреса были сгруппированы и отделены от правил
  3. Добавляйте комментарии к правилам

Также никто не сказал ничего плохого о именах хостов, которые не разрешены DNS (т.е. указаны в hosts. Вы можете использовать их, если вам действительно нужно.