是否使用C套接字编程来侦听传入数据;“背后”;或;“之后”;防火墙?

是否使用C套接字编程来侦听传入数据;“背后”;或;“之后”;防火墙?,c,sockets,network-programming,firewall,C,Sockets,Network Programming,Firewall,最近我一直在研究使用C语言进行网络套接字编程。我想知道我是否写了一个程序来监听传入的数据,这是“在防火墙之前”还是“在防火墙之后” 据我所知,像nginx、lighttpd或cherokee这样的web服务器使用套接字编程来监听数据,但我可以设置一个像(OpenBSD的)“pf”这样的防火墙来控制传入的数据,所以C中的套接字编程似乎是在防火墙之后 但是,如果这是真的,那么防火墙是如何编写的呢?它们如何侦听来自特定端口的传入数据?防火墙由内核在网络代码的不同部分实现。从本质上讲,它相当于一系列“钩

最近我一直在研究使用C语言进行网络套接字编程。我想知道我是否写了一个程序来监听传入的数据,这是“在防火墙之前”还是“在防火墙之后”

据我所知,像nginx、lighttpd或cherokee这样的web服务器使用套接字编程来监听数据,但我可以设置一个像(OpenBSD的)“pf”这样的防火墙来控制传入的数据,所以C中的套接字编程似乎是在防火墙之后


但是,如果这是真的,那么防火墙是如何编写的呢?它们如何侦听来自特定端口的传入数据?

防火墙由内核在网络代码的不同部分实现。从本质上讲,它相当于一系列“钩子”(可以通过内核空间或用户空间访问,也可以通过两者访问)的选择,这些钩子在活动时发出通知

该活动可以是传入(入口)或传出(出口),具体取决于数据包的发起人。对于有状态、面向连接的协议的每个数据包和每个连接,防火墙都有机会重新写入、否决(例如,返回错误)或只是静默地丢弃给定的数据包或连接。(实现各不相同,可用的操作可能更复杂)

关键是这些接口与普通的sockets接口有很大的不同——你被告知事情正在发生,并被问到你想做什么,但是你没有得到通常用于sockets编程的相同的accept/listen/connect风格的接口


例如,在Linux上,防火墙被实现为中的输入/输出“过滤器”框,而套接字代码出现在顶部标记为“协议/应用程序层”的红色层中。

Linux防火墙(“netfilter”)是内核IP网络代码的一部分;我相信BSD也是如此。展示了它在Linux上是如何工作的。那么,您介意提供更多关于如何使用C编写防火墙的信息吗?有什么链接或参考资料需要阅读吗?@ikevinjp On Linux是开始的地方。您可能对libiptc感兴趣,它允许您操作活动规则集,除非您想做一些非常复杂的事情,在这种情况下,用户空间队列/contrack接口可能就是您想要的。