Сделать iptables проще в обслуживании

13

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

Big McLargeHuge
источник
Вы получите лучший ответ на security.stackexchange.com
Джим Б.
Возможно, вы правы, что этот вопрос относится к этому сайту, но если у вас есть проблема с принятым ответом, пожалуйста, объясните почему.
Big McLargeHuge
Если вы хотите узнать о блокировке вашей сети и о том, как это сделать, спросите о безопасности, если вы хотите использовать iptables (в отличие от использования IPtables), то это то место.
Джим Б.

Ответы:

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

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

Zoredache
источник
1) Я вижу, как это может быть проблемой - google.com может решить сегодня 1.2.3.4, но завтра этот адрес будет недействительным. Будет ли перезапуск брандмауэра позаботиться об этом? 2) Это все еще проблема безопасности, если DNS-сервер хорошо известен - например, DNS от Google или OpenDNS?
Big McLargeHuge
Я пометил это как ответ, потому что он объясняет, почему я не должен использовать имена хостов в правилах iptables, и дает мне план действий по упрощению брандмауэра.
Big McLargeHuge
Я хотел бы добавить свою поддержку Squid. Я реализовал Squid для своего офиса, и после настройки его очень легко поддерживать для хостов из белого списка (хотя я использую его для черного списка). Кажется, что у вас есть грандиозное предприятие в ваших руках; Я даже не знаю, с чего начать белый список Google, например. www.google.com разрешает только 5 IP-адресов, что ничего не говорит о ssl.gstatic.com и всех других хостах, участвующих в аутентификации, G + и т. д., которые, вероятно, разрешают использовать несколько IP-адресов каждый.
s.co.tt
Монументальность - это хороший способ выразить это. Но я просто использовал Google в качестве примера. Основная схема моего firwall выглядит следующим образом: если пункт назначения пакета находится в белом списке, примите его. В противном случае отправьте его через прокси-сервер.
Big McLargeHuge
Также существует проблема систем, которые используют DNS для балансировки нагрузки. Вы можете не получить те же результаты, если будете искать такой домен два раза подряд, поэтому один поиск даже не даст вам исчерпывающего списка IP-адресов, к которым домен мог бы обратиться.
cdhowie
9

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

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

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

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

jeffatrackaid
источник
2
Это хороший ответ, но в нем отсутствует та часть, которая поможет мне упростить брандмауэр.
Big McLargeHuge
3

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

Jure1873
источник
Это хорошая идея, но вы не сказали мне, почему я не должен использовать имена хостов в правилах iptables.
Big McLargeHuge
Я не знаю много о Shorewall, но у меня сложилось впечатление, что davidkennedy85 все равно нужно будет вести списки всех IP-адресов службы, которую он хотел бы разрешить в конфигах Shorewall. Это может сделать управление сетевым фильтром [& etc] немного проще, но не решит его основную проблему, а именно огромный список IP-адресов.
s.co.tt
2

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

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

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

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

skarap
источник
Да, ipsetэто ответ. С помощью скрипта, запускаемого из crontab для обновления ipset.
Mivk
1

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

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

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