Вопрос или проблема
Моя конфигурация 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
, чтобы обеспечить полное блокирование исходящего трафика, как вы и предполагали.