2010-07-06 3 views
8

Можно ли написать брандмауэр в python? Скажем, это заблокировало бы весь трафик?Можно ли написать брандмауэр в python?

+2

Для какой операционной системы? Python должен будет работать с сетевым стекем ядра. – mcandre

+4

Он не уточнил, так что давайте ответьте да;) – Konerak

+0

Зачем вам это нужно? вы знаете, что у вас есть слой ** C ** между python и фактическими сетевыми вызовами на машине (сборка) –

ответ

16

Да, да, это так.

У меня есть код Python, который взаимодействует с Linux iptables для выполнения обязанностей брандмауэра, используя nfqueue. Я могу использовать правило в IPTables, который выглядит следующим образом:

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

И тогда есть некоторые Python код, который выглядит следующим образом:

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() 

Вот хороший подправить, что приведенный выше код основывается на:

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

+1

Но как насчет python на окнах? –

3

Я уверен, что это возможно, но не рекомендуется. Как упоминает mcandre, большинство ОС объединяют сетевые возможности низкого уровня, необходимые для брандмауэра, в ядро, и поэтому эта задача обычно выполняется на C/C++ и тесно интегрируется с ядром. Микроядровые ОС (Mach et al) могут быть более восприимчивыми, чем linux. Возможно, вы сможете смешивать некоторые python и C, но я думаю, что более интересная дискуссия здесь будет «почему я должен// почему я не должен» реализовывать брандмауэр в python, а не просто технически возможно ,

+0

Я не уверен здесь, но гарантируется ли в python, что IRQs своевременно достигают кода пользователя (пересекая слой python)? –

+0

BSD a Microkernel? что? –

+0

@ Gollum: Это сильно зависит от операционной системы и метода уведомления. Нет стандарта для того, чтобы код Python выполнялся как обработчик IRQ ... –

2

«Да» - это обычно ответ на вопрос «возможно ли это?»? вопросов.

Насколько сложными и конкретными реализациями является нечто иное. Я полагаю, что технически это не так, если бы вы были настроены на быстрый брандмауэр на Python, вы могли бы использовать библиотеки сокетов и открывать подключения к себе и от себя на каждом порту. Я понятия не имею, насколько это было бы эффективно, хотя похоже, что этого не будет. Конечно, если вы просто заинтересованы в том, чтобы кататься самостоятельно и делать это как учебный опыт, тогда классный, у вас долгий путь впереди вас и много образования.

OTOH, если вы действительно беспокоитесь о сетевой безопасности, есть тонн других продуктов, которые вы можете использовать, начиная с iptables на * nix, до ZoneAlarm на окнах. Многие из них являются свободными и безопасными, поэтому нет причин отказываться от вас, кроме как на основе «Я хочу учиться».

+0

Спасибо :) - Он хочет учиться на основе;) Обычно нет необходимости изобретать колесо execpt, если вы хотите знать, как оно было сделано. – Jake

3

Я уверен, что теоретически вы могли бы достичь того, чего хотите, но я верю, что на практике ваша идея не выполнима (если вы задаетесь вопросом, почему, это потому, что слишком сложно «взаимодействовать» с языком высокого уровня с низким уровнем ядро).

Что вы можете сделать вместо этого - это инструмент Python, который управляет брандмауэром операционной системы, чтобы вы могли добавлять правила, удалять и т. Д. (Аналогично тому, что делает iptables в Linux).

+0

Я вижу. Как добавить правила в брандмауэр? – Jake

+0

В linux брандмауэр управляется командой iptables. Вы можете использовать это для настройки правил брандмауэра. http://linux.die.net/man/8/iptables –

3

Интересная тема. Я наткнулся на это, глядя на примеры Python NFQUEUE.

Мое мнение, что вы можете создать отличный брандмауэр в python и использовать ядро.

E.g. Добавьте правило linux fw через таблицы IP, которые передают sys-пакеты (первый) в NFQUEUE для python FW, чтобы решить, что делать.

Если вам нравится, отметьте поток/поток tcp с меткой FW, используя NFQUEUE, а затем введите правило iptables, которое позволяет только всем потокам трафика с отметкой.

Таким образом, у вас может быть мощная высокоуровневая программа python высокого уровня, позволяющая разрешать или запрещать трафик и скорость ядра для пересылки всех других пакетов в одном потоке.

4

Python-iptables обеспечивает привязки python к iptables под Linux. Взаимодействие с iptables достигается с помощью библиотек iptables C (libiptc, libxtables и расширений iptables), не вызывая двоичный файл iptables и не анализируя его вывод.

0

Очень возможно, и вся структура посвящена его здесь: https://github.com/austin-taylor/bluewall

+0

Вместо того, чтобы размещать ссылки как ответ, добавьте некоторый текст к объяснению, как этот ответ помогает OP в фиксации текущей проблемы. Спасибо –

Смежные вопросы