Firmas anti-SPAM para ClamAV

[spanish]

Hace unos días dí con el conjunto de firmas SaneSecurity para el anti-virus ClamAV, que detectan gran cantidad de mensajes de SPAM (sobre todo los últimos en GIF o PDF) y phishing. En éste sentido son similares a MSRBL, sólo que por lo que estoy comprobando bastante mejores. O visto de otra forma, uno es el complemento perfecto del otro. :)

Usando éstas dos BD de firmas y otras técnicas (SpamAssassin, DNS, RBL…) en el servidor de la empresa estamos bloqueando más del 80% de los correos totales que nos llegan, unos 100000-120000 diarios, con un índice de falsos positivos bajísimo, 2-3 por semana a lo sumo. Eso contando también el tráfico interno, quiero sacar una estadística contando sólo el externo, en la que estoy seguro que el índice de bloqueos superará con creces el 90%.

Llevo tiempo queriendo escribir un artículo sobre las distintas técnicas anti-SPAM que utilizamos. A ver si consigo sacar un rato un día de éstos y me pongo…

[/spanish]

[english]

A couple of days ago I stumbled upon the SaneSecurity set of ClamAV signatures, that detect a lot of SPAM (mainly the latest batch of GIF and PDF SPAM) and phishing mails. They’re similar to the MSRBL signatures, only better judging by the results we’re getting. Or to put it another way, one is the perfect complement to the other. :)

By using these two ClamAV signature sets together and some other techniques (SpamAssassin, DNS, RBL…) we’re stopping at work around 80% of all the mails we get, 100000-120000 daily, with a very low false-positive ratio, 2-3 weekly at most. And these figures include all the internal mails too which are supposed not to be SPAM, I’m sure the real SPAM blocking ratio (just external mails) in our system is way above 90%. One of these days I’ll do the math.

I’ve been thinking for some time about writing an article about the different anti-SPAM techniques we use here. I’ll see if I can get some free time to do it…

[/english]

maç özeti,

live football highlights,

football video,

football videos,

football highlight,

football highlights, </h1

live football streaming,

live footbal,

online footbal,

free football streaming,

live football stream,

stream live football,

free football streaming,

lig tv

soccer stream

football stream

ligtv

maç izle

canlı maç

canlı futbol

canlı futbol izle

canlı futbol tv

futbol maçı izle

futbol smart

futbol smart izle

futbol tv izle

футбол онлайн

трансляция футбол

смотреть онлайн футбол

смотреть футбол

soccer live

soccer tv

live soccer streaming

stream soccer

online football

watch football

football match

football streaming

live streaming

watch football

live football

football tv

futbol vivo

partido en vivo

juegos futbol

futbol online

futbol gratis

roja directa

jogos de futebol

jogo de futebol

futebol online

assistir tv

atdhe

foot en direct

jeux de foot

jeux football

calcio diretta

calcio streaming

giochi calcio

live ποδόσφαιρο

podosfairo live

αγωνεσ ποδοσφαιρου

video sepak bola

game bola sepak

Siaran Langsung Sepakbola

bola siaran langsung

futbol juegos

partidos en vivo

bóng đá online

xem bóng đá

bóng đá trực tuyến

bóng đá trực tiếp

ฟุตบอล online

ฟุตบอลสด

บอล online

ดู ฟุตบอล สด

ถ่ายทอด สด

online futball

live fussball

fussball live stream

live stream fußball

bundesliga live stream

fußball live

bundesliga fußball

piłka nożna na żywo

piłka nożna online

fotbal live

fotbal online

fotbal živě

fotbal zive

fotbollskanalen

fotball live

footballl live

football online

fotball på tv

футбол онлайн

футбол трансляція

футбол канал

live voetbal

live voetbal

voetbal kijken

voetbal online

фудбал уживо

fudbal uzivo

live fudbal

futbal online

live futbal

live footy

مباريات كرة القدم

مباشر كرة القدم

بث حي مباشر

مباشر مباريات

כדורגל שידור ישיר

שידור חי כדורגל

بث كرة القدم

football forum

football forums

football community

football talk

soccer forum

soccer forums

tn115

tn115 toner

brother tn115

tn115bk

brother tn115bk

tn115bk toner

DCP-9040CN toner

DCP-9045CDN toner

HL-4040CDN toner

HL-4040CN toner

HL-4070CDW toner

MFC-9440CN toner

MFC-9450CDN toner

MFC-9840CDW toner

DCP9040CN toner

DCP9045CDN toner

HL4040CDN toner

HL4040CN toner

HL4070CDW toner

MFC9440CN toner

MFC9450CDN toner

MFC9840CDW toner

q6000a toner

q6000a cartridge

hp 1600 color

hp 1600 toner

hp 1600 ink

laserjet 1600 toner

hp color 2600

hp toner 2600

hp 2600 ink

hp 2600 toners

hp 2600 cartridge

1600 toner

2600 toner

toner laserjet 2600

hp 2600n color

toner for hp 2600n

hp 2600n toner

hp 2600n toners

ink for hp 2600n

toner for hp laserjet 2600n

hp laser 2600n toner

hp 2600n cartridge

hp 2600n cartridges

hp laserjet 2600n ink

toner laserjet 2600n

hp toner q6003a

q6003a cartridge

q6000a toner

q6002a cartridge

hp color 3800

toner for hp 3800

toner hp 3800

hp 3800 cartridges

laserjet 3800 toner

cartridge q6470a

q6470a hp

toner q6470a

hp q6470a black

hp q7581a

q7581a toner

hp q7583a

q7583a toner

hp q7582a

q7582a toner

hp 3800dn toner

hp cp3505 toner

hp 3600 toner

toner for hp 3600

hp 3600 toners

hp 3600 cartridge

hp 3600 cartridges

hp 3600 ink

laserjet 3600 toner

q6470a toner

q6470a cartridge

q6470a black

hp q6470a

q6471a toner

hp q6471a

hp q6473a

toner q6473a

hp q6472a

toner q6472a

hp 3600 toner

toner for hp 3600

hp 3600 toners

hp 3600 cartridge

hp laserjet 3600 toner

hp 3600 ink

hp 3600 toner cartridge

hp laserjet 3600 cartridge

hp 3600 toner cartridges

laserjet 3600 toner

hp 3600n toner

toner for hp 3600n

hp 3600n cartridge

hp laserjet 3600n toner

hp 3600n cartridges

hp 3600n ink

hp color laserjet 3600n toner

hp 3600n toner cartridge

hp color laserjet 3600n cartridge

q6470a hp

toner q6470a

cartridge q6470a

hp q6470a black

hp q6471a

q6471a toner

hp 2550 toner

toner 2550

hp 2550 color

hp 2550 drum

laserjet 2550 toner

toner for hp 2550

hp 2550 toners

hp 2550 ink

hp laserjet 2550 toner

hp 2550 cartridge

hp 2550 cartridges

hp 2550 toner cartridge

hp 2550 toner cartridges

hp laserjet 2550 cartridges

hp 2550 printer cartridges

q3960a toner

q3960a cartridge

q3960a black

q3960a hp

hp laserjet q3960a

q3961a toner

hp q3960a

q3962a toner

q3963a toner

hp q3963a

hp q3962a

hp q3961a

hp toner 2840

toner for hp 2840

hp 2840 toners

hp 2840 drum

drum for hp 2840

hp laser 2840 toner

hp 2840 cartridge

hp laserjet 2840 drum

Un Akamai de andar por casa

[spanish]

En la empresa donde trabajo llevamos las ediciones digitales de varios diarios locales repartidos por toda la geografía española. Ninguno es grande en el sentido de tener distribución nacional, pero la gran mayoría son líderes de difusión en su provincia.

Desde hace bastante tiempo hemos tenido problemas de rendimiento con uno de ellos. Los tiempos de carga desde aquí eran muy buenos (<5s), sin embargo los lectores de la región donde se distribuye éste periódico se quejaban continuamente de problemas de lentitud (tiempos de carga >40s, increíblemente altos). Por más que optimizáramos nuestros servidores, la red, el HTML, CSS, el código… el problema persistía, lo que nos hizo pensar que había algo más que se nos estaba escapando.

Después de mucho investigar averiguamos que el proveedor de acceso a Internet mayoritario de esa región, que por supuesto usaba la mayoría de los lectores del diario, tenía problemas de enrutamiento contra nuestro proveedor: un traceroute mostraba que el tráfico se enrutaba a través de Alemania antes de llegar de vuelta a España y a nuestros servidores, con una latencia y tiempos de respuesta elevados.

Así que el problema no era culpa nuestra, la solución real estaba más allá de nuestro alcance, pero nuestra imagen estaba en juego por lo que era responsabilidad nuestra encontrar una solución. ¿Qué podíamos hacer?

Al final nos vino la inspiración y vimos el camino a seguir: conseguir un housing en el proveedor local de la región del diario, configurar allí un proxy inverso y redirigir a éste proxy a todos los lectores de la zona. Por supuesto el problema de lentitud en el enrutamiento entre el proxy y nuestros servidores persistiría, pero como el contenido se iba a cachear y refrescar en segundo plano, el problema no repercutiría nunca en el usuario final.

Hay dos programas implicados en la solución (aparte del servidor web, claro):

  • squid, el proxy más extendido en el mundo Linux/UNIX.
  • djbdns, nuestro servidor DNS favorito, que entre otras cosas permite devolver valores distintos según la IP del cliente que pregunte.

squid

squid es bastante fácil de configurar como proxy inverso. Tras instalarlo («apt-get install squid» en nuestro servidor Debian) hay que editar el fichero de configuración /etc/squid/squid.conf y modificar:

[code lang=»bash»]
# Actuar como proxy inverso en el puerto 80 en lugar del 3128
http_port 80 vhost

# Tratar peticiones concurrentes de la misma URI como una,

# reduce ancho de banda y en nuestro caso mejora la velocidad
collapsed_forwarding on

# Definir los dominios que vamos a servir, y
# denegar cualquier otro
acl myDomains dstdomain www.example.com isp2.example.com
http_access deny !myDomains
[/code]

Obviamente la configuración del squid es mucho más compleja que ésto. Éstas son las opciones básicas para poner en marcha nuestra solución, empezar a hacer pruebas y a partir de ahí, optimizar: límites de consumo de memoria, gestión de la caché de objetos, gestión de los cache-expires (que en cualquier caso están mejor en el código de la aplicación que en el proxy), compartir cachés entre proxies «vecinos», y mucho más. Consulta un buen HOWTO de squid o algún libro si quieres aprender a optimizar al máximo éste servicio.

djbdns

Y ahora la parte delicada: el «truco» de enviar a unos lectores al servidor principal, y a otros al proxy. Por suerte, el servidor DNS que utilizamos (djbdns) permite hacer ésto de serie.

Lo que hemos hecho ha sido definir dos nombres, isp1.example.com apuntando a la IP del servidor principal, e isp2.example.com apuntando a la del proxy, y configurar un CNAME que será quien en función de la IP del cliente apuntará a uno u otro nombre. Es más o menos lo mismo que hace Akamai. De ésta forma, podemos acceder fácilmente a cada uno de los servidores para comprobar su correcto funcionamiento.
[code lang=»bash»]
# Rango IP XXX.YYY.x.x, lo dirigiremos al proxy
%PX:XXX.YYY
# Resto
%RS:

# Campos A para el servidor real y el proxy
=isp1.example.com:A.B.C.D:300
=isp2.example.com:Z.Y.X.W:300

# CNAME que pivotará según la IP del cliente
Cwww.example.com:isp2.example.com.:300::PX
Cwww.example.com:isp1.example.com.:300::RS
[/code]

Por supuesto, siguiendo éste esquema podríamos llegar a utilizar tantos proxies queramos en tantos ISPs como podamos necesitar, creando efectivamente una CDN (Content Delivery Network, red de entrega de contenido) tipo Akamai. Os imagináis cómo sería.

Para más información sobre la sintaxys de djbdns, consultar: http://cr.yp.to/djbdns/tinydns-data.html[/spanish]

[english]

At the company I work for, we manage the digital editions of several local newspapers spread all over Spain. None of them is big in a nation-wide sense, but almost all of them are leaders on their region.

For quite some time, we’ve had performance problems with one of them: performance here was good (<5s load times), but the users from the region that particular newspaper is distributed on kept complaining about poor performance (>40s load times, unbelievable high). The more we optimized our server and network infrastructure, the HTML layout, CSS, code… the more they complained and the more obvious it became that there was something else going on.

After some investigations we discovered that the routing between the major ISP of that region, which almost all of our readers used, and ours was the cause of the problem: a traceroute from a local DSL line there to our servers showed that the traffic went to Germany before coming back to Spain, with quite a high latency and high roundtrip times.

So, it wasn’t our fault, the real solution to the real problem was out of our reach, but in the end, our image was at stake so it was OUR problem. What could we do?

After some inspiration the solution became clear: get a housing on the local ISP which had the problems and set-up a reverse proxy there, and redirect all clients of that ISP to this proxy. Sure, the connection between the proxy and our servers would be as bad as before, but as the content would be cached and refreshed on the background, the final user shouldn’t notice it any more!

There are just two pieces of software involved here:

  • squid, the most used proxy on the Linux/UNIX world.
  • djbdns, our DNS server of choice. Among other things, it has the ability to return different IP addresses to an A query depending on the IP address of the client.

squid

squid is quite easy to set-up as a reverse proxy. After installing it («apt-get install squid» in our Debian-based server) edit the main config file at /etc/squid/squid.conf and:

[code lang="bash"]
# Make it work as a reverse proxy on port 80 instead of 3128
http_port 80 vhost

# Treat several concurrent queries for the same URI as one,
# reduces bandwidth and in our case improves performance
collapsed_forwarding on

# Define wich domains are we going to serve
# Refuse anything else
acl myDomains dstdomain www.example.com isp2.example.com
http_access deny !myDomains
[/code]

Obviously there’s much more to configuring squid than this. These are just the basic options to get our solution going and do some preliminary tests. Then there’s memory limits, object-cache management, cache-expires management (which you better have on your application code anyway), peer caches, and much much more. Get some good Squid HOW-TO or book if you want to learn how to tweak it for optimum performance.

djbdns

Now the tricky part: directing some users to our servers and some other to the proxy. Luckily, the DNS server we use (djbdns) has a built-in option to do this.

What we’ve done is defining two names, isp1.example.com pointing to our IP, and isp2.example.com pointing to the proxy, and then a CNAME which will point to one or another depending on the client’s IP, much like Akamai does. This way we can easily and individually access each server.

[code lang=»bash»]
# XXX.YYY.x.x IP range, will send it to the proxy
%PX:XXX.YYY
# All the rest
%RS:

# A records for our server and the proxy
=isp1.example.com:A.B.C.D:300
=isp2.example.com:Z.Y.X.W:300

# Pivoting CNAME depending on the client’s IP
Cwww.example.com:isp2.example.com.:300::PX
Cwww.example.com:isp1.example.com.:300::RS
[/code]

Of course, following this scheme we could add as many proxies on as many ISPs more as we wanted, creating an Akamai-like CDN (Content Delivery Network). You get the picture.

For more info on djbdns data syntax, please check: http://cr.yp.to/djbdns/tinydns-data.html [/english]