Вопрос или проблема
У меня есть следующие правила IPv4:
-
iptables -t nat -A PREROUTING -d "сервер ipv4" -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination 127.0.0.1:55555
-
iptables -P INPUT ACCEPT
Кроме того, у меня есть простой прокси, который слушает на адресе localhost
: 127.0.0.1:55555
В IPv4 это работает хорошо.
Когда я попытался сделать то же самое в IPv6:
-
iptables -t nat -A PREROUTING -d "сервер ipv6" -p tcp -m tcp --dport 80 -i eth0 -j DNAT --to-destination [::1]:55555
-
ip6tables -P INPUT ACCEPT
Я не могу заставить это работать!
Мне удалось заставить это работать с:
--to-destination ["link-local IPv6"]:55555
--to-destination ["Server IPv6"]:55555
Когда я включаю пересылку и добавляю несколько строк журнала в таблицу фильтров, цепочку пересылки.
-
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
-
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
и специальной таблицы маршрутизации:
-
Создайте новую таблицу маршрутизации:
Отредактируйте файл
/etc/iproute2/rt_tables
, добавив новую таблицу, например:echo "200 custom" >> /etc/iproute2/rt_tables
-
Настройте правила
fwmark
:Сначала добавьте правило в ip6tables для установки
fwmark
для пакетов, которые вы хотите перенаправить:ip6tables -t mangle -A PREROUTING -d "server ipv6" -p tcp --dport 80 -j MARK --set-mark 1
-
Настройте маршрутизацию для
fwmark
:Теперь добавьте правило маршрутизации для перенаправления пакетов с установленным
fwmark
на интерфейсlo
:ip rule add fwmark 1 table custom ip route add default dev lo table custom
-
Настройте DNAT для IPv6:
Затем настройте DNAT аналогично тому, как вы это делали ранее:
ip6tables -t nat -A PREROUTING -d "server ipv6" -p tcp --dport 80 -j DNAT --to-destination [::1]:55555
-
Включите пересылку:
Убедитесь, что пересылка IPv6 включена:
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
-
Настройка логирования (опционально):
Если вы хотите следить за тем, что происходит, добавьте логирование для дальнейшего анализа:
ip6tables -I FORWARD -j LOG --log-prefix='[filter FORWARD] '
Проверка работоспособности
После настройки указанных правил и маршрутизации вы можете протестировать доступность прокси через ::1
с помощью любого клиента, который поддерживает IPv6 (например, curl):
curl -6 http://[server ipv6]:80
Проверяйте логи на наличие записей о запросах, чтобы убедиться, что система обрабатывает пакеты и перенаправляет их корректно.
Заключение
Следуя этому руководству, вы сможете успешно настроить перенаправление трафика на локальный прокси с использованием ip6tables
и fwmark
. Этот подход дает гибкость в маршрутизации и позволяет устранить проблемы, связанные с переходами и обработкой пакетов в контексте IPv6. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.