Berkeley Packet Filter - Problem
-
Hallo, hab ein ein rießen Problem mit dem bpf Device unter BSD. Folgender code ausschnitt, sollte normal, den einkommenden Traffic, auf device "rl0" Ethernet, auf Packete "achten" die an den Port 22 gerichtet sind. Nur ließt er weder mit, noch achtet der folglich auf addressierten Port 22. Bin den Code zig mal rauf und runter gegangen, kann aber keinen Fehler festellen, also was ist falsch?
#ifdef FREEBSD int recvBytes; struct ifreq ifr; struct ip *iph; struct tcphdr *tcph; struct bpf_hdr *buf; int bufLength; unsigned int portTrue = 0; // erstmal nicht so wichtig int true = 1; struct bpf_insn bpfRules[] = { /* Make sure this is an IP packet... */ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 12), BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 8), /* Make sure it's a UDP packet... */ BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 23), BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6), /* Make sure this isn't a fragment... */ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 20), BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0), /* Get the IP header length... */ BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 14), /* If we passed all the tests, ask for the whole packet. */ BPF_STMT(BPF_RET+BPF_K, (u_int)-1), /* Otherwise, drop it. */ BPF_STMT(BPF_RET+BPF_K, 0) }; struct bpf_program bpf_program = { 14, (struct bpf_insn *)&bpfRules }; if((rSock = socket(PF_INET, SOCK_RAW, IPPROTO_IP)) <= 0) { return 1; } if((setsockopt(rSock, IPPROTO_IP, IP_HDRINCL, &true, sizeof(true))) < 0) { return 2; } strncpy(ifr.ifr_name, INTERFACE, sizeof(ifr.ifr_name) - 1); // rl0 if(ioctl(bpfDevHandle, BIOCSETIF, &ifr) < 0) { return 3; } ioctl(bpfDevHandle, BIOCSETIF, &bpf_program); ioctl(bpfDevHandle, BIOCGBLEN, &bufLength); if(ioctl(bpfDevHandle, BIOCIMMEDIATE, &true) < 0) { return 4; } if(ioctl(bpfDevHandle, BIOCPROMISC, 0) < 0) { return 5; } buf = (struct bpf_hdr*)malloc(bufLength); bzero(buf, bufLength); for(;;) { if((recvBytes = read(bpfDevHandle, (void *)&buf, bufLength)) == -1) { return 6; } iph = (struct ip*)((char*)buf+buf->bh_hdrlen+sizeof(struct ether_header)); tcph = (struct tcphdr*)((char*)iph+sizeof(struct ip)); if(recvBytes > 20) { if(iph->ip_p == IPPROTO_TCP) { if(portTrue == 0 && ntohs(tcph->th_dport) == 22) { printf("incoming packet to port 22\n"); } } } if(recvBytes <= 0) { return 7; } } #endif
Nur als Beifügung, um zu sehen wie ich das bpf Device geöffnet habe.
unsigned int OpenPacketDevice() { char bpfDevice[] = DEVICE; char bpfDevBuffer[20]; int bpfDevNumber = 0; int bpfDevHandle; /* searching a not busy pseudo bpf device */ while(bpfDevNumber != MAXDEVICECOUNT) { sprintf(bpfDevBuffer, "%s%d", bpfDevice, bpfDevNumber); if((bpfDevHandle = open(bpfDevBuffer, O_RDONLY)) < 0) { bpfDevNumber++; } else { return bpfDevHandle; } } return 1; }
Vielen Dank schonmal.
-
Hallo,
ich bin mir im Moment nicht ganz sicher, aber muesste es nicht
"/dev/%s%u"
sein?
mfg
v R
-
Leider nicht die Lösung des Problems