С префиксами ситуация так и не изменилась - адрес и префикс, выдаваемые пользователю, меняются в случайный момент, так что рецепт с одновременным туннелем со стабильным адресом для соединений входящих остается актуальным, за некоторыми незначительными дополнениями.
Роутинг в момент смены состояния интерфейса, с автоматическим прописыванием маршрута для подсети. Отрабатывается ситуация, когда туннелей больше одного (для резервирования - работать они могут и одновременно, но вот если они не стоят приоритетным интерфейсом, маршруты и префикс Кинетик анонсировать в локальную сеть не будет, нужно это из какого-то другого места делать, или с другого хоста, или запускать еще один экземпляр radvd из EntWare).
/opt/etc/ndm/ifstatechanged.d/ipv6:
#!/bin/sh
if [[ "$id" == "TunnelSixInFour"* ]]; then
SUBNET=$(ndmc -c "show ipv6 prefixes" | awk '
/prefix:/ {prefix=$2}
/interface:/ {iface=$2}
prefix && iface {print iface ">" prefix; prefix=""; iface=""}
' | grep "^$id" | cut -d '>' -f 2)
echo SUBNET=$SUBNET
ADDR=$(ndmc -c show interface $id | awk '
/address:/ {addr=$2}
/proto:/ {proto=$2}
proto=="STATIC" {print addr; exit}
'
)
echo ADDR=$ADDR
TABLE=20"${id: -1}"
echo TABLE=$TABLE
if [ "$change" == "connected" ] && [ "$connected" == "yes" ]; then
echo Setting ipv6 routes for $id
/opt/sbin/ip -6 route del default dev $system_name table $TABLE 2>/dev/null
/opt/sbin/ip -6 route add default dev $system_name table $TABLE
/opt/sbin/ip -6 rule del from $SUBNET table $TABLE 2>/dev/null
/opt/sbin/ip -6 rule add from $SUBNET table $TABLE
fi
if [ "$change" == "link" ] && [ "$connected" == "no" ]; then
echo Cleaning ipv6 routes for $id
/opt/sbin/ip -6 route del default dev $system_name table $TABLE 2>/dev/null
/opt/sbin/ip -6 rule del from $SUBNET table $TABLE 2>/dev/null
fi
fi
exit 0