From: Dmitry Safonov <0x7f454c46@gmail.com> Date: Mon, 16 Sep 2024 23:18:12 +0000 (+0100) Subject: lsfd: Gather information on target socket's net namespace X-Git-Tag: v2.42-start~198^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=28dcffb67bafae89053d08615178de05bb790543;p=thirdparty%2Futil-linux.git lsfd: Gather information on target socket's net namespace A sample of the output before (with SOCK.NETNS): COMMAND PID USER ASSOC XMODE TYPE SOURCE MNTID INODE NAME SOCK.NETNS [..] > tmp_ipv4 114075 root 0 rw---- CHR pts:7 27 10 /dev/pts/7 > tmp_ipv4 114075 root 1 rw---- CHR pts:7 27 10 /dev/pts/7 > tmp_ipv4 114075 root 2 rw---- CHR pts:7 27 10 /dev/pts/7 > tmp_ipv4 114075 root 3 r----- REG nsfs 3 4026531840 net:[4026531840] > tmp_ipv4 114075 root 4 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 5 r----- REG nsfs 3 4026532864 net:[4026532864] > tmp_ipv4 114075 root 6 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 7 r----- REG nsfs 3 4026532947 net:[4026532947] > tmp_ipv4 114075 root 8 rw---- TCP sockfs 10 100750 state=listen laddr=10.0.254.1:7010 4026532947 > tmp_ipv4 114075 root 9 r----- REG nsfs 3 4026533109 net:[4026533109] > tmp_ipv4 114075 root 10 rw---- TCP sockfs 10 100763 socket:[100763] > tmp_ipv4 114075 root 11 rw---- TCP sockfs 10 100776 state=listen laddr=10.0.254.1:7012 4026533109 > tmp_ipv4 114075 root 12 r----- REG nsfs 3 4026533271 net:[4026533271] > tmp_ipv4 114075 root 13 rw---- TCP sockfs 10 100789 socket:[100789] > tmp_ipv4 114075 root 14 rw---- TCP sockfs 10 100802 state=listen laddr=10.0.254.1:7014 4026533271 > tmp_ipv4 114075 root 15 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 16 r----- REG nsfs 3 4026532783 net:[4026532783] > tmp_ipv4 114075 root 17 rw---- TCP sockfs 10 100815 state=listen laddr=10.0.254.1:7015 4026532783 > tmp_ipv4 114075 root 18 r----- REG nsfs 3 4026533511 net:[4026533511] > tmp_ipv4 114075 root 19 rw---- TCP sockfs 10 100828 socket:[100828] > tmp_ipv4 114075 root 20 rw---- TCP sockfs 10 100841 state=listen laddr=10.0.254.1:7017 4026533511 > tmp_ipv4 114075 root 21 r----- REG nsfs 3 4026533673 net:[4026533673] > tmp_ipv4 114075 root 22 rw---- TCP sockfs 10 100854 socket:[100854] > tmp_ipv4 114075 root 23 rw---- TCP sockfs 10 100867 state=listen laddr=10.0.254.1:7019 4026533673 > tmp_ipv4 114075 root 24 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 25 r----- REG nsfs 3 4026533754 net:[4026533754] > tmp_ipv4 114075 root 26 rw---- TCP sockfs 10 100880 state=listen laddr=10.0.254.1:7020 4026533754 > tmp_ipv4 114075 root 27 r----- REG nsfs 3 4026532504 net:[4026532504] > tmp_ipv4 114075 root 28 rw---- TCP sockfs 10 100893 socket:[100893] > tmp_ipv4 114075 root 29 rw---- TCP sockfs 10 100906 state=listen laddr=10.0.254.1:7022 4026532504 > tmp_ipv4 114075 root 30 r----- REG nsfs 3 4026533999 net:[4026533999] > tmp_ipv4 114075 root 31 rw---- TCP sockfs 10 100919 socket:[100919] > tmp_ipv4 114075 root 32 rw---- TCP sockfs 10 100932 state=listen laddr=10.0.254.1:7024 4026533999 > tmp_ipv4 114075 root 33 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 34 r----- REG nsfs 3 4026534080 net:[4026534080] > tmp_ipv4 114075 root 35 rw---- TCP sockfs 10 100945 state=listen laddr=10.0.254.1:7025 4026534080 > tmp_ipv4 114075 root 36 r----- REG nsfs 3 4026534242 net:[4026534242] > tmp_ipv4 114075 root 37 rw---- TCP sockfs 10 100958 socket:[100958] > tmp_ipv4 114075 root 38 rw---- TCP sockfs 10 100971 state=listen laddr=10.0.254.1:7027 4026534242 > tmp_ipv4 114075 root 39 r----- REG nsfs 3 4026534404 net:[4026534404] > tmp_ipv4 114075 root 40 rw---- TCP sockfs 10 100984 socket:[100984] > tmp_ipv4 114075 root 41 rw---- TCP sockfs 10 100997 state=listen laddr=10.0.254.1:7029 4026534404 > tmp_ipv4 114075 root 42 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 43 r----- REG nsfs 3 4026534484 net:[4026534484] > tmp_ipv4 114075 root 44 rw---- TCP sockfs 10 101010 state=listen laddr=10.0.254.1:7030 4026534484 > tmp_ipv4 114075 root 45 r----- REG nsfs 3 4026534646 net:[4026534646] > tmp_ipv4 114075 root 46 rw---- TCP sockfs 10 101023 socket:[101023] > tmp_ipv4 114075 root 47 rw---- TCP sockfs 10 101036 state=listen laddr=10.0.254.1:7032 4026534646 > tmp_ipv4 114075 root 48 r----- REG nsfs 3 4026534808 net:[4026534808] > tmp_ipv4 114075 root 49 rw---- TCP sockfs 10 101049 socket:[101049] > tmp_ipv4 114075 root 50 rw---- TCP sockfs 10 101062 state=listen laddr=10.0.254.1:7034 4026534808 > tmp_ipv4 114075 root 51 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 52 r----- REG nsfs 3 4026534889 net:[4026534889] > tmp_ipv4 114075 root 53 rw---- TCP sockfs 10 101075 state=listen laddr=10.0.254.1:7035 4026534889 > tmp_ipv4 114075 root 54 r----- REG nsfs 3 4026535051 net:[4026535051] > tmp_ipv4 114075 root 55 rw---- TCP sockfs 10 101088 socket:[101088] > tmp_ipv4 114075 root 56 rw---- TCP sockfs 10 101101 state=listen laddr=10.0.254.1:7037 4026535051 > tmp_ipv4 114075 root 57 r----- REG nsfs 3 4026535213 net:[4026535213] > tmp_ipv4 114075 root 58 rw---- TCP sockfs 10 101114 socket:[101114] > tmp_ipv4 114075 root 59 rw---- TCP sockfs 10 101127 state=listen laddr=10.0.254.1:7039 4026535213 > tmp_ipv4 114075 root 60 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 61 r----- REG nsfs 3 4026535294 net:[4026535294] > tmp_ipv4 114075 root 62 rw---- TCP sockfs 10 101140 state=listen laddr=10.0.254.1:7040 4026535294 [..] A sample of the output after: > COMMAND PID USER ASSOC XMODE TYPE SOURCE MNTID INODE NAME SOCK.NETNS [..] > tmp_ipv4 114075 root 0 rw---- CHR pts:7 27 10 /dev/pts/7 > tmp_ipv4 114075 root 1 rw---- CHR pts:7 27 10 /dev/pts/7 > tmp_ipv4 114075 root 2 rw---- CHR pts:7 27 10 /dev/pts/7 > tmp_ipv4 114075 root 3 r----- REG nsfs 3 4026531840 net:[4026531840] > tmp_ipv4 114075 root 4 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 5 r----- REG nsfs 3 4026532864 net:[4026532864] > tmp_ipv4 114075 root 6 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 7 r----- REG nsfs 3 4026532947 net:[4026532947] > tmp_ipv4 114075 root 8 rw---- TCP sockfs 10 100750 state=listen laddr=10.0.254.1:7010 4026532947 > tmp_ipv4 114075 root 9 r----- REG nsfs 3 4026533109 net:[4026533109] > tmp_ipv4 114075 root 10 rw---- TCP sockfs 10 100763 state=listen laddr=10.0.254.1:7011 4026533028 > tmp_ipv4 114075 root 11 rw---- TCP sockfs 10 100776 state=listen laddr=10.0.254.1:7012 4026533109 > tmp_ipv4 114075 root 12 r----- REG nsfs 3 4026533271 net:[4026533271] > tmp_ipv4 114075 root 13 rw---- TCP sockfs 10 100789 state=listen laddr=10.0.254.1:7013 4026533190 > tmp_ipv4 114075 root 14 rw---- TCP sockfs 10 100802 state=listen laddr=10.0.254.1:7014 4026533271 > tmp_ipv4 114075 root 15 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 16 r----- REG nsfs 3 4026532783 net:[4026532783] > tmp_ipv4 114075 root 17 rw---- TCP sockfs 10 100815 state=listen laddr=10.0.254.1:7015 4026532783 > tmp_ipv4 114075 root 18 r----- REG nsfs 3 4026533511 net:[4026533511] > tmp_ipv4 114075 root 19 rw---- TCP sockfs 10 100828 state=listen laddr=10.0.254.1:7016 4026533430 > tmp_ipv4 114075 root 20 rw---- TCP sockfs 10 100841 state=listen laddr=10.0.254.1:7017 4026533511 > tmp_ipv4 114075 root 21 r----- REG nsfs 3 4026533673 net:[4026533673] > tmp_ipv4 114075 root 22 rw---- TCP sockfs 10 100854 state=listen laddr=10.0.254.1:7018 4026533592 > tmp_ipv4 114075 root 23 rw---- TCP sockfs 10 100867 state=listen laddr=10.0.254.1:7019 4026533673 > tmp_ipv4 114075 root 24 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 25 r----- REG nsfs 3 4026533754 net:[4026533754] > tmp_ipv4 114075 root 26 rw---- TCP sockfs 10 100880 state=listen laddr=10.0.254.1:7020 4026533754 > tmp_ipv4 114075 root 27 r----- REG nsfs 3 4026532504 net:[4026532504] > tmp_ipv4 114075 root 28 rw---- TCP sockfs 10 100893 state=listen laddr=10.0.254.1:7021 4026533835 > tmp_ipv4 114075 root 29 rw---- TCP sockfs 10 100906 state=listen laddr=10.0.254.1:7022 4026532504 > tmp_ipv4 114075 root 30 r----- REG nsfs 3 4026533999 net:[4026533999] > tmp_ipv4 114075 root 31 rw---- TCP sockfs 10 100919 state=listen laddr=10.0.254.1:7023 4026533918 > tmp_ipv4 114075 root 32 rw---- TCP sockfs 10 100932 state=listen laddr=10.0.254.1:7024 4026533999 > tmp_ipv4 114075 root 33 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 34 r----- REG nsfs 3 4026534080 net:[4026534080] > tmp_ipv4 114075 root 35 rw---- TCP sockfs 10 100945 state=listen laddr=10.0.254.1:7025 4026534080 > tmp_ipv4 114075 root 36 r----- REG nsfs 3 4026534242 net:[4026534242] > tmp_ipv4 114075 root 37 rw---- TCP sockfs 10 100958 state=listen laddr=10.0.254.1:7026 4026534161 > tmp_ipv4 114075 root 38 rw---- TCP sockfs 10 100971 state=listen laddr=10.0.254.1:7027 4026534242 > tmp_ipv4 114075 root 39 r----- REG nsfs 3 4026534404 net:[4026534404] > tmp_ipv4 114075 root 40 rw---- TCP sockfs 10 100984 state=listen laddr=10.0.254.1:7028 4026534323 > tmp_ipv4 114075 root 41 rw---- TCP sockfs 10 100997 state=listen laddr=10.0.254.1:7029 4026534404 > tmp_ipv4 114075 root 42 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 43 r----- REG nsfs 3 4026534484 net:[4026534484] > tmp_ipv4 114075 root 44 rw---- TCP sockfs 10 101010 state=listen laddr=10.0.254.1:7030 4026534484 > tmp_ipv4 114075 root 45 r----- REG nsfs 3 4026534646 net:[4026534646] > tmp_ipv4 114075 root 46 rw---- TCP sockfs 10 101023 state=listen laddr=10.0.254.1:7031 4026534565 > tmp_ipv4 114075 root 47 rw---- TCP sockfs 10 101036 state=listen laddr=10.0.254.1:7032 4026534646 > tmp_ipv4 114075 root 48 r----- REG nsfs 3 4026534808 net:[4026534808] > tmp_ipv4 114075 root 49 rw---- TCP sockfs 10 101049 state=listen laddr=10.0.254.1:7033 4026534727 > tmp_ipv4 114075 root 50 rw---- TCP sockfs 10 101062 state=listen laddr=10.0.254.1:7034 4026534808 > tmp_ipv4 114075 root 51 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 52 r----- REG nsfs 3 4026534889 net:[4026534889] > tmp_ipv4 114075 root 53 rw---- TCP sockfs 10 101075 state=listen laddr=10.0.254.1:7035 4026534889 > tmp_ipv4 114075 root 54 r----- REG nsfs 3 4026535051 net:[4026535051] > tmp_ipv4 114075 root 55 rw---- TCP sockfs 10 101088 state=listen laddr=10.0.254.1:7036 4026534970 > tmp_ipv4 114075 root 56 rw---- TCP sockfs 10 101101 state=listen laddr=10.0.254.1:7037 4026535051 > tmp_ipv4 114075 root 57 r----- REG nsfs 3 4026535213 net:[4026535213] > tmp_ipv4 114075 root 58 rw---- TCP sockfs 10 101114 state=listen laddr=10.0.254.1:7038 4026535132 > tmp_ipv4 114075 root 59 rw---- TCP sockfs 10 101127 state=listen laddr=10.0.254.1:7039 4026535213 > tmp_ipv4 114075 root 60 r----- REG nsfs 3 4026532537 net:[4026532537] > tmp_ipv4 114075 root 61 r----- REG nsfs 3 4026535294 net:[4026535294] > tmp_ipv4 114075 root 62 rw---- TCP sockfs 10 101140 state=listen laddr=10.0.254.1:7040 4026535294 [..] Signed-off-by: Dmitry Safonov <0x7f454c46@gmail.com> --- diff --git a/lsfd-cmd/lsfd.c b/lsfd-cmd/lsfd.c index 034cd3ac7..dfd9c774e 100644 --- a/lsfd-cmd/lsfd.c +++ b/lsfd-cmd/lsfd.c @@ -881,6 +881,7 @@ static struct file *collect_file_symlink(struct path_cxt *pc, else if (assoc >= 0) { /* file-descriptor based association */ + bool is_socket = (sb.st_mode & S_IFMT) == S_IFSOCK; FILE *fdinfo; if (ul_path_stat(pc, &sb, AT_SYMLINK_NOFOLLOW, name) == 0) @@ -889,6 +890,9 @@ static struct file *collect_file_symlink(struct path_cxt *pc, if (is_nsfs_dev(f->stat.st_dev)) load_sock_xinfo(pc, name, f->stat.st_ino); + if (is_socket) + load_fdsk_xinfo(proc, assoc); + fdinfo = ul_path_fopenf(pc, "r", "fdinfo/%d", assoc); if (fdinfo) { read_fdinfo(f, fdinfo); diff --git a/lsfd-cmd/lsfd.h b/lsfd-cmd/lsfd.h index f70f53cc1..29ecb6395 100644 --- a/lsfd-cmd/lsfd.h +++ b/lsfd-cmd/lsfd.h @@ -302,6 +302,7 @@ void add_nodev(unsigned long minor, const char *filesystem); */ void load_sock_xinfo(struct path_cxt *pc, const char *name, ino_t netns); bool is_nsfs_dev(dev_t dev); +void load_fdsk_xinfo(struct proc *proc, int fd); /* * POSIX Mqueue diff --git a/lsfd-cmd/sock-xinfo.c b/lsfd-cmd/sock-xinfo.c index c182c5efb..3bc45737d 100644 --- a/lsfd-cmd/sock-xinfo.c +++ b/lsfd-cmd/sock-xinfo.c @@ -29,6 +29,7 @@ #include /* NETLINK_*, NLMSG_* */ #include /* RTA_*, struct rtattr, */ #include /* SOCK_DIAG_BY_FAMILY */ +#include /* SIOCGSKNS */ #include /* UNIX_PATH_MAX */ #include /* UNIX_DIAG_*, UDIAG_SHOW_*, struct unix_diag_req */ @@ -36,12 +37,14 @@ #include /* tfind, tsearch */ #include #include +#include #include /* SOCK_* */ #include "sysfs.h" #include "bitops.h" #include "lsfd.h" +#include "pidfd-utils.h" #include "sock.h" static void load_xinfo_from_proc_icmp(ino_t netns_inode, enum sysfs_byteorder byteorder); @@ -216,6 +219,42 @@ void load_sock_xinfo(struct path_cxt *pc, const char *name, ino_t netns) } } +void load_fdsk_xinfo(struct proc *proc, int fd) +{ + int pidfd, sk, nsfd; + struct netns *nsobj; + struct stat sb; + + /* This is additional/extra information, ignoring failures. */ + pidfd = pidfd_open(proc->pid, 0); + if (pidfd < 0) + return; + + sk = pidfd_getfd(pidfd, fd, 0); + if (sk < 0) + goto out_pidfd; + + nsfd = ioctl(sk, SIOCGSKNS); + if (nsfd < 0) + goto out_sk; + + if (fstat(nsfd, &sb) < 0) + goto out_nsfd; + + if (is_sock_xinfo_loaded(sb.st_ino)) + goto out_nsfd; + + nsobj = mark_sock_xinfo_loaded(sb.st_ino); + load_sock_xinfo_with_fd(nsfd, nsobj); + +out_nsfd: + close(nsfd); +out_sk: + close(sk); +out_pidfd: + close(pidfd); +} + void initialize_sock_xinfos(void) { struct path_cxt *pc;