Я пытаюсь переслать протокол 41 (ipv6-in-ipv4) для туннеля HE через WRT54G под управлением Tomato 1.28. Tomato 1.28 использует ядро 2.4, которое абсолютно ничего не знает о протоколе 41, за исключением того, что он называется "ipv6". Наличие ядра 2.4 также означает, что conntrack нельзя просто отключить: нет "сырых" правил iptables.
Я могу настроить правила так, чтобы входящие пакеты DNAT-ed на правильный внутренний хост. Если удаленный хост сначала отправляет что-то через туннель, все работает нормально. Пакеты могут проходить через туннель в обоих направлениях с надлежащим NAT, и я получаю запись в /proc/net/ip_conntrack
например:
unknown 41 599 src=72.52.104.74 dst=67.180.229.14 src=10.1.0.3 dst=72.52.104.74 use=1 mark=0
Запись гласит, что он предназначен для неизвестного протокола 41, имеет время ожидания более 599 секунд, если трафик больше не принимается, и имеет одну пару адресов отправителя и получателя на стороне инициатора (которая является стороной WAN) и другую на принимающей стороне (это сторона локальной сети).
Но если моя система сначала пытается отправить пакет через туннель, адрес источника не преобразуется в адрес маршрутизатора, как это должно быть, и я получаю запись conntrack, например:
unknown 41 589 src=10.1.0.3 dst=72.52.104.74 [UNREPLIED] src=72.52.104.74 dst=10.1.0.3 use=1 mark=0
Пока моя машина пытается использовать туннель, она поддерживает эту фиктивную запись conntrack, и я могу видеть, как пакеты, покидающие мой маршрутизатор, подключаются к кабельному модему с внутренним адресом источника, который по-прежнему подключен, в результате чего они отбрасываются и никогда не попадают куда они идут.
Чтобы запустить мой туннель, я должен отключить туннельный интерфейс на своем конце, использовать инструмент ping HE, чтобы заставить трафик IPv6 проходить по каналу, и, пока 10-минутный тайм-аут все еще активен на правильном зафиксируйте вход, снова поднимите мой конец туннеля, а затем убедитесь, что он не будет простаивать в течение 10 минут подряд. Я могу это сделать, но это довольно глупо.
Прямо сейчас у меня настроены правила пересылки:
# Send incoming ipv6-in-ipv4 packets to the correct host
iptables -t nat -A PREROUTING -p 41 -s 72.52.104.74 -j DNAT --to 10.1.0.3
# Allow those packets through the firewall
iptables -I FORWARD -p 41 -d 10.1.0.3 -j ACCEPT
# Things I have added to try and solve my problem, which didn't work:
# Remove the default masquerade-everything rule
iptables -t nat -D POSTROUTING 10
# Masquerade only protocols other than 41. Conntrack still gets its bogus entries,
# and if I get the correct entry in it still works.
iptables -t nat -A POSTROUTING -p ! 41 -j MASQUERADE
Я также однажды попытался настроить правило SNAT следующим образом:
iptables -t nat -I POSTROUTING -p 41 -s 10.1.0.3 -j SNAT --to 67.180.229.14
Но, насколько я мог судить, это тоже не помогло.
Итак, мой вопрос:
1) Кто-нибудь когда-нибудь получал протокол 41 для успешной пересылки через WRT54G с запущенным Tomato? Если да, какие специальные правила брандмауэра вы использовали?
2) Почему маршрутизатор считает, что он не должен выполнять преобразование адреса источника в исходящем протоколе 41?