最近我一直在研究使用C语言进行网络套接字编程。我想知道我是否编写了一个程序来监听传入的数据,这是在“防火墙之前”还是“之后”?
我所理解的是像nginx,lighttpd或cherokee这样的网络服务器使用套接字编程来监听数据,但我可以设置像(OpenBSD)“pf”这样的防火墙来控制传入的数据,所以看起来像套接字C语言中的问号是“在防火墙之后”。
但是,如果这是真的,那么防火墙是如何编写的?他们如何监听来自特定端口的传入数据?
答案 0 :(得分:3)
防火墙由内核在网络代码的不同部分实现。从本质上讲,它相当于一系列“钩子”(可以通过内核空间或用户空间或两者访问),它们可以通知活动。
该活动可以是传入(入口)或传出(出口),具体取决于发起数据包的人。对于每个数据包,通常是有状态的,面向连接的协议的每个连接,防火墙都有机会重新编写,否决(例如,返回错误)或者只是静默地丢弃给定的数据包或连接。 (实现方式各不相同,可用的操作可能更复杂)。
关键是接口与普通的套接字接口完全不同 - 你被告知事情正在发生,并询问你想做什么与此相关,但是你没有得到同样的接受/ listen / connect样式接口,通常用于套接字编程。
在Linux上例如,防火墙被实现为this packet flow diagram中的输入/输出“过滤器”框,而您的套接字代码发生在顶部标记为“协议/应用程序层”的红色层中