interfaces: do not give all trackers the same IPv6 in 6rd / 6to4

PR: https://github.com/opnsense/core/issues/2663
This commit is contained in:
Franco Fichtner 2018-09-08 16:42:17 +02:00
parent 2cb88d030e
commit a241040662

View File

@ -2620,17 +2620,17 @@ function interface_track6_6rd_configure($interface = 'lan', $lancfg)
$rd6lanbin = str_pad($rd6lanbin, 128, "0", STR_PAD_RIGHT);
/* convert the 128 bits for the lan address back into a valid IPv6 address */
$rd6lan = convert_128bit_to_ipv6($rd6lanbin) ."1";
$rd6lan = convert_128bit_to_ipv6($rd6lanbin) . (1 + get_interface_number_track6($lancfg['track6-interface'], $interface));
$lanif = get_real_interface($interface, 'inet6');
$oip = find_interface_ipv6($lanif);
if (is_ipaddrv6($oip)) {
mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
}
log_error("rd6 {$interface} with ipv6 address {$rd6lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
mwexec("/sbin/ifconfig {$lanif} inet6 {$rd6lan} prefixlen 64");
return 0;
log_error("rd6 {$interface} with ipv6 address {$rd6lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
/* XXX why 64? */
mwexec("/sbin/ifconfig {$lanif} inet6 {$rd6lan} prefixlen 64");
}
function interface_track6_6to4_configure($interface = 'lan', $lancfg)
@ -2660,17 +2660,17 @@ function interface_track6_6to4_configure($interface = 'lan', $lancfg)
$sixto4lanbin = str_pad($sixto4lanbin, 128, "0", STR_PAD_RIGHT);
/* convert the 128 bits for the lan address back into a valid IPv6 address */
$sixto4lan = convert_128bit_to_ipv6($sixto4lanbin) ."1";
$sixto4lan = convert_128bit_to_ipv6($sixto4lanbin) . (1 + get_interface_number_track6($lancfg['track6-interface'], $interface));
$lanif = get_real_interface($interface, 'inet6');
$oip = find_interface_ipv6($lanif);
if (is_ipaddrv6($oip)) {
mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
}
log_error("sixto4 {$interface} with ipv6 address {$sixto4lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
mwexec("/sbin/ifconfig {$lanif} inet6 {$sixto4lan} prefixlen 64");
return 0;
log_error("sixto4 {$interface} with ipv6 address {$sixto4lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
/* XXX why 64? */
mwexec("/sbin/ifconfig {$lanif} inet6 {$sixto4lan} prefixlen 64");
}
function interface_6rd_configure($interface = 'wan', $wancfg)
@ -2845,8 +2845,6 @@ function interface_6to4_configure($interface = 'wan', $wancfg)
if (!file_exists("/var/run/booting")) {
link_interface_to_track6($interface, true);
}
return 0;
}
function interface_dhcpv6_configure($interface = 'wan', $wancfg)
@ -3759,6 +3757,22 @@ function guess_interface_from_ip($ipaddress)
return $ret;
}
function get_interface_number_track6($wanif, $targetif)
{
$list = link_interface_to_track6($wanif);
$number = 0;
foreach ($list as $lanif => $unused) {
if ($lanif == $targetif) {
return $number;
}
$number += 1;
}
/* if we fail give backwards-compat */
return 0;
}
function link_interface_to_track6($wanif, $update = false)
{
$list = array();