Можно ли написать брандмауэр на python? - PullRequest
9 голосов
/ 06 июля 2010

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

Ответы [ 7 ]

17 голосов
/ 07 июля 2010

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

У меня есть код Python, который взаимодействует с iptables Linux для выполнения функций брандмауэра, используя 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

4 голосов
/ 02 июля 2013

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

http://ldx.github.io/python-iptables/index.html

3 голосов
/ 24 февраля 2013

Интересная тема.Я наткнулся на это в поисках примеров Python NFQUEUE.

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

Например, добавить правило linux fw через таблицы IP, которые пересылают sysпакеты (первые) в NFQUEUE для Python FW, чтобы решить, что делать.

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

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

3 голосов
/ 06 июля 2010

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

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

3 голосов
/ 06 июля 2010

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

2 голосов
/ 06 июля 2010

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

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

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

0 голосов
/ 20 октября 2016

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

...