ip6tables – IPv6 DNAT на локальный хост

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

У меня есть следующие правила IPv4:

  1. iptables -t nat -A PREROUTING -d "сервер ipv4" -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination 127.0.0.1:55555

  2. iptables -P INPUT ACCEPT

Кроме того, у меня есть простой прокси, который слушает на адресе localhost: 127.0.0.1:55555

В IPv4 это работает хорошо.

Когда я попытался сделать то же самое в IPv6:

  1. iptables -t nat -A PREROUTING -d "сервер ipv6" -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination [::1]:55555

  2. ip6tables -P INPUT ACCEPT

Я не могу заставить это работать!

Мне удалось заставить это работать с:

  1. --to-destination ["link-local IPv6"]:55555
  2. --to-destination ["Server IPv6"]:55555

Когда я включаю пересылку и добавляю несколько строк журнала в таблицу фильтров, цепочку пересылки.

  1. echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

  2. ip6tables -I FORWARD -j LOG --log-prefix='[filter FORWARD] '

Я вижу пакет.

[268332.372177] [filter FORWARD] IN=eth0 OUT=eth0
MAC=be:69:fd:2a:9e:bd:0a:08:f1:46:19:a1:86:df SRC=
DST=0000:0000:0000:0000:0000:0000:0000:0001 LEN=80 TC=0 HOPLIMIT=63
FLOWLBL=0 PROTO=TCP SPT=42082 DPT=55555 WINDOW=28800 RES=0x00 SYN
URGP=0

Я вижу, что интерфейс OUT — “eth0”, а не “lo”, и ядро считает, что пакет не предназначен для этого сервера.

У меня CentOS 7, и я также пробовал это в Ubuntu 16.

Я бы предложил добавить fwmark к тому, что вы делаете, и добавить правило ip для использования специальной таблицы маршрутизации. В этой таблице вы просто говорите: маршрутизировать на dev lo. DNAT позаботится о переписываении, fwmark позаботится о маршруте на lo, чтобы ваш прокси мог ответить.

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

Настройка IPv6 DNAT для перенаправления на localhost с помощью ip6tables

Введение

Вам необходимо настроить правила IPv6 для перенаправления трафика на локальный прокси, работающий на адресе localhost (или ::1 для IPv6). Мы разберем, как это правильно сделать, используя ip6tables, чтобы обеспечить корректную маршрутизацию пакетов, аналогично тому, как это было настроено для IPv4 с помощью iptables.

Анализ проблемы

Вы уже настроили правила для IPv4, которые работают корректно:

iptables -t nat -A PREROUTING -d "server ipv4" -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination 127.0.0.1:55555
iptables -P INPUT ACCEPT

Однако при попытке сделать что-то аналогичное для IPv6:

ip6tables -t nat -A PREROUTING -d "server ipv6" -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination [::1]:55555
ip6tables -P INPUT ACCEPT

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

Почему это происходит?

Когда вы используете DNAT с адресом ::1, пакеты не обрабатываются так, как предполагается. Фактически, ip6tables обрабатывает NAT на уровне маршрутизации, и конкретные пакеты, предназначенные для ::1, не перенаправляются на интерфейс lo. Это одна из самых больших разниц между IPv4 и IPv6.

Решение проблемы

Чтобы решить вашу проблему, предлагаю следующий подход с использованием fwmark и специальной таблицы маршрутизации:

  1. Создайте новую таблицу маршрутизации:

    Отредактируйте файл /etc/iproute2/rt_tables, добавив новую таблицу, например:

    echo "200 custom" >> /etc/iproute2/rt_tables
  2. Настройте правила fwmark:

    Сначала добавьте правило в ip6tables для установки fwmark для пакетов, которые вы хотите перенаправить:

    ip6tables -t mangle -A PREROUTING -d "server ipv6" -p tcp --dport 80 -j MARK --set-mark 1
  3. Настройте маршрутизацию для fwmark:

    Теперь добавьте правило маршрутизации для перенаправления пакетов с установленным fwmark на интерфейс lo:

    ip rule add fwmark 1 table custom
    ip route add default dev lo table custom
  4. Настройте DNAT для IPv6:

    Затем настройте DNAT аналогично тому, как вы это делали ранее:

    ip6tables -t nat -A PREROUTING -d "server ipv6" -p tcp --dport 80 -j DNAT --to-destination [::1]:55555
  5. Включите пересылку:

    Убедитесь, что пересылка IPv6 включена:

    echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  6. Настройка логирования (опционально):

    Если вы хотите следить за тем, что происходит, добавьте логирование для дальнейшего анализа:

    ip6tables -I FORWARD -j LOG --log-prefix='[filter FORWARD] '

Проверка работоспособности

После настройки указанных правил и маршрутизации вы можете протестировать доступность прокси через ::1 с помощью любого клиента, который поддерживает IPv6 (например, curl):

curl -6 http://[server ipv6]:80

Проверяйте логи на наличие записей о запросах, чтобы убедиться, что система обрабатывает пакеты и перенаправляет их корректно.

Заключение

Следуя этому руководству, вы сможете успешно настроить перенаправление трафика на локальный прокси с использованием ip6tables и fwmark. Этот подход дает гибкость в маршрутизации и позволяет устранить проблемы, связанные с переходами и обработкой пакетов в контексте IPv6. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

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

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