I hate firewalls, but I have no choice, with gigabytes of spam-traffic. By a mistake of mine, I probably locked out a lot of IP adresses that should not have been locked out. I am sorry for that.
If you notice that I locked somebody out, please let me know.
There is apparently no simple possibility to find out whether a given IP adress is blocked. So I cannot easily filter my logfiles. Above that, the default whois-answer gives an IP range, but iptables wants CIDR-notation.
I could not find any software calculating this (if somebody knows a good one, then please tell me). What I quickly wrote in a file range2cidr.c is:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include <netdb.h>
#include <math.h>
int main (int argc, char ** argv) {
if (argc != 3) {
printf("Usage: %s lowerbound upperbound\n", argv[0]);
exit(EXIT_FAILURE);
} else {
uint32_t lowip, highip;
struct hostent *host;
host = gethostbyname(argv[1]);
lowip =
((((uint8_t) host->h_addr[0]) % 256) << 24) +
((((uint8_t) host->h_addr[1]) % 256) << 16) +
((((uint8_t) host->h_addr[2]) % 256) << 8) +
((((uint8_t) host->h_addr[3]) % 256));
host = gethostbyname(argv[2]);
highip =
((((uint8_t) host->h_addr[0]) % 256) << 24) +
((((uint8_t) host->h_addr[1]) % 256) << 16) +
((((uint8_t) host->h_addr[2]) % 256) << 8) +
((((uint8_t) host->h_addr[3]) % 256));
uint32_t msk = lowip ^ highip;
int i=0;
while (msk != 0) {
msk /= 2;
i++;
}
printf("%s/%d\n", argv[1], 32-i);
exit(EXIT_SUCCESS);
}}
You might wonder why I calculated the IPs so high-level. Well, I just did not want to care about the whole lowlevel-fuss and still have it portable - I mean, this code does not need to be fast, it just needs to be correct.
Anyway, there has got to be better software. Any suggestions?