iptables, разрешающие исходящий трафик, когда он должен быть запрещен… через локальный интерфейс?

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

Моя конфигурация iptables должна разрешать трафик локального хоста, разрешать трафик SSH (порт 22), разрешать ICMP-трафик в обоих направлениях и блокировать все остальное.

Однако на практике исходящий трафик по-прежнему работает нормально (например, wget google.com).

Что-то, что я не совсем понимаю: если я удаляю правило разрешения исходящего трафика для локального хоста (правило 1 в цепочке OUTPUT), то исходящий трафик блокируется правильно.

ПРАВКА: Установлен локальный DNS-резолвер (systemd-resolved), поэтому запрет локального хоста приводит к сбоям на этапе разрешения DNS. Тем не менее, попытка напрямую выполнить wget по IP-адресу Google (или 8.8.8.8) просто вызывает таймаут, поэтому я не думаю, что это единственная причина происходящего.

Что, черт возьми, происходит?

Вот моя конфигурация:

Цепочка INPUT (политика DROP 292 пакета, 18733 байта)
num   pkts bytes target     prot opt in     out     source               destination
1       32  2560 ACCEPT     all  --  lo     any     anywhere             anywhere
2     4657  582K ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:22
3      615 22024 ACCEPT     icmp --  any    any     anywhere             anywhere

Цепочка FORWARD (политика ACCEPT 0 пакетов, 0 байт)
num   pkts bytes target     prot opt in     out     source               destination

Цепочка OUTPUT (политика DROP 4 пакета, 268 байт)
num   pkts bytes target     prot opt in     out     source               destination
1        8   640 ACCEPT     all  --  any    lo      anywhere             anywhere
2     3771  597K ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spt:22 state ESTABLISHED
3      520 17684 ACCEPT     icmp --  any    any     anywhere             anywhere

Это на чистой установке Ubuntu 24.04, с basically ничего другого не настроено.

Я выяснил, это действительно глупо: использовался ipv6, и я не настроил таблицы ipv6 (через ip6tables) соответствующим образом.

Ответ или решение

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

Chain INPUT (policy DROP 292 packets, 18733 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       32  2560 ACCEPT     all  --  lo     any     anywhere             anywhere
2     4657  582K ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:22
3      615 22024 ACCEPT     icmp --  any    any     anywhere             anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy DROP 4 packets, 268 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        8   640 ACCEPT     all  --  any    lo      anywhere             anywhere
2     3771  597K ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spt:22 state ESTABLISHED
3      520 17684 ACCEPT     icmp --  any    any     anywhere             anywhere

Как вы уже заметили, ваша конфигурация позволяет исходящий трафик, даже когда вы предполагаете, что он должен быть запрещен. Это происходит из-за того, что в вашем правиле разрешается трафик, поступающий с интерфейса lo (localhost), что предсказывается в первом правиле цепи OUTPUT:

1        8   640 ACCEPT     all  --  any    lo      anywhere             anywhere

Это правило разрешает весь трафик, и исходящий трафик от localhost будет разрешен. Если вы удалите это правило, то весь исходящий трафик будет заблокирован, и это объясняет, почему при удалении правила исходящий трафик блокируется.

Важно отметить, что если у вас настроен локальный DNS-резолвер, такой как systemd-resolved, то вы можете столкнуться с проблемами при удалении этого правила из-за того, что резолвер использует loopback для разрешения DNS. Это объясняет, почему при попытке использовать wget вы получаете таймаут, даже когда вы пытаетесь обращаться напрямую к IP-адресу.

Однако, как вы уже выяснили, ключевым моментом может быть то, что ваш трафик также может идти по протоколу IPv6. Если у вас не настроены соответствующие правила с помощью ip6tables, исходящий IPv6-трафик может проходить без ограничений, что объясняет, почему команды, такие как wget, продолжают работать. Чтобы решить эту проблему, вам необходимо убедиться, что у вас есть аналогичные правила для ip6tables.

Чтобы блокировать весь исходящий IPv6-трафик, вы можете настроить следующие правила:

ip6tables -P OUTPUT DROP
ip6tables -A OUTPUT -o lo -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A OUTPUT -p icmp -j ACCEPT

Эти команды устанавливают политику по умолчанию для цепи OUTPUT на "DROP", затем разрешают трафик, исходящий с интерфейса lo, разрешают SSH на порту 22 и разрешают ICMP-трафик.

В заключение, убедитесь, что вы настроили как iptables, так и ip6tables, чтобы обеспечить полное блокирование исходящего трафика, как вы и предполагали.

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

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