Отличия обработки пакетов 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 с "host is down".

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

-P INPUT ACCEPT
-P OUTPUT ACCEPT

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

Я пытался добавить:

-A INPUT -i eth0 -j DROP

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

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

В качестве альтернативы я также видел наборы правил, которые являются простыми ПРИНЯТЬ (все) с диапазонами dport и sport, исключая требуемые правила.

Короче говоря, я привык к типичным правилам iptables (ipv4), которые отбрасывают все, кроме следующих правил.

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

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

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

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

2 ответа

Ваши правила отбрасывают 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), и сохраните все как можно более похожими. (Спасибо, Майкл.)

Другие вопросы по тегам