Kể từ Linux kernel v4.2-rc5, không thể chụp trực tiếp bằng các giao diện được libpcap sử dụng. libpcap sử dụng miền AF_PACKET
(bí danh PF_PACKET
) dành riêng cho Linux , chỉ cho phép bạn thu thập dữ liệu cho dữ liệu đi qua " netdevice " (chẳng hạn như giao diện Ethernet).
Không có giao diện kernel để chụp từ AF_UNIX
socket. Các bản ghi Ethernet tiêu chuẩn có một tiêu đề Ethernet với nguồn / đích, v.v ... Ổ cắm Unix không có tiêu đề giả như vậy và sổ đăng ký loại tiêu đề lớp liên kết không liệt kê bất cứ điều gì liên quan đến điều này.
Các điểm nhập cơ bản cho dữ liệu là unix_stream_recvmsg
và unix_stream_sendmsg
cho SOCK_STREAM
( SOCK_DGRAM
và SOCK_SEQPACKET
có các chức năng được đặt tên tương tự). Dữ liệu được đệm trong sk->sk_receive_queue
và trong unix_stream_sendmsg
hàm , không có mã cuối cùng dẫn đến việc gọi tpacket_rcv
hàm để chụp gói. Xem phân tích này của osgx trên SO để biết thêm chi tiết về nội bộ của gói chụp nói chung.
Quay lại câu hỏi ban đầu về AF_UNIX
giám sát ổ cắm, nếu bạn chủ yếu quan tâm đến dữ liệu ứng dụng, bạn có một số tùy chọn:
CONFIG_UNIX_DIAG
Rất tiếc, tùy chọn được đề xuất cũng không hữu ích ở đây, nó chỉ có thể được sử dụng để thu thập số liệu thống kê, không thu thập dữ liệu thời gian thực khi chúng chảy qua (xem linux / unix_diag.h ).
Thật không may, hiện tại không có bộ theo dõi hoàn hảo nào cho các socket miền Unix sản xuất pcaps (theo hiểu biết tốt nhất của tôi). Lý tưởng nhất là sẽ có một định dạng libpcap có tiêu đề chứa mã nguồn / mệnh đề (khi có sẵn) theo sau là dữ liệu bổ sung tùy chọn (thông tin đăng nhập, mô tả tệp) và cuối cùng là dữ liệu. Thiếu điều đó, điều tốt nhất có thể được thực hiện là truy tìm dấu vết.
Thông tin bổ sung (dành cho người đọc quan tâm), đây là một số backtraces (có được khi phá vỡ GDB unix_stream_*
và rbreak packet.c:.
, Linux trong QEMU và socat trên dòng chính Linux 4.2-rc5):
# echo foo | socat - UNIX-LISTEN:/foo &
# echo bar | socat - UNIX-CONNECT:/foo
unix_stream_sendmsg at net/unix/af_unix.c:1638
sock_sendmsg_nosec at net/socket.c:610
sock_sendmsg at net/socket.c:620
sock_write_iter at net/socket.c:819
new_sync_write at fs/read_write.c:478
__vfs_write at fs/read_write.c:491
vfs_write at fs/read_write.c:538
SYSC_write at fs/read_write.c:585
SyS_write at fs/read_write.c:577
entry_SYSCALL_64_fastpath at arch/x86/entry/entry_64.S:186
unix_stream_recvmsg at net/unix/af_unix.c:2210
sock_recvmsg_nosec at net/socket.c:712
sock_recvmsg at net/socket.c:720
sock_read_iter at net/socket.c:797
new_sync_read at fs/read_write.c:422
__vfs_read at fs/read_write.c:434
vfs_read at fs/read_write.c:454
SYSC_read at fs/read_write.c:569
SyS_read at fs/read_write.c:562
# tcpdump -i lo &
# echo foo | socat - TCP-LISTEN:1337 &
# echo bar | socat - TCP-CONNECT:127.0.0.1:1337
tpacket_rcv at net/packet/af_packet.c:1962
dev_queue_xmit_nit at net/core/dev.c:1862
xmit_one at net/core/dev.c:2679
dev_hard_start_xmit at net/core/dev.c:2699
__dev_queue_xmit at net/core/dev.c:3104
dev_queue_xmit_sk at net/core/dev.c:3138
dev_queue_xmit at netdevice.h:2190
neigh_hh_output at include/net/neighbour.h:467
dst_neigh_output at include/net/dst.h:401
ip_finish_output2 at net/ipv4/ip_output.c:210
ip_finish_output at net/ipv4/ip_output.c:284
ip_output at net/ipv4/ip_output.c:356
dst_output_sk at include/net/dst.h:440
ip_local_out_sk at net/ipv4/ip_output.c:119
ip_local_out at include/net/ip.h:119
ip_queue_xmit at net/ipv4/ip_output.c:454
tcp_transmit_skb at net/ipv4/tcp_output.c:1039
tcp_write_xmit at net/ipv4/tcp_output.c:2128
__tcp_push_pending_frames at net/ipv4/tcp_output.c:2303
tcp_push at net/ipv4/tcp.c:689
tcp_sendmsg at net/ipv4/tcp.c:1276
inet_sendmsg at net/ipv4/af_inet.c:733
sock_sendmsg_nosec at net/socket.c:610
sock_sendmsg at net/socket.c:620
sock_write_iter at net/socket.c:819
new_sync_write at fs/read_write.c:478
__vfs_write at fs/read_write.c:491
vfs_write at fs/read_write.c:538
SYSC_write at fs/read_write.c:585
SyS_write at fs/read_write.c:577
entry_SYSCALL_64_fastpath at arch/x86/entry/entry_64.S:186
tpacket_rcv at net/packet/af_packet.c:1962
dev_queue_xmit_nit at net/core/dev.c:1862
xmit_one at net/core/dev.c:2679
dev_hard_start_xmit at net/core/dev.c:2699
__dev_queue_xmit at net/core/dev.c:3104
dev_queue_xmit_sk at net/core/dev.c:3138
dev_queue_xmit at netdevice.h:2190
neigh_hh_output at include/net/neighbour.h:467
dst_neigh_output at include/net/dst.h:401
ip_finish_output2 at net/ipv4/ip_output.c:210
ip_finish_output at net/ipv4/ip_output.c:284
ip_output at net/ipv4/ip_output.c:356
dst_output_sk at include/net/dst.h:440
ip_local_out_sk at net/ipv4/ip_output.c:119
ip_local_out at include/net/ip.h:119
ip_queue_xmit at net/ipv4/ip_output.c:454
tcp_transmit_skb at net/ipv4/tcp_output.c:1039
tcp_send_ack at net/ipv4/tcp_output.c:3375
__tcp_ack_snd_check at net/ipv4/tcp_input.c:4901
tcp_ack_snd_check at net/ipv4/tcp_input.c:4914
tcp_rcv_state_process at net/ipv4/tcp_input.c:5937
tcp_v4_do_rcv at net/ipv4/tcp_ipv4.c:1423
tcp_v4_rcv at net/ipv4/tcp_ipv4.c:1633
ip_local_deliver_finish at net/ipv4/ip_input.c:216
ip_local_deliver at net/ipv4/ip_input.c:256
dst_input at include/net/dst.h:450
ip_rcv_finish at net/ipv4/ip_input.c:367
ip_rcv at net/ipv4/ip_input.c:455
__netif_receive_skb_core at net/core/dev.c:3892
__netif_receive_skb at net/core/dev.c:3927
process_backlog at net/core/dev.c:4504
napi_poll at net/core/dev.c:4743
net_rx_action at net/core/dev.c:4808
__do_softirq at kernel/softirq.c:273
do_softirq_own_stack at arch/x86/entry/entry_64.S:970