2010-07-06 76 views
8

是否有可能在python中編寫防火牆?說它會阻止所有流量?是否有可能在python中編寫防火牆?

+2

對於哪種操作系統? Python將不得不使用內核的網絡堆棧。 – mcandre 2010-07-06 18:35:27

+4

他沒有指定,所以繼續回答是;) – Konerak 2010-07-06 18:37:16

+0

你爲什麼要這麼做?你是否知道,你有** C **機器之間的Python和實際組網調用(組裝) – 2010-07-06 18:38:21

回答

16

是的,是的。

我有一個Linux的iptables的交互來執行防火牆的職責,用nfqueue一些Python代碼。我可以在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

但是,在Windows上的Python呢? – 2012-05-03 21:54:01

3

我相信這可能是可能的,但不明智。正如mcandre所提到的,大多數操作系統都將防火牆所需的低級網絡功能緊密地耦合到內核中,因此,這項任務通常以C/C++完成,並與內核緊密集成。微內核操作系統(Mach等)可能比linux更適合。你可能能夠混合一些python和C,但我認爲這裏更有趣的討論將圍繞「爲什麼我應該」/「爲什麼不應該」在python中實現防火牆,而不僅僅是技術上的可行。

+0

我不知道在這裏,但它是保證在Python中IRQs及時到達用戶代碼(穿越python層)? – 2010-07-06 18:45:14

+0

BSD微內核?什麼? – 2010-07-06 18:50:40

+0

@Gollum:高度依賴於操作系統和有問題的通知方法。沒有Python代碼作爲IRQ處理程序運行的標準...... – 2010-07-06 18:52:06

2

「是」 - 這是通常的回答「有沒有可能......?」的問題。

難度和具體的實現是完全不同的。我認爲在技術上不要這樣做,如果你決心在Python中做一個快速的防火牆,你可以使用套接字庫並在每個端口上打開和關閉自己的連接。我不知道這將是多麼有效,儘管看起來不會。當然,如果你只是想自己動手,並且以此爲學習經歷,那麼很酷,那麼你就有很長的路要走,並且有很多的教育。

OTOH,如果你真的擔心網絡安全問題,那麼你可以使用其他產品的,你可以在iptables的* nix上使用到Windows上的ZoneAlarm。他們中的很多人都是自由和安全的,所以除了「我想學習」的基礎之外,沒有理由推出自己的產品。

+0

謝謝:) - 這是一個想學的基礎;)通常沒有必要,如果你想知道它是怎麼做的推倒重來execpt。 – Jake 2010-07-06 18:50:18

3

我敢肯定,在理論上可以達到你想要什麼,但我相信在實踐中你的想法是不可行的(如果你想知道爲什麼,這是因爲它太難「接口」高層次與低層次的語言核心)。

你可以做的反而是一些Python的工具,控制操作系統的防火牆,所以你可以添加規則,刪除等(以類似的方式來學習iptables確實在Linux中)。

+0

我明白了。如何將規則添加到防火牆? – Jake 2010-07-07 19:33:13

+0

在Linux上,通過iptables命令控制防火牆。您可以使用它來配置防火牆規則。 http://linux.die.net/man/8/iptables – 2010-07-08 04:13:27

3

有趣的線程。我偶然發現了它尋找Python NFQUEUE的例子。

我的看法是,你可以在python創造了巨大的防火牆和使用的內核。

E.g. 通過IP表添加一個linux fw規則,它將sys數據包(第一個)轉發到NFQUEUE for python FW以決定要執行什麼操作。

如果你喜歡它標識TCP流/使用NFQUEUE用FW標記流,然後有一個iptables規則,只允許所有通信與標記流。

這樣你就可以有一個強大的高層次的Python程序決定允許或拒絕流量,內核的速度來轉發所有其它數據包在相同的流量。

4

Python的iptables的提供了Python綁定在Linux下的iptables。通過使用iptables C庫(libiptc,libxtables和iptables擴展),而不是調用iptables二進制文件並解析其輸出,可以實現與iptables的互操作性。