2010-07-06 39 views
8

¿Es posible escribir un firewall en python? Digamos que bloquearía todo el tráfico?¿Es posible escribir un firewall en python?

+2

Por qué sistema operativo? Python tendrá que trabajar con la pila de red del kernel. – mcandre

+4

No especificó, así que adelante y responda sí;) – Konerak

+0

¿Por qué querría eso? ¿Sabe usted que tiene una capa de ** C ** entre python y llamadas de red reales en la máquina (ensamblaje) –

Respuesta

16

Sí, sí lo es.

Tengo un código Python que interactúa con Linux iptables para realizar tareas de firewall, usando nfqueue. Puedo utilizar una regla de iptables que se parece a:

iptables -A INPUT -j NFQUEUE --queue-num 1 

Y luego tener algo de código Python que se parece a:

import nfqueue 
from dpkt import ip 

q = None 

def cb(dummy, payload): 
    # make decision about if the packet should be allowed. in this case, drop everything: 
    payload.set_verdict(nfqueue.NF_DROP) 

q = nfqueue.queue() 
q.open() 
q.bind() 
q.set_callback(cb) 
q.create_queue(1) 

q.try_run() 

Aquí es una buena escritura hasta que el código anterior se basa en:

http://blog.yancomm.net/2011/05/nfqueue-packet-mangling-with-python.html

+1

Pero, ¿qué pasa con python en Windows? –

3

Estoy seguro de que es posible, pero poco aconsejable. Como menciona mcandre, la mayoría de los sistemas operativos combinan las capacidades de redes de bajo nivel que necesita para un cortafuegos en el kernel y, por lo tanto, esta tarea generalmente se realiza en C/C++ y se integra estrechamente con el kernel. Los sistemas operativos microkernel (Mach et al) podrían ser más fáciles de usar que Linux. Puede mezclar Python y C, pero creo que la discusión más interesante será "¿por qué debería?"/"¿Por qué no debería?" Implementar un cortafuegos en python en lugar de simplemente es técnicamente posible .

+0

No estoy seguro aquí, pero ¿está garantizado en python que las IRQ alcanzan el código de usuario de manera oportuna (cruzando la capa de python)? –

+0

BSD a Microkernel? ¿Qué? –

+0

@Gollum: Eso depende en gran medida del sistema operativo y el método de notificación en cuestión. No existe un estándar para que el código de Python se ejecute como controlador de IRQ ... –

2

"Sí": esa es generalmente la respuesta a "¿es posible ...?" preguntas

Cuán difíciles y específicas son las implementaciones completamente distintas. Supongo que, técnicamente, no hagas este tipo de cosas. Si estuvieras empeñado en crear un cortafuegos rápido en Python, podrías usar las bibliotecas de socket y las conexiones abiertas desde y hacia ti en cada puerto. No tengo idea de cuán efectivo sería, aunque parece que no lo sería. Por supuesto, si simplemente está interesado en hacer su propio esfuerzo y hacerlo como una experiencia de aprendizaje, entonces genial, tiene un largo camino por delante y mucha educación.

OTOH, si realmente está preocupado por la seguridad de la red, hay toneladas de otros productos que puede usar, desde iptables en * nix, a ZoneAlarm en Windows. Muchos de ellos son gratuitos y seguros, por lo que realmente no hay ninguna razón para hacerlo, excepto en base a "Quiero aprender".

+0

Gracias :) - Se trata de un deseo de aprender base;) Por lo general, no es necesario reinventar el execpt rueda si desea saber cómo se hizo. – Jake

3

Estoy seguro de que podría lograr lo que quiere, pero creo que en práctica su idea no es factible (si se pregunta por qué, es porque es demasiado difícil "interconectar" un lenguaje de alto nivel con el bajo nivel núcleo).

Lo que podría hacer en su lugar es un poco de herramienta de Python que controla el servidor de seguridad del sistema operativo por lo que podría añadir reglas, borrar, etc. (de manera similar a lo que hace iptables en Linux).

+0

Ya veo. ¿Cómo se podrían agregar reglas a un firewall? – Jake

+0

En Linux, el firewall se controla a través del comando iptables. Puede usar eso para configurar las reglas del firewall. http://linux.die.net/man/8/iptables –

3

Tema interesante. Me tropecé con eso buscando ejemplos de Python NFQUEUE.

Mi opinión es que podrías crear un gran firewall en python y usar el kernel.

E.g. Agregue una regla linux fw a través de tablas IP que reenvíen paquetes sys (la primera) a NFQUEUE para que python FW decida qué hacer.

Si lo desea, marque la corriente/flujo tcp con una marca FW usando NFQUEUE y luego tenga una regla de iptables que solo permita todas las transmisiones de tráfico con la marca.

De esta forma puede tener un potente programa de python de alto nivel que decida permitir o denegar el tráfico, y la velocidad del núcleo para reenviar todos los demás paquetes en el mismo flujo.

4

Python-iptables proporciona enlaces de python a iptables en Linux. La interoperabilidad con iptables se logra mediante el uso de las bibliotecas de iptables C (libiptc, libxtables y las extensiones de iptables), sin llamar al binario de iptables y analizar su resultado.

0

muy posible y todo un framework está dedicado a ella aquí: https://github.com/austin-taylor/bluewall

+0

En lugar de publicar enlaces como respuesta, agregue un texto a la explicación de cómo esta respuesta ayuda a OP en la solución del problema actual. Gracias –

Cuestiones relacionadas