1 caso
Inicie el servicio httpd
systemctl start httpd
Verifique el estado de apertura del puerto
netstat -nlt
Se encuentra que el puerto 80 solo está abierto bajo tcp6 y ipv6 está cerrado.
vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Efectivo inmediatamente
/sbin/sysctl -p
Reinicie el servicio httpd
systemctl restart httpd
Controlar
2 Análisis
Como puede ver, netstat muestra que httpd solo escucha en direcciones ipv6. Sin embargo, la dirección a través de ipv4 es claramente accesible.
En el código fuente de httpd, en la función open_listeners() del servidor de código/listen.c, hay comentarios relevantes:
/* If we have the unspecified IPv4 address (0.0.0.0) and
* the unspecified IPv6 address (::) is next, we need to
* swap the order of these in the list. We always try to
* bind to IPv6 first, then IPv4, since an IPv6 socket
* might be able to receive IPv4 packets if V6ONLY is not
* enabled, but never the other way around.
* ... 省略 ...
*/
Como se mencionó anteriormente, cuando V6ONLY no está habilitado, ipv6 puede manejar ipv4. Lo contrario no es cierto; entonces, ¿cuándo se enciende V6ONLY? Continúe siguiendo el código hasta la función make_sock(), puede encontrar el siguiente código:
#if APR_HAVE_IPV6
#ifdef AP_ENABLE_V4_MAPPED
int v6only_setting = 0;
#else
int v6only_setting = 1;
#endif
#endif
En esta función, puede ver que si la dirección de escucha es ipv6, entonces se establecerá la opción de socket IPV6_V6ONLY Ahora, la clave es ver cómo se define AP_ENABLE_V4_MAPPED.
En la configuración (nota, si se obtiene directamente a través del número de código, puede que no exista este archivo, sino solo el archivo configure.ac/in), puede encontrar:
# Check whether --enable-v4-mapped was given.
if test "${enable_v4_mapped+set}" = set; then :
enableval=$enable_v4_mapped;
v4mapped=$enableval
else
case $host in
*freebsd5*|*netbsd*|*openbsd*)
v4mapped=no
;;
*)
v4mapped=yes
;;
esac
if ap_mpm_is_enabled winnt; then
v4mapped=no
fi
fi
if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then
$as_echo "#define AP_ENABLE_V4_MAPPED 1" >>confdefs.h
Por lo tanto, en Linux, por defecto, AP_ENABLE_V4_MAPPED es 1, entonces httpd monitoreará directamente ipv6, porque el socket ipv6 puede manejar solicitudes ipv4 en este momento; además, la llamada al sistema bind() procesará transparentemente ipv6 para procesos de espacio de usuario. no está habilitado, ipv4 será monitoreado en este momento.
Y si usa el parámetro --disable-v4-mapped para deshabilitar ipv4 mapeado al compilar httpd, de forma predeterminada, httpd escuchará ipv4 e ipv6 respectivamente en lugar de solo escuchar ipv6, como se muestra a continuación:
# netstat -tlnp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 40576/httpd
tcp6 0 0 :::80 :::* LISTEN 40576/httpd
Y si configura Escuchar para escuchar solo las direcciones ipv6 en /etc/httpd/conf/httpd.conf, de la siguiente manera:
Listen :::80
Luego, puede ver que netstat solo muestra el monitoreo de tcp6:
# systemctl restart httpd
# netstat -tlnp | grep :80
tcp6 0 0 :::80 :::* LISTEN 40980/httpd
Y ahora no se puede acceder a httpd a través de la dirección ipv4.
# telnet 192.168.1.100 80
Trying 192.168.1.100...
telnet: Unable to connect to remote host: Connection refused
Por lo tanto, netstat realmente solo muestra el puerto de escucha, pero debe tenerse en cuenta que ipv6 en realidad es compatible con ipv4 en Linux.