能否使用Python编写防火墙?

13

能否用Python编写一个防火墙?假设它可以阻止所有流量?


2
针对哪个操作系统?Python将需要与内核的网络堆栈一起工作。 - mcandre
6
他没有具体说明,所以你可以回答“是” ;) - Konerak
你为什么想要那个?你知道在机器(汇编)上的Python和实际网络调用之间有一层C吗? - Ramadheer Singh
对于比如说...Windows... @Gollum 只是试着去做一下... - Jake
6个回答

19

是的,没错。

我有一些使用nfqueue与Linux iptables进行防火墙任务交互的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


4
那么,Python 在 Windows 上怎么样? - Marwen Trabelsi

4

Python-iptables提供了Linux下的iptables的Python绑定。通过使用iptables C库(libiptc、libxtables和iptables扩展),而不是调用iptables二进制文件并解析其输出,实现了与iptables的互操作性。

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


4
我相信从理论上讲,您可以实现您想要的,但实际上我认为您的想法是不可行的(如果您想知道为什么,那是因为在高级语言和低级内核之间进行“接口”太难了)。
您可以尝试使用一些Python工具来控制操作系统的防火墙,以便您可以添加规则、删除规则等(类似于Linux中iptables的方式)。

我明白了。如何向防火墙添加规则? - Jake
在Linux上,防火墙是通过iptables命令进行控制的。您可以使用该命令来配置防火墙规则。http://linux.die.net/man/8/iptables - Peter Lyons

3

有趣的帖子。我是在寻找Python NFQUEUE示例时偶然发现它。

我认为你可以使用内核在Python中创建一个很棒的防火墙。

例如,通过IP表添加Linux防火墙规则,将系统数据包(第一个)转发到NFQUEUE以供Python防火墙决定如何处理。

如果您喜欢,可以使用NFQUEUE标记TCP流/流,并具有仅允许所有具有该标记的流量流的iptables规则。

这样,您就可以拥有一个功能强大的高级Python程序来决定是否允许或拒绝流量,以及内核转发同一流中的所有其他数据包的速度。


3

我相信这是可能的,但不被建议。正如mcandre所提到的,大多数操作系统将你需要用于防火墙的低级网络功能与内核紧密耦合,因此通常使用C/C++完成此任务并与内核紧密集成。微内核操作系统(如Mach等)可能比Linux更适合。您可以混合使用一些Python和C,但我认为在这里更有趣的讨论将围绕“我应该”/“我不应该”实现一个Python防火墙,而不仅仅是技术上是否可能。


我不确定,但在Python中是否保证IRQ及时到达用户代码(跨越Python层)? - Ramadheer Singh
@Gollum:这高度取决于操作系统和所涉及的通知方式。目前还没有标准来让Python代码作为IRQ处理程序运行... - Yann Ramin
@theatrus,是的,在Cocoa(苹果框架)中,通知方法不能保证及时传递信号。(所以我的问题是,在IRQ被处理后,它仍然需要以某种形式(接收到数据包、键盘输入等)分派到Python代码中。我想我得到了答案。(大声思考) - Ramadheer Singh
糟糕,修正了微内核示例。谢谢,theatrus。 - Peter Lyons

2
“是的”-通常这是“是否可能……?”问题的答案。
然而,具体实现的难度和特定要求则是完全不同的。我想从技术上来说,如果你非常想用Python快速制作一个防火墙,你可以使用socket库并在每个端口上打开与自己的连接。但我不知道这样做有多有效,尽管它似乎并不会很好。当然,如果你只是想自己动手制作,并将此作为学习经验,那么很酷,你还有很长的路要走,需要学习很多东西。
另一方面,如果你真的担心网络安全,那么有许多其他产品可供使用,从*nix上的iptables到Windows上的ZoneAlarm都有。其中许多产品都是免费且安全的,因此除了基于“我想学习”的目的外,没有理由自己制作。

通常情况下,我们不需要重新发明轮子,除非你想知道它是如何制造的。这是一种基于学习愿望的态度。 - Jake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接