Сломал голову, посему решил написать в блог. может кому поможет.
Собственно, первая часть марлезонского балета. Настраиваем туннель 6to4, так как native IPv6 до меня еще не добрался (но скоро доберется).
На эту тему легко гуглится много статей, по сути получается небольшой bash-script (IP внешнего интерфейса должен быть статическим!!!):
#!/bin/baship tunnel add tun6to4 mode sit remote any local <IP внешнего интерфейса> ttl 64 # создали туннельный интерфейс
ip link set dev tun6to4 up # подняли интерфейс
ip -6 addr add 2002:yyyy:yyyy::xxxx:xxxx:xxxx/128 dev tun6to4 # повесили адрес на интерфейс (адрес формируется из внешнего айпишника, поэтому он обязан быть статическим)
ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1 # добавляем маршрут на всю сеть global scope через anycast-шлюз# our net is 2002:yyyy:yyyy::/48
# lan will be 2002:yyyy:yyyy:e::/64 например
# add gateway on lan
ip addr add 2002:yyyy:yyyy:e::1/64 dev eth1 # добавляем айпишник шлюза на внутренний интерфейс роутера# how to remove tunnel? как убить туннель если что...
## flush routes
# /sbin/ip -6 route flush dev tun6to4## Shut down interface
# /sbin/ip link set dev tun6to4 down
## Remove created tunnel device
# /sbin/ip tunnel del tun6to4
Вот как бы и все. Туннель подняли, с роутера “ping6 google.com” работает.
Дальше надо сделать магию, чтобы девайсы внутри сети тоже смогли пользоваться этим туннелем. Я выделил сетку …:e::/64 для внутренней сети и сделал шлюз :1.
Есть два варианта автоматической настройки – с помощью RA (router advertisement) и dhcpv6.
Для RA нам понадобится демон на нашем роутере – radvd, который будет вещать в сеть сетевой префикс (обычно, и в нашем случае, /64), шлюз. Машины в локалке автоматом получат IPv6 адрес во время инициализации во время старта. Адрес формируется на базе их MAC-адреса с использованием EUI64
Для чего нам будет нужен dhcpv6? С помощью него мы сможем выдавать как динамические, так и статические адреса (чего не может radvd). НО! Из-за дизайна dhcpv6 протокола, он не может выдать шлюз.
Посему RA нам нужны в любом случае, хотя бы для того, чтобы отдавать шлюз. DHCPv6 может отдавать все остальное, IP, DNS…
Мой конфиг, для использования в связке с ISC dhcpd:
interface eth1
{
AdvSendAdvert on;
AdvManagedFlag on;
AdvOtherConfigFlag on;
prefix 2002:yyyy:yyyy:e::/64
{
AdvOnLink on;
AdvAutonomous off;
AdvRouterAddr on;
};
};
Собственно, это все. AdvManagedFlag on
и AdvOtherConfigFlag on
– говорят о том, что выдача всего будет производиться с помощью dhcpd. И, чтобы RA не выдавал из выделенного префикса адреса, надо сказать AdvAutonomous off
, в противном случае возможна ситуация, когда клиентский девайс получит адрес сразу и через RA и от dhcpd. Т.е. у него будет два (очевидно, разных!) адреса. Оно нам не надо.
Далее создаем dhcpd6.conf (для примера):
authoritative;
option dhcp6.name-servers 2002:yyyy:yyyy:e::1;
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases";log-facility local5;
subnet6 2002:yyyy:yyyy:e::/64 {
range6 2002:yyyy:yyyy:e::11 2002:yyyy:yyyy:e::1f;
prefix6 2002:yyyy:yyyy:100:: 2002:yyyy:yyyy:f00:: /56;host example-host {
hardware ethernet 00:80:48:C6:7A:5D;
fixed-address6 2002:yyyy:yyyy:e::10;
}
}
Объяснять по DHCPd, думаю, особо нечего. Работает. Адреса выдает. Роутит
Да, во всей этой истории был косяк. Внутри локалки машины получали еще один неведомый IP (причем получали его раньше что-ли, так как все исходящие пакеты были именно с него). Виновником оказался asus wl500, работающий в режиме AP. У него была включена поддержка IPv6 и ему разрешалось слать RA. Был злостно убит, после чего все встало на свои места.