Otro quick&dirty script en python. En éste caso, vamos a crear los "puertos trampa" que queramos, de manera que quien se conecte, se bloqueará mediante una sencilla regla de iptables. Para ello, nuestro firewall deberá estar basado en iptables, caso contrario, no funcionará el invento. Sin más dilación, os muestro el script, que os podeis descargar al final del artículo.
>#!/usr/bin/python
import sys, os
import logging
import logging.handlers
import socket
from threading import Thread
import signal
import multiprocessing
event = multiprocessing.Event()
Exit=False
sthreads=[]
def term_handler(signal, frame):
Exit=True
for sthread in sthreads:
sthread.join()
event.set()
def banAddress(my_logger, address, port):
# baneo y registro en syslog
my_logger.critical(''%s:%s blocked! Connection not allowed.'' % (address,port) )
os.system("iptables -I INPUT -s %s -j DROP" % (address))
os.system("beep -f 555 -l 460")
return
class serverThread(Thread):
def __init__(self, ssocket, port, logger):
Thread.__init__(self)
self.socket=ssocket
self.logger=logger
self.port=port
def run(self):
while not Exit:
self.socket.listen(10)
(clientsocket, (address, port2)) = self.socket.accept()
banAddress(self.logger, address, self.port)
#data=clientsocket.recv(1024)
clientsocket.close()
def run():
#
# minimo, un solo parametro, puerto de escucha
#
if len(sys.argv)<2:
print "syntax: trap.py <port> [port] ...\\n"
sys.exit(0)
ports=[]
for i in range(1, len(sys.argv)):
ports.append(int(sys.argv[i]))
#
# inicializacion del syslog logger
#
logger = logging.getLogger(''tcp wrappers'')
logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler(address = ''/dev/log'')
logger.addHandler(handler)
for port in ports:
serversocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(("", port))
sthreads.append(serverThread(serversocket, port, logger))
sthreads[-1].start()
signal.signal(signal.SIGTERM, term_handler)
event.wait()
return
def godaemon():
pid = os.fork()
if(pid == 0):
os.setsid()
pid = os.fork()
if(pid ==0):
os.chdir("/")
os.umask(0)
run()
else:
os._exit(0)
else:
os._exit(0)
if __name__ == "__main__":
godaemon()
#run()
</port>
Utiliza varias técnicas como multithreading para cada puerto abierto, control de envío de señal TERM para finalizar el daemon, logging en /var/log/syslog , beep en cada conexión y poco más. Comentaros que podeis modificarlo a vuestro gusto y utilizarlo libremente. Lo dejo como licencia MIT, para quien quiera sacarle el jugo.
Descargar script: trap.py
Nada más por hoy.
blog comments powered by