]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: Gather information on target socket's net namespace
authorDmitry Safonov <0x7f454c46@gmail.com>
Mon, 16 Sep 2024 23:18:12 +0000 (00:18 +0100)
committerDmitry Safonov <0x7f454c46@gmail.com>
Mon, 23 Sep 2024 21:59:26 +0000 (22:59 +0100)
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>
lsfd-cmd/lsfd.c
lsfd-cmd/lsfd.h
lsfd-cmd/sock-xinfo.c

index 034cd3ac7222f6e0f5435ad9f9c1adb0b577d576..dfd9c774e27dada8986eebf2794c1621fc570d28 100644 (file)
@@ -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);
index f70f53cc15d8a84a3130381b298fdf05d269ac71..29ecb639593f2587e00133a8c426416c95ec6b1b 100644 (file)
@@ -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
index c182c5efbbfde208eb07a43ce62ac0f5684d6c50..3bc45737d8deba2044ff1fa5d57a295f4dfe6f49 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/netlink.h>     /* NETLINK_*, NLMSG_* */
 #include <linux/rtnetlink.h>   /* RTA_*, struct rtattr,  */
 #include <linux/sock_diag.h>   /* SOCK_DIAG_BY_FAMILY */
+#include <linux/sockios.h>     /* SIOCGSKNS */
 #include <linux/un.h>          /* UNIX_PATH_MAX */
 #include <linux/unix_diag.h>   /* UNIX_DIAG_*, UDIAG_SHOW_*,
                                   struct unix_diag_req */
 #include <search.h>            /* tfind, tsearch */
 #include <stdint.h>
 #include <string.h>
+#include <sys/ioctl.h>
 #include <sys/socket.h>                /* 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;