netstat에서 일부 소켓을 숨기는 커널 모듈을 작성하려고 합니다. netstat의 작동 방식을 확인한 결과 /proc/net/tcp
.
이제 나는 막혔습니다. 파일을 읽을 때 무슨 일이 일어나는지 알아내려고 노력 중입니다 /proc/net/tcp
. Google 조사를 통해 기능을 사용하고 있다는 것을 알게되었습니다 tcp4_seq_show
.
내 질문은 인터넷 검색 없이 어떤 기능이 사용되는지 어떻게 알 수 있습니까?
나는 strace를 사용해 보았습니다 -
strace -y -yy -v cat /proc/net/tcp
그러나 출력에는 tcp4_seq_show
이 함수나 다른 커널 함수에 대한 참조가 포함되어 있지 않습니다.
관련 출력 -
arch_prctl(ARCH_SET_FS, 0x7ff5ec3e1580) = 0
mprotect(0x7ff5ec3d6000, 12288, PROT_READ) = 0
mprotect(0x55c369b3b000, 4096, PROT_READ) = 0
mprotect(0x7ff5ec420000, 4096, PROT_READ) = 0
munmap(0x7ff5ec3e2000, 71701) = 0
brk(NULL) = 0x55c36a40e000
brk(0x55c36a42f000) = 0x55c36a42f000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5698896, ...}) = 0
mmap(NULL, 5698896, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff5ebc7f000
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
openat(AT_FDCWD, "/proc/net/tcp", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5ebc5d000
read(3, " sl local_address rem_address "..., 131072) = 900
write(1, " sl local_address rem_address "..., 900 sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0915 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 69736 1 ffff9f59772fc600 100 0 0 10 0
1: 3500007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 102 0 31698 1 ffff9f59772f9a40 100 0 0 10 0
2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 38399 1 ffff9f5972c3a300 100 0 0 10 5
3: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 38548 1 ffff9f5972c3b480 100 0 0 10 0
4: 0100007F:A879 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 44812 1 ffff9f59772fd780 100 0 0 10 0
) = 900
read(3, "", 131072) = 0
munmap(0x7ff5ebc5d000, 139264) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
또한 사용해 보았 ltrace
으나 빈 출력이 반환되었습니다...
그렇다면 모든 커널을 모르고 검색할 필요 없이 사용할 기능을 어떻게 결정합니까?
답변1
커널 호출을 추적하기 위해 단순히 사용자 공간 도구를 사용할 수는 없다고 생각합니다. 당신이 찾고 있는 것은ftrace
, 그러면 (커널이 지원하는 경우) 다음과 같은 작업을 수행할 수 있습니다.
sysctl kernel.ftrace_enabled=1
echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
cat /proc/net/tcp
echo 0 > /sys/kernel/debug/tracing/tracing_on
less /sys/kernel/debug/tracing/trace
를 읽을 때 정확히 무슨 일이 일어나고 있는지에 대한 자세한 내용을 보려면 /proc/net/tcp
커널 소스 파일을 다운로드하거나 커널 문서 등을 읽어보세요. 관련된가상 파일 시스템, /프로세스그리고시퀀스 파일상호 작용.
파일 시스템은 사용자 공간에서 시스템 정보를 사용할 수 있도록 하는 커널 기능 이므로 /proc
소켓을 숨기는 것이 가능한지는 모르겠습니다 netstat
(참조:/proc/net/tcp를 어떻게 편집하나요?).