Назад | Перейти на главную страницу

Протокол пересылки 41 (6to4) в ящик Linux?

У меня есть маршрутизатор 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).