#防火墙 #数据包 #网络 #安全 #日志

nullnet防火墙

基于Rust的网络驱动防火墙

4个版本

0.2.2 2024年1月19日
0.2.1 2024年1月15日
0.2.0 2023年11月23日
0.1.0 2023年11月9日

#1624网络编程

Download history 27/week @ 2024-03-31

53 每月下载量

Apache-2.0

175KB
4K SLoC

nullnet防火墙

Crates CI Docs Codecov

基于Rust的网络驱动防火墙。

目的

此库用于将网络数据包与一组约束(此处称为“防火墙规则”)进行匹配,目的是决定是否允许或拒绝传入/传出流量。

给定一组防火墙规则和一个网络数据包,该库将“通知”用户如何处理该数据包。

该库假设用户能够以某种方式操纵网络数据包流,从而能够采取适当的行动来允许或拒绝网络卡和操作系统之间单个数据包的转发;因此,此框架主要适用于网络驱动程序级别。

传递给防火墙的每个数据包都将记录在标准输出和路径为SQLite数据库./log.sqlite中。

防火墙规则定义

通过一个文本文件中指定的一组规则定义了一个新的Firewall对象。

文件中定义的每个规则都放在新的一行上,具有以下结构

[+] DIRECTION ACTION [OPTIONS]
  • 每个规则可以可选地以一个+字符开始;这将使规则具有更高的优先级(快速规则)。

  • DIRECTION可以是INOUT,表示流量方向。

  • ACTION可以是ACCEPTDENYREJECT,表示与规则相关的操作。

  • 对于每个规则,可以指定一个选项列表来匹配所需的流量

    • --dest:目标IP地址;值以逗号分隔的IP地址列表的形式表示,其中每个条目也可以表示一个地址范围(使用-字符)。
    • --dport:目标传输端口;值以逗号分隔的端口号列表的形式表示,其中每个条目也可以表示一个端口范围(使用:字符)。
    • --icmp-type:ICMP消息类型;值以表示特定消息类型的数字表示(更多信息请参见此处)。
    • --proto:互联网协议号;值以表示特定协议号的数字表示(更多信息请参见此处)。
    • --source:源IP地址;值以逗号分隔的IP地址列表形式表示,其中每个条目也可以表示一个地址范围(使用-字符)。
    • --sport:源传输端口;值以逗号分隔的端口号列表形式表示,其中每个条目也可以表示一个端口范围(使用:字符)。

以下是一个示例防火墙配置文件

# Firewall rules (this is a comment line)

IN REJECT --source 8.8.8.8
# Rules marked with '+' have higher priority
+ IN ACCEPT --source 8.8.8.0-8.8.8.10 --sport 8
OUT ACCEPT --source 8.8.8.8,7.7.7.7 --dport 900:1000,1,2,3
OUT DENY

如果出现无效的防火墙配置,将引发特定的FirewallError

用法

定义的Firewall对象可用于确定对传输中的每个网络数据包应采取哪些操作。

这是通过调用Firewall::resolve_packet来完成的,该调用将针对提供的包返回要采取的操作。

use nullnet_firewall::{Firewall, FirewallDirection, FirewallAction};

// build the firewall from the rules in a file
let firewall = Firewall::new("./samples/firewall.txt").unwrap();

// here we suppose to have a packet to match against the firewall
let packet = [/* ... */];

// determine action for packet, supposing incoming direction for packet
let action = firewall.resolve_packet(&packet, FirewallDirection::IN);

// act accordingly
match action {
    FirewallAction::ACCEPT => {/* ... */}
    FirewallAction::DENY => {/* ... */}
    FirewallAction::REJECT => {/* ... */}
}

依赖关系

~26MB
~490K SLoC