diff --git a/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc b/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc index 8663b5f25..1a568bc86 100644 --- a/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc +++ b/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc @@ -173,7 +173,7 @@ EOD; list($cachedipv4, $cacheTimev4) = array('', ''); } if (isset($dnsupdate['usepublicip'])) { - $wanip = get_dyndns_ip($dnsupdate['interface'], 4); + $wanip = get_rfc2136_ip_address($dnsupdate['interface'], 4); } else { $wanip = get_interface_ip($dnsupdate['interface']); } @@ -200,7 +200,7 @@ EOD; list($cachedipv6, $cacheTimev6) = array('', ''); } if (isset($dnsupdate['usepublicip'])) { - $wanipv6 = get_dyndns_ip($dnsupdate['interface'], 6); + $wanipv6 = get_rfc2136_ip_address($dnsupdate['interface'], 6); } else { $wanipv6 = get_interface_ipv6($dnsupdate['interface']); } @@ -239,3 +239,41 @@ EOD; echo "done.\n"; } } + +function get_rfc2136_ip_address($int, $ipver = 4) +{ + $ip_address = $ipver == 6 ? get_interface_ipv6($int) : get_interface_ip($int); + if (empty($ip_address)) { + log_error("Aborted IPv{$ipver} detection: no address for {$int}"); + return 'down'; + } + + if ($ipver != 6 && is_private_ip($ip_address)) { + /* Chinese alternative is http://ip.3322.net/ */ + $hosttocheck = 'http://checkip.dyndns.org'; + $ip_ch = curl_init($hosttocheck); + curl_setopt($ip_ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ip_ch, CURLOPT_INTERFACE, $ip_address); + curl_setopt($ip_ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ip_ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ip_ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + $ip_result = curl_exec($ip_ch); + if ($ip_result !== false) { + preg_match('=Current IP Address: (.*)=siU', $ip_result, $matches); + $ip_address = trim($matches[1]); + } else { + log_error('Aborted IPv4 detection: ' . curl_error($ip_ch)); + $ip_address = ''; + } + curl_close($ip_ch); + } elseif ($ipver == 6 && is_linklocal($ip_address)) { + log_error('Aborted IPv6 detection: cannot bind to link-local address'); + $ip_address = ''; + } + + if (($ipver == 6 && !is_ipaddrv6($ip_address)) || ($ipver != 6 && !is_ipaddrv4($ip_address))) { + return 'down'; + } + + return $ip_address; +} diff --git a/dns/rfc2136/src/www/services_rfc2136.php b/dns/rfc2136/src/www/services_rfc2136.php index 16936da0a..a7a5029bb 100644 --- a/dns/rfc2136/src/www/services_rfc2136.php +++ b/dns/rfc2136/src/www/services_rfc2136.php @@ -146,7 +146,7 @@ legacy_html_escape_form_data($a_rfc2136); if (file_exists($filename) && !empty($rfc2136['enable']) && (empty($rfc2136['recordtype']) || $rfc2136['recordtype'] == 'A')) { echo "IPv4: "; if (isset($rfc2136['usepublicip'])) { - $ipaddr = get_dyndns_ip($rfc2136['interface'], 4); + $ipaddr = get_rfc2136_ip_address($rfc2136['interface'], 4); } else { $ipaddr = get_interface_ip($rfc2136['interface']); } @@ -167,7 +167,7 @@ legacy_html_escape_form_data($a_rfc2136); if (file_exists($filename6) && !empty($rfc2136['enable']) && (empty($rfc2136['recordtype']) || $rfc2136['recordtype'] == 'AAAA')) { echo "IPv6: "; if (isset($rfc2136['usepublicip'])) { - $ipaddr = get_dyndns_ip($rfc2136['interface'], 6); + $ipaddr = get_rfc2136_ip_address($rfc2136['interface'], 6); } else { $ipaddr = get_interface_ipv6($rfc2136['interface']); } diff --git a/dns/rfc2136/src/www/widgets/widgets/rfc2136.widget.php b/dns/rfc2136/src/www/widgets/widgets/rfc2136.widget.php index 3dc9a58cc..0c2d57611 100644 --- a/dns/rfc2136/src/www/widgets/widgets/rfc2136.widget.php +++ b/dns/rfc2136/src/www/widgets/widgets/rfc2136.widget.php @@ -49,14 +49,14 @@ if (!empty($_REQUEST['getrfc2136status'])) { $filename = rfc2136_cache_file($rfc2136, 4); $fdata = ''; if (!empty($rfc2136['enable']) && (empty($rfc2136['recordtype']) || $rfc2136['recordtype'] == 'A') && file_exists($filename)) { - $ipaddr = get_dyndns_ip($rfc2136['interface'], 4); + $ipaddr = get_rfc2136_ip_address($rfc2136['interface'], 4); $fdata = @file_get_contents($filename); } $filename_v6 = rfc2136_cache_file($rfc2136, 6); $fdata6 = ''; if (!empty($rfc2136['enable']) && (empty($rfc2136['recordtype']) || $rfc2136['recordtype'] == 'AAAA') && file_exists($filename_v6)) { - $ipv6addr = get_dyndns_ip($rfc2136['interface'], 6); + $ipv6addr = get_rfc2136_ip_address($rfc2136['interface'], 6); $fdata6 = @file_get_contents($filename_v6); }