7 votos

Cómo solucionar problemas de Linux en el núcleo del dns_resolver

Linux proporciona una herramienta que permite a los kernel y sus módulos para resolver nombres DNS apoyándose en herramientas de espacio de usuario. Este, por ejemplo, es utilizado por CIFS para apoyar las referencias en la DFS.

El problema que estoy viendo es que no puedo conseguir el kernel para resolver un nombre DNS específico y no entiendo por qué no funciona.

Para entender la root de la causa que han permitido a la salida de depuración en tanto, CIFS y núcleo de resolución de dns ejecutando los siguientes comandos:

echo "1" >  /sys/module/dns_resolver/parameters/debug  # dns_resolver
echo "7" > /proc/fs/cifs/cifsFYI  # CIFS

He aquí lo que yo veo en la salida de dmesg cuando se produce el error:

fs/cifs/cifs_dfs_ref.c: DFS: ref path: \ESOTEST\dfstest\FS_SERV
fs/cifs/cifs_dfs_ref.c: DFS: node path: \FS\FS_SERV
fs/cifs/cifs_dfs_ref.c: DFS: fl: 2, srv_type: 0
fs/cifs/cifs_dfs_ref.c: DFS: ref_flags: 0, path_consumed: 24
fs/cifs/netmisc.c: address conversion returned 0 for FS
fs/cifs/netmisc.c: address conversion returned 0 for FS
[ls    ] ==> dns_query((null),FS,2,(null))
fs/cifs/dns_resolve.c: dns_resolve_server_name_to_ip: unable to resolve: FS
fs/cifs/cifs_dfs_ref.c: cifs_compose_mount_options: Failed to resolve server part of \\FS\FS_SERV to IP:

-22

Y este es el resultado de una resolución exitosa:

fs/cifs/cifs_dfs_ref.c: DFS: node path: \ESOTEST\File-Server
fs/cifs/cifs_dfs_ref.c: DFS: fl: 2, srv_type: 0
fs/cifs/cifs_dfs_ref.c: DFS: ref_flags: 0, path_consumed: 28
fs/cifs/netmisc.c: address conversion returned 0 for ESOTEST
fs/cifs/netmisc.c: address conversion returned 0 for ESOTEST
[ls    ] ==> dns_query((null),ESOTEST,7,(null))
[ls    ] call request_key(,ESOTEST,)
[ls    ] ==> dns_resolver_match(ESOTEST,ESOTEST)
[ls    ] <== dns_resolver_match() = 1
[ls    ] <== dns_query() = 14
fs/cifs/dns_resolve.c: dns_resolve_server_name_to_ip: resolved: ESOTEST to 192.168.56.102
fs/cifs/cifsfs.c: Devname: \\ESOTEST\File-Server flags: 0

Estoy usando Windows como servidor de DNS y me puede resolver el nombre "FS" de la máquina:

$ ping FS
PING FS.esodomain.com (192.168.56.104) 56(84) bytes of data.
64 bytes from fs.esodomain.com (192.168.56.104): icmp_seq=1 ttl=128 time=1.37 ms
64 bytes from fs.esodomain.com (192.168.56.104): icmp_seq=2 ttl=128 time=0.630 ms

También he probado con la tecla.dns_resolver para realizar una prueba y parece que funciona:

$ key.dns_resolver -vv -D "FS" 'hello'
I: Key description: 'dns_resolver;-1;-1;0;FS'
I: Callout info: 'hello'
D: Get A/AAAA RR for hostname:'FS', options:'hello'
D: Opt hello
D: Resolve 'FS' with 1ff
D: getaddrinfo = 0
D: RR: 0,2,1,6,10,(null)
D: append '192.168.56.104'
I: The key instantiation data is '192.168.56.104'

Contenido de /etc/solicitud de clave.conf:

create  dns_resolver *      *               /sbin/key.dns_resolver %k
create  user    debug:*     negate      /bin/keyctl negate %k 30 %S
create  user    debug:*         rejected        /bin/keyctl reject %k 30 %c %S
create  user    debug:*         expired         /bin/keyctl reject %k 30 %c %S
create  user    debug:*         revoked         /bin/keyctl reject %k 30 %c %S
create  user    debug:loop:*    *       |/bin/cat
create  user    debug:*     *       /usr/share/keyutils/request-key-debug.sh %k %d %c %S
negate  *   *       *       /bin/keyctl negate %k 30 %S

La razón por la que estoy jugando con esto es que estoy tratando de conseguir un Windows DFS compartir a montar correctamente. Soy capaz de montar y acceder a las carpetas que están alojados en el servidor de root, pero cuando intento acceder a una sub-carpeta que se refiere a un servidor externo que obtengo:

ls: cannot access /mnt/dfstest/FS_SERV/: Invalid argument

Estoy en 3.7.10 kernel:

Linux gentoo 3.7.10-gentoo-r1 #3 SMP Fri Apr 19 17:32:20 PDT 2013 x86_64 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz GenuineIntel GNU/Linux

En una captura de red no veo las peticiones DNS para "FS" mientras veo una solicitud de "ESOTEST". Esto sugiere que la petición no se hizo nunca.

Cuáles son los próximos pasos recomendaría usted para solucionar esto?

5voto

Sergey Puntos 141

Este parece ser causado por el kernel de Linux. Específicamente, por la dns_resolver. "FS" no es ni siquiera el intento de resolución.

Las siguientes líneas en dns_resolver (net/dns_resolver/dns_query.c) parecen causar este:

if (namelen < 3)
    return -EINVAL;

No sé por qué hay esta comprobación. Voy a intentar cambiar el nombre del servidor de "FS" a algo más. Voy a tratar de volver a compilar el kernel con esta comprobación eliminado.

ACTUALIZACIÓN: sí, esa fue la razón y funciona después de volver a nombrar el nombre a un nombre más largo

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X