Ключевые слова:spam, block, (найти похожие документы)
From: ProFTP <q7u5@ukr.net.>
Newsgroups: email
Date: Mon, 15 Jul 2009 14:31:37 +0000 (UTC)
Subject: Скрипт блокировки спамеров на www средствами ipfw table и nginx
Задача: закрыть спам на сайтах.
Есть черный список (black list) ip на сайте stopforumspam.com
(есть и другие списки), список часто обновляется. В blacklist входя
прокси-сервера, взломанные машины через которые боты пытаються спамить
на все www сразу...
Проще всего добаавить в ipfw таблицу, после блокировки максимум 1 спам
сообщение за несколько суток или за неделю.
add deny ip from table(1) to any
vi /root/spamstop.pl
#!/usr/bin/perl
# use Proc::Daemon;
# Proc::Daemon::Init;
# use Proc::PID::File;
# die "Already running!" if Proc::PID::File->running();
## можно раскомментировать, это для того чтобы скрпит одновременно повторно не запустился
use LWP::Simple;
my $spam = get("http://www.stopforumspam.com/downloads/bannedips.csv");
my $hash;
$hash->{$1} ++ while $spam =~ /(\d+\.\d+\.\d+\.\d+)/smg xor grep {$_>255} split /\./,$1;
system("ipfw table 4 flush > /dev/null &") if (defined $spam);
while( my $key = each %$hash){
system("ipfw table 4 add $key > /dev/null &");
}
exit;
crontab:
8 0 * * * root /root/spamstop.pl
можно при старте системы добавить этот скрипт в /usr/local/etc/rc.d/
скрипт выполняется не быстро, 4-10 минут, грузит процессор, можно
добавить больше детей...
ipfw -a list | grep table
00150 1317 65171 deny ip from table(1) to any
вариант помягче: http://forum.lissyara.su/viewtopic.php?f=14&t=16531#p159781
теперь в фаерволле у меня правило:
00530 fwd 127.0.0.1,8013 tcp from table(4) to me dst-port 80
а 127.0.0.1:8013 слушает nginx
(основной вебсервер апач на 80 порту, а nginx только для быстрого отлупа "форум-спамера")
вот конфиг nginx
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 10;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 1;
#gzip on;
server {
listen 127.0.0.1:8013;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
error_page 400 401 403 404 500 502 503 504 =200 /index.html;
location / {
root /usr/local/www/nginx;
index index.html index.htm;
}
}
}
а в index.html что-то типа этого
<html >
<head>
<title>Welcome to zztop!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>You are seing this page, because you are in blacklist.</h1></center>
<center><h2>Visit http://www.stopforumspam.com/ to check you IP, or contact me: email@was.here</h2></center>
<center><h3>Best regards, St. Me.</h3></center>
</body>
</html>
Результат:
* nginx как "легкий" веб-сервер отлично и быстро отдает статику типа
маленького html файлика, в котором написано что пользователь в
стоп-листе
* если пользователь оказывается в стоп-листе, то он не тупо
отфаерволивается, а редиректится на nginx, где его посылают, но красиво :)
* в апач запросы спамера не попадут вообще, т.е. он их не будет
обрабатывать, и 1) нагружаться; 2) позволять роботам постить спам
Автор: ProFTP
ссылка: http://unixforum.org.ua/index.php?topic=2127
альтернативная http://www.lissyara.su/?id=1910