Conntrack получает неправильные правила пересылки для исходящего протокола 41
Я пытаюсь переслать протокол 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?
1 ответ
Как насчет
iptables -t nat -A PREROUTING -p 41 -s 72.52.104.74 -j DNAT --to 10.1.0.3
iptables -t nat -A POSTROUTING -j MASQUERADE