versiones ultima descargar caracteristicas c sockets networking linux-kernel packet

ultima - Rastree un paquete a medida que pasa por el núcleo(Linux)



versiones de gnu linux (2)

Por favor, consulte el proyecto llamado SystemTap . Le permite insertar scripts fáciles de usar que se conectan a cualquier código del kernel, sin volver a compilar el kernel. Por ejemplo:

probe function("ip_rcv").call { printf("%d: ->ip_rcv()/n", gettimeofday_ms()) }

Emitirá una impresión de núcleo para cada paquete recibido en la capa de red. Por supuesto, necesitarías leer las fuentes para seguir desde allí más profundamente en la pila de la red.

SystemTap es muy capaz y bastante documentado sobre los diversos ganchos que se pueden insertar.

Tengo dos máquinas que están configuradas para usar Ip-Security y la máquina A (tiene que llamarlas A y B) tiene un socket que está vinculado a un puerto UDP particular en la máquina local y lo sondea con frecuencia para ver si se recibe algo en eso.

Cuando deshabilito Ip-security, los datos entre las dos máquinas pasan bien y envío y recibo los paquetes correctamente. Pero cuando Ip-Security está habilitado, el paquete no llega a ese socket en la máquina A enviada por la máquina B.

Hago un tcpdump en ambas máquinas y puedo ver el paquete (encriptado) que se envía desde la máquina B y que se recibe en la máquina A. Pero después de eso, el paquete va al núcleo y en algún lugar, ya sea en el descifrado del paquete o en alguna otra fase, el paquete se descarta.

Quiero poder rastrear el paquete a medida que pasa por el kernel y ver dónde se descarta. ¿Hay algún /proc que pueda usar para este propósito? El otro método en el que puedo pensar es insertar instrucciones de depuración en todo el kernel y recompilarlo y luego intentar enviar el paquete nuevamente y pasar por la depuración.

Gracias y perdón por el largo mensaje pero fue necesario.


Sí, como dijo Dan, SystemTap es útil. Pero mi favorito es Ftrace.

Para referencia:

Ruta del paquete UDP en el kernel de Linux

Por lo tanto, para rastrear el tráfico de red en general, coloque lo siguiente en un shell bash y ejecútelo como raíz:

mkdir /debug mount -t debugfs nodev /debug mount -t debugfs nodev /sys/kernel/debug echo ''*'' >/debug/tracing/set_ftrace_filter echo function_graph >/debug/tracing/current_tracer echo 1 >/debug/tracing/tracing_on sleep 20 echo 0 >/debug/tracing/tracing_on cat /debug/tracing/trace > /tmp/tracing.out$$

Y así en la ruta de ingreso de entrada:

5) | tcp_recvmsg() { 5) | lock_sock_nested() { 5) 0.042 us | _cond_resched(); 5) | _raw_spin_lock_bh() { 5) 0.040 us | local_bh_disable(); 5) 0.414 us | } 5) 0.040 us | _raw_spin_unlock(); 5) 0.040 us | local_bh_enable(); 5) 1.814 us | } 5) | skb_copy_datagram_iovec() { 5) 0.042 us | _cond_resched(); 5) 0.588 us | } 5) 0.042 us | tcp_rcv_space_adjust(); 5) | __kfree_skb() { 5) | skb_release_all() { 5) | skb_release_head_state() { 5) 0.044 us | sock_rfree(); 5) 0.670 us | } 5) | skb_release_data() { 5) | put_page() { 5) 0.049 us | put_compound_page(); 5) 0.449 us | }

y esto:

Procesamiento de Netlink:

6) | rtnetlink_rcv() { 6) | mutex_lock() { 6) 0.090 us | _cond_resched(); 6) 1.455 us | } 6) | netlink_rcv_skb() { 6) | rtnetlink_rcv_msg() { 6) 0.150 us | mutex_unlock(); 6) | __netlink_dump_start() { 6) | netlink_lookup() { 6) 0.091 us | _raw_read_lock(); 6) 0.100 us | netlink_compare(); 6) 1.791 us | } 6) | mutex_lock() { 6) 0.095 us | _cond_resched(); 6) 0.913 us | } 6) 0.100 us | try_module_get(); 6) 0.090 us | mutex_unlock();

y este es el ingreso también:

3) | tcp_v4_rcv() { 3) | sk_filter() { 3) | security_sock_rcv_skb() { 3) 0.076 us | cap_socket_sock_rcv_skb(); 3) 0.867 us | } 3) 1.630 us | } 3) 0.076 us | _raw_spin_lock(); 3) 0.477 us | tcp_prequeue(); 3) | tcp_v4_do_rcv() { 3) 0.088 us | tcp_md5_do_lookup(); 3) 0.109 us | tcp_parse_md5sig_option(); 3) 0.072 us | ipv4_dst_check(); 3) | tcp_rcv_established() { 3) 0.076 us | tcp_parse_aligned_timestamp.part.34(); 3) | tcp_queue_rcv() { 3) | tcp_try_coalesce.part.41() { 3) 0.835 us | skb_try_coalesce(); 3) 1.722 us | } 3) 2.637 us | }

Y esta es la salida (comenzando desde el syscall "sendmsg ()"):

5) | SyS_sendmsg() { 5) | __sys_sendmsg() { 5) | sockfd_lookup_light() { 5) 0.080 us | fget_light(); 5) 0.502 us | } 5) | ___sys_sendmsg() { 5) 0.117 us | copy_msghdr_from_user(); 5) 0.101 us | verify_iovec(); 5) | sock_sendmsg() { 5) | security_socket_sendmsg() { 5) | apparmor_socket_sendmsg() { 5) 0.092 us | aa_revalidate_sk(); 5) 0.580 us | } 5) 1.044 us | } 5) | unix_stream_sendmsg() { 5) 0.113 us | wait_for_unix_gc(); 5) | security_socket_getpeersec_dgram() { 5) 0.044 us | apparmor_socket_getpeersec_dgram(); 5) 0.479 us | } 5) | sock_alloc_send_pskb() { 5) | __alloc_skb() { 5) | kmem_cache_alloc_node() { 5) 0.042 us | _cond_resched(); 5) 0.648 us | } 5) | __kmalloc_reserve.isra.27() { 5) | __kmalloc_node_track_caller() { 5) 0.074 us | kmalloc_slab(); 5) 0.040 us | _cond_resched(); 5) 0.504 us | __slab_alloc(); 5) 1.878 us | } 5) 2.276 us | } 5) 0.175 us | ksize(); 5) 4.217 us | }

Espero que lo disfrutes....