У меня есть маршрутизатор Linux без стека ipv6 и хост Linux внутри NAT. Как использовать iptables для перенаправления трафика 6to4 между NAT-маршрутизатором и хостом и затем настроить туннель 6to4 на хосте с использованием общедоступного IPv4-адреса маршрутизатора?
Этот рецепт (на маршрутизаторе) получает эхо-запрос ipv6 на eth0 хоста, но они не попадают на интерфейс tun6to4. Wireshark сообщает: «Пункт назначения ICMP недоступен (порт недоступен)» в качестве ответа ipv4 на эхо-запрос 6to4.
# inbound destination NAT for IPv6 tunnel. ppp0 is router's WAN interface.
iptables -t nat -A PREROUTING -i ppp0 -p 41 -j DNAT --to 192.168.1.100
# inbound forwarding for IPv6 tunnel
iptables -t filter -A FORWARD -i ppp0 -p 41 -d 192.168.1.100 -j ACCEPT
Я использую этот скрипт на хосте Linux, передав публичный IP-адрес маршрутизатора:
#!/bin/bash
### Get the global IPv4 address for your host from the command line:
GLOB_IP4=$1
### Compute the 6TO4 tunnel IPv6 address:
GLOB_IP6TO4=$(printf "2002:%02x%02x:%02x%02x::1" $(echo $GLOB_IP4 | tr . ' '))
### Setup the tunnel
ip tunnel add tun6to4 mode sit remote any local $GLOB_IP4 ttl 64
ip link set dev tun6to4 up
ip addr add $GLOB_IP6TO4/16 dev tun6to4
ip route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1
Секретный соус
Я думал, что локальный адрес туннеля повлияет на инкапсуляцию 6to4 и должен быть моим глобальным IPv4-адресом.
ip tunnel add tun6to4 mode sit remote any local $GLOB_IP4 ttl 64
Это должен был быть адрес хоста, в моем случае 192.168.1.100. Если все остальное не изменилось, все работает!
iptables -t nat -A PREROUTING -d 192.0.2.75 -p 41 -j DNAT --to 10.0.0.2
на маршрутизаторе должен сделать трюк, предполагая, что все потоки инициируются извне на ваш IP-адрес (заданный как 192.0.2.75
в этом примере). Если ваш IPv6-совместимый компьютер запускает что-то, то обычные универсальные правила SNAT должны помочь.
К сожалению, это невозможно сделать, если между Интернетом и вашим Linux-сервером установлен Linux-маршрутизатор за nat.
Как указано в руководстве iptables:
DNAT
Эта цель действительна только в таблице nat, в цепочках PREROUTING и OUTPUT, а также в пользовательских цепочках, которые вызываются только из этих цепочек. Он указывает, что адрес назначения пакета должен быть изменен (и все будущие пакеты в этом соединении также будут искажены), а правила должны перестать проверяться. Требуется один тип параметра: --to-destination ipaddr [-ipaddr] [: port-port], который может указывать один новый IP-адрес назначения, полный диапазон IP-адресов и, необязательно, диапазон портов (который только действителен, если правило также указывает -p tcp или -p udp)
вы можете использовать "-j DNAT --to", только если протокол TCP или UDP, это не будет работать с протоколом 41 (6to4).