C Programm soll im Ablauf warten, bis IP Paket für ein Netz ankommt



  • Hallo,

    also ich hab folgendes Problem. Ich hab einen Router mit einem 2.4 Kernel.
    Ich möchte daruf ein C Programm schreiben, das, wenn es gestartet wird, erst auf ein IP-Paket an ein angegebenes Netz warten, bevor es weiter abläuft.

    Zur Zeit nutze ich dazu tcpdump, dem ich angebe beim ersten ankommenden Paket (-c1) für das Netz sich zu beenden. Das tcpdump rufe in dem C Programm über execl auf:

    //Warten auf ein Paket fuer Netz
    	pid = fork();
    	switch ( pid )
    	{
    		case -1: printf("Fehler bei pid\n");exit(-1);
    		case 0: execl("/usr/sbin/tcpdump","tcpdump","-n","-c1","net",argv[1],NULL);
    		default: wait();
    			 pid=0;
    			 break;
    	}
    

    gibt es dafür auch eine Möglichkeit das ohne tcpdump zu implementieren 😕

    Danke für alle die sich dieser Frage annehmen



  • strace ist ein prima Hilfsmittel. Mit:

    strace /usr/sbin/tcpdump -n -c1 net
    

    auf der Kommandozeile siehst Du, welche Systemaufrufe tcpdump verwendet, um genau das zu erreichen. Alternativ kannst Du auch in die Sourcen von tcpdump schauen (dank open-source).

    Tntnet



  • Danke für den Tipp,
    Mein Wissen in Bezug auf C Programmierung ist aber wenn es in tiefere Betriebssystem Ebenen geht leider stark eingeschränkt.
    Die Idee in die Source von tcpdump reinzuschauen hatte ich auch schon, aber habe nicht durchgeblickt. 😞
    Genauso wenig komme ich eigentlich mit der Ausgabe von strace klar.

    router:~ # strace /usr/sbin/tcpdump -n -c1 net 192.168.100.0/24
    execve("/usr/sbin/tcpdump", {"/usr/sbin/tcpdump", "-n", "-c1", "net", "192.168.100.0/24"}, {/* 54 vars */}) = 0
    uname({sys="Linux", node="router", ...}) = 0
    brk(0)                                  = 0x817a000
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY)      = 3
    fstat64(3, {st_mode=S_IFREG|0644, st_size=75461, ...}) = 0
    old_mmap(NULL, 75461, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
    close(3)                                = 0
    open("/usr/lib/libpcap.so.0", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\2202\0"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=168375, ...}) = 0
    old_mmap(NULL, 143344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4002b000
    madvise(0x4002b000, 143344, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x4004d000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x4004d000
    close(3)                                = 0
    open("/lib/tls/libc.so.6", O_RDONLY)    = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0L\1\000"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=1359489, ...}) = 0
    old_mmap(NULL, 1137708, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4004e000
    madvise(0x4004e000, 1137708, MADV_SEQUENTIAL|0x1) = 0
    mprotect(0x4015d000, 27692, PROT_NONE)  = 0
    old_mmap(0x4015e000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10f000) = 0x4015e000
    old_mmap(0x40162000, 7212, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40162000
    close(3)                                = 0
    old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40164000
    mprotect(0x4015e000, 4096, PROT_READ)   = 0
    set_thread_area({entry_number:-1 -> 6, base_addr:0x401645c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
    munmap(0x40018000, 75461)               = 0
    time(NULL)                              = 1154027817
    brk(0)                                  = 0x817a000
    brk(0x819b000)                          = 0x819b000
    open("/etc/localtime", O_RDONLY)        = 3
    fstat64(3, {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
    fstat64(3, {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000
    read(3, "TZif\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\10"..., 4096) = 837
    close(3)                                = 0
    munmap(0x40018000, 4096)                = 0
    socket(PF_NETLINK, SOCK_RAW, 0)         = 3
    bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
    getsockname(3, {sa_family=AF_NETLINK, pid=16098, groups=00000000}, {12}) = 0
    time(NULL)                              = 1154027817
    sendto(3, "\24\0\0\0\22\0\1\3)\21\311D\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
    recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)={{"\330\0\0\0\20\0\2\0)\21\311D\342>\0\0\0\0\4\3\1\0\0\0I"..., 4096}}, msg_controllen=0, msg_flags=0}, 0) = 876
    recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)={{"\24\0\0\0\3\0\2\0)\21\311D\342>\0\0\0\0\0\0\1\0\0\0I\0"..., 4096}}, msg_controllen=0, msg_flags=0}, 0) = 20
    sendto(3, "\24\0\0\0\26\0\1\3*\21\311D\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
    recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)={{"D\0\0\0\24\0\2\0*\21\311D\342>\0\0\2\10\200\376\1\0\0\0"..., 4096}}, msg_controllen=0, msg_flags=0}, 0) = 204
    recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)={{"@\0\0\0\24\0\2\0*\21\311D\342>\0\0\n\200\200\376\1\0\0"..., 4096}}, msg_controllen=0, msg_flags=0}, 0) = 192
    recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)={{"\24\0\0\0\3\0\2\0*\21\311D\342>\0\0\0\0\0\0\1\0\0\0\24"..., 4096}}, msg_controllen=0, msg_flags=0}, 0) = 20
    close(3)                                = 0
    socket(PF_PACKET, SOCK_RAW, 768)        = 3
    ioctl(3, SIOCGIFINDEX, {1, "lo"})       = 0
    ioctl(3, SIOCGIFHWADDR, 0xbffff070)     = 0
    ioctl(3, SIOCGIFINDEX, {2, "eth0"})     = 0
    bind(3, {sa_family=AF_PACKET, proto=0x03, if2, pkttype=PACKET_HOST, addr(0)={0, }, 20) = 0
    getsockopt(3, SOL_SOCKET, SO_ERROR, {0}, {4}) = 0
    setsockopt(3, SOL_PACKET, PACKET_ADD_MEMBERSHIP, "\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
    socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
    ioctl(4, SIOCGIFADDR, 0xbffff300)       = 0
    ioctl(4, SIOCGIFNETMASK, 0xbffff300)    = 0
    close(4)                                = 0
    getuid32()                              = 0
    setuid32(0)                             = 0
    rt_sigaction(SIGPIPE, {0x807d1b0, {}, 0}, {SIG_DFL}, 8) = 0
    rt_sigaction(SIGTERM, {0x807d1b0, {}, 0}, {SIG_DFL}, 8) = 0
    rt_sigaction(SIGINT, {0x807d1b0, {}, 0}, {SIG_DFL}, 8) = 0
    rt_sigaction(SIGHUP, {0x807d1b0, {}, 0}, {SIG_DFL}, 8) = 0
    setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, "\1\0\0\0\250\323\4@", 8) = 0
    fcntl64(3, F_GETFL)                     = 0x2 (flags O_RDWR)
    fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 1514
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 662
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 60
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 138
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 106
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 138
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 60
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 122
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 186
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 60
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 106
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 138
    recv(3, "\0\22\0\5@\250\244\27\10\34\23\5@\230}\1@\4\0\0\0d@\26"..., 1, MSG_TRUNC) = 60
    recv(3, 0xbfffef07, 1, MSG_TRUNC)       = -1 EAGAIN (Resource temporarily unavailable)
    fcntl64(3, F_SETFL, O_RDWR)             = 0
    setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, "\22\0\5@\250\244\27\10", 8) = 0
    fcntl64(3, F_GETFL)                     = 0x2 (flags O_RDWR)
    fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
    getsockopt(3, SOL_SOCKET, SO_RCVBUF, {112640}, {4}) = 0
    read(3, 0xbfffef10, 1024)               = -1 EAGAIN (Resource temporarily unavailable)
    fcntl64(3, F_SETFL, O_RDWR)             = 0
    write(2, "tcpdump: verbose output suppress"..., 75tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    ) = 75
    write(2, "listening on eth0, link-type EN1"..., 70listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    ) = 70
    recvfrom(3, "\0PV\300\0\1\0\f)\'k2\10\0E\0\0T\0\0@\0@\1\357\351\300"..., 96, MSG_TRUNC, {sa_family=AF_PACKET, proto=0x800, if2, pkttype=PACKET_OUTGOING, addr(6)={1, 000c29276b32}, {20}) = 98
    ioctl(3, SIOCGSTAMP, 0xbffff2c0)        = 0
    fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000
    write(1, "21:18:02.535496 IP 192.168.101.1"..., 8121:18:02.535496 IP 192.168.101.100 > 192.168.100.10: icmp 64: echo request seq 1
    ) = 81
    getsockopt(3, SOL_PACKET, PACKET_STATISTICS, "\16\0\0\0\0\0\0\0", {8}) = 0
    write(2, "1 packets captured", 181 packets captured)      = 18
    write(2, "\n", 1
    )                       = 1
    write(2, "14 packets received by filter", 2914 packets received by filter) = 29
    write(2, "\n", 1
    )                       = 1
    write(2, "0 packets dropped by kernel\n", 280 packets dropped by kernel
    ) = 28
    close(3)                                = 0
    munmap(0x40018000, 4096)                = 0
    exit_group(0)                           = ?
    

    (mußte [ und ] durch {} ersetzen, da es sonst nicht als code angezeigt wurde)

    Das was ich sehe ist, das irgendetwas mit sockets gemacht wird, aber alles im allem erscheint mir das sehr wirr. 😕
    Gibt es jemanden der mir erklären kann, was da eigentlich passiert?

    Besten Dank



  • poste doch bitte hier nicht so riesige Logs.

    Die libpcap ist das was du suchst. Die stammt übrigens von dem tcpdump Projekt und wird von tcpdump auch benutzt. Aber ich glaube du könntest in deinem Fall dir auch Regeln für iptables programmieren und das darüber lösen.

    http://www.tcpdump.org/pcap.htm



  • kann ich den mit einer Regel für die ip tables ein Programm starten?
    ich dachte bisher damit kann ich nur die Paketverarbeitung beeinflussen (erlauben, forwarden...)


Anmelden zum Antworten