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.
-
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...)