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

Различия между обработкой пакетов iptables и ip6tables

Я просмотрел множество ресурсов netfilter, iptables и ip6tables. Я искал информацию в Google, в том числе на сайтах StackExchange, и не могу найти простых или понятных ссылок на информацию о различиях между тем, как iptables и ip6tables обрабатывают пакеты.

Вот мои стандартные правила iptables:

* filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

Аналогичные правила также существуют для входящего и исходящего HTTP и разрешения DNS, а также для базового ICMP (v4 0, 3, 8, 11, 12).

Когда я использую ip6tables для установки тех же правил, мой сервер отвечает на HTTP, SSH и ICMP-соединения с помощью "хост не работает. "

Я могу установить предварительные правила:

-P INPUT ACCEPT
-P OUTPUT ACCEPT

И это снова открывает сервер. Но он не фильтрует пакеты (произвольные правила для всех пакетов, кроме FORWARD).

Я пробовал добавить:

-A INPUT -i eth0 -j DROP

Но, опять же, это начинает вызывать проблемы.

Двойная и тройная проверка с помощью telnet среди других проверок пакетов (журналы сервера просто разрывают соединения, если используется DROP, то же самое для REJECT).

В качестве альтернативы я также видел наборы правил, которые являются простыми ACCEPT (all) с диапазонами dport и sport, за исключением требуемых правил.

Короче говоря, я привык к типичным правилам iptables (ipv4), которые УДАЛЯЮТ все, кроме следующих правил.

В идеале я ищу ссылки или информацию, которые предоставляют подробную техническую информацию о различиях между тем, как iptables и ip6tables по-разному обрабатывают (и отбрасывают или принимают) пакеты.

Казалось бы, ip6tables будет отбрасывать все произвольно, если это основные правила протокола, НО, если это не принято в первом наборе правил, последнее правило, которое я пытался отбросить, все интерфейсные INPUT продолжают вызывать проблемы (с учетом начального набора правил). правила есть ПРИНЯТЬ, но деваться некуда).

FWIW: это Debian Jessie (v8) в дистрибутивном обновлении с Debian Wheezy (v7) на дропле DigitalOcean. Все остальное работает кошерно, кроме правил ip6tables (сервер становится недоступным для ресурсов ipv6).

Оригинал размещен на StackOverflow, удален, скопирован / вставлен здесь, на ServerFault (предлагается более актуально).

Ваши правила отбрасывают ICMP. Это неверно как для IPv4, так и для IPv6, и это заметно нарушит обнаружение PMTU; однако большинство стеков IPv4 реализуют обходные пути для этого (очень распространенного) вида неправильной конфигурации. Однако для IPv6 многие вещи будут нарушены, особенно доступ с хостов Teredo.

Простое решение - добавить правила, разрешающие ICMP:

iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT

ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
ip6tables -A FORWARD -p icmpv6 -j ACCEPT

Потенциально более безопасным решением является разрешение только тех типов сообщений ICMP, которые необходимы для правильной работы, при соблюдении рекомендаций RFC 4890.

Ответ такой, как сказал Майкл Хэмптон в комментариях ... Почти такая же проблема, как:

Настройка правил Debian ip6tables для IPv6

Мои последние правила ip6tables следующие:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
COMMIT

Что все это говорит:

  • ПРИНИМАЮ все.
  • ПРИНЯТЬ УСТАНОВЛЕННЫЕ И СВЯЗАННЫЕ соединения (следуя следующим 3 правилам порта).
  • ПРИНЯТЬ соединения на портах назначения 22 (ssh), 80 (http), 443 (https)
  • ПРИНЯТЬ любой тип IPv6 ICMP (отличный от v4)
  • ОТКЛЮЧИТЕ любые другие входы
  • ОТКАЗАТЬ любые нападающие

И я могу использовать SSH через ipv6, и wget -6 http...

Таким образом, формирование правил ip6tables немного отличается от правил iptables. Следующий шаг: проверьте, будет ли то же самое для iptables (v4), и сохраните все как можно более похожим. (Спасибо, Майкл.)