mrak:
Pokud by si byl ochotnej se o to podělit bylo by to bezvadný. Buďto sem do fóra nebo mailem na adresu z mého profilu.
Díky 
provozuju to s isc-dhcpd-4.1.1-P1 (centos6)
Ten konfig jsem az na drobne upravy nasel nekde na netu:
default-lease-time 16000;
preferred-lifetime 14400;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.name-servers 2a00:ca8:0:1::20, 2a00:ca8::100;
option dhcp6.preference 255;
option dhcp6.info-refresh-time 21600;
server-duid LL;
# "\000\003\000\001\122\124\000\000\000\001";
# kod zajistujici pridani routy pri PD
option dhcp6.macaddr code 193 = string;
option dhcp6.leased-address code 194 = string;
option dhcp6.pkt code 9998 = string;
option dhcp6.leased-prefix code 9999 = string;
option dhcp6.leased-prefix-len code 9997 = string;
option dhcp6.ll-addr code 9996 = string;
option dhcp6.leased-prefix-cidr code 9995 = string;
option dhcp6.uli code 6011 = integer 32;
option dhcp6.ulo code 6010 = integer 32;
option dhcp6.macaddr = binary-to-ascii(16, 8, ":", suffix(option dhcp6.client-id, 6));
# extract the byte with U/L bit
option dhcp6.uli = substring(suffix(option dhcp6.client-id, 6), 0, 1);
# invert the U/L bit by checking the symbol in the binary string
# representation and adjusting the result accordingly
if substring(suffix(binary-to-ascii(2, 8, "", config-option dhcp6.uli), 2), 0, 1) = "1" {
# Seems there's no minus so we gotta do subtraction by addition overflow
option dhcp6.ulo = encode-int( extract-int(config-option dhcp6.uli, 8) + 254, 8);
} else {
option dhcp6.ulo = encode-int( extract-int(config-option dhcp6.uli, 8) + 2, 8);
}
option dhcp6.ll-addr = concat("fe80::", binary-to-ascii(16,16, ":",
concat(config-option dhcp6.ulo,
substring(suffix(option dhcp6.client-id, 6), 1, 2),
encode-int(255, 8),
encode-int(254, 8),
substring(suffix(option dhcp6.client-id, 6), 3, 3))) );
#option dhcp6.leased-address = binary-to-ascii(16,16, ":", suffix(substring(option dhcp6.ia-pd, 12, 100), 16));
option dhcp6.leased-prefix = binary-to-ascii(16,16, ":", suffix(substring(option dhcp6.ia-pd, 12, 100), 16));
option dhcp6.leased-prefix-len = binary-to-ascii(10,8, ".", substring(suffix(substring(option dhcp6.ia-pd, 12, 100), 17), 0, 1));
option dhcp6.leased-prefix-cidr = concat (config-option dhcp6.leased-prefix, "/", config-option dhcp6.leased-prefix-len);
if substring(config-option dhcp6.leased-prefix, 0, 1) = "2" {
log (info, concat ("Prefix ",config-option dhcp6.leased-prefix-cidr,
" leased to ", config-option dhcp6.macaddr,
" via ", config-option dhcp6.ll-addr ));
execute("/bin/cmd", "dhcp6_route_add", config-option dhcp6.leased-prefix-cidr, config-option dhcp6.ll-addr);
} else {
log (info, "No prefix leased in this packet or not REBIND");
}
subnet6 xx00:cax:a10:53a0::/64 {
range6 xx00:cax:a10:53a0::2 2a00:ca8:a10:53a0::100;
range6 xx00:cax:a10:53a0:: temporary;
prefix6 xx00:cax:a10:53a1:: 2a00:ca8:a10:53a3:: /64;
}
/bin/cmd je bash script. ztezeni funkce z nej :
ziskani adresy pro nexthop a pridani do kernelu, zaroven se do souboru zapise timestamp ktery se s kazdym dhcp-pd periodickem requesu prodlouzi. Pokud neni prodlouzen, je casem smazan (cron a wipe funkce).
dhcp6_route_add() {
local DEV VALID PREFIX NEXTHOP
# pridani/prepsani staticke routy pro delegovane prefixy
#logger -s "INFO: dhcp6_route_add: args: 1:$1 2:$2"
! [[ "$1" =~ ^[a-f0-9:/]+$ ]] && logger -s "ERR: dhcp6_route_add argument1 neni ipv6 route" && return 2
! [[ "$2" =~ ^[a-f0-9:]+$ ]] && logger -s "ERR: dhcp6_route_add argument2 neni ipv6 adresa" && return 4
# TODO: persistetni uloziste?
[ -e ${Ddhcp6pd_dir} ] || mkdir -p ${Ddhcp6pd_dir}
# Ziskame device kde je prefix routovan pokud jsme prilis rychli, nebude host v neighbor tabulce, chvili s tim pockame
DEV=''
i=0
while true ;do
DEV=$(ip -6 nei show $2|cut -d" " -f 3)
[ -n "$DEV" ] && break
[ -z "$DEV" ] && [ $i -gt 10 ] && logger -s "ERR: dhcp6_route_add nebyl nalezen DEV pro $2" && exit 16
i=$(( i + 1))
sleep 1
done
# time stamp do kdy je zaznam validni
VALID=$(( $(date +%s) + $DHCP6_PD_VALID ))
# zalozime/doplnime soubor
echo "$VALID $1 $2 $DEV" >${Ddhcp6pd_dir}/$DEV-${1%%/*}
# NOTE: soubor procistujeme v dhcp6_route_check() a v pripade odebirani IPcek z rozhrani
# pridame/zmenime zaznam
ip -6 route replace $1 via $2 dev $DEV
logger -s "INFO: dhcp6_route_add: pridavam route $1 via $2 dev $DEV"
}
# vycisti routy, ktere jiz expirovaly (tohle se obcas vola z cron)
dhcp6_route_wipe() {
local F RR NOW
NOW=$(date +%s)
for F in $(ls -1 ${Ddhcp6pd_dir} 2>/dev/null) ;do
RR=( $(head -n1 ${Ddhcp6pd_dir}/$F) )
! [ ${#RR[*]} = 4 ] && logger -s "ERR: dhcp6_route_clean() chybny obsah souhoru: $F" && continue
if [ ${RR[0]} -lt $NOW ] ;then
ip -6 route delete ${RR[1]} via ${RR[2]}
logger "INFO: dhcp6_route_wipe: odebiram route ${RR[1]} via ${RR[2]}"
/bin/rm ${Ddhcp6pd_dir}/$F
fi
done
}
# refreshne platne routy, pouzivame po startu systemu k obnoveni PD rout
dhcp6_route_refresh() {
local F RR NOW
NOW=$(date +%s)
for F in $(ls -1 ${Ddhcp6pd_dir}) ;do
RR=( $(head -n1 ${Ddhcp6pd_dir}/$F) )
! [ ${#RR[*]} = 4 ] && logger -s "ERR: dhcp6_route_refresh() chybny obsah souhoru: $F" && continue
if [ ${RR[0]} -gt $NOW ] ;then
# pridame/zmenime zaznam
ip -6 route replace ${RR[1]} via ${RR[2]} dev ${RR[3]}
logger -s "INFO: dhcp6_route_refresh: route ${RR[1]} via ${RR[2]} dev ${RR[3]}"
fi
done
}
Uznavam ze tohle neni zrovna na prvni pohled nejjednodussi reseni, ale funguje to docela spolehlive.