El puerto de servicio de Linux solo está abierto bajo tcp6

1 caso

Inicie el servicio httpd

systemctl start httpd 

Verifique el estado de apertura del puerto

netstat -nlt

inserte la descripción de la imagen aquí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

inserte la descripción de la imagen aquí

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.

Supongo que te gusta

Origin blog.csdn.net/ygq13572549874/article/details/131819616
Recomendado
Clasificación