#freebsd #firewall #networking #ipfw

ipfw-rs

一个Rust包,允许向FreeBSD IPFW防火墙发送命令

1 个不稳定版本

0.1.0 2024年3月26日

#6#free-bsd

BSD-2-Clause

91KB
2.5K SLoC

#ipfw-rs

问题跟踪在 https://gitlab.com/4neko/ipfw-rs

一个提供用户空间接口到FreeBSD IPFW防火墙的包,允许直接控制IPFW,而无需每次需要阻止网络主机或检查列表时都执行 ipfw(8)

此包只支持实际的FreeBSD最新版本,即14.0,但似乎协议变化不大,因此可能在FreeBSD 13上也能工作!

这是一个实验性包,并在"Aienma"项目中使用。

目前支持以下功能

  • 在表中添加、删除、测试命令(目前为IP/IPv6/DNS的主机列表)
  • 刷新表

示例



extern crate ipfw_rs;


use ipfw_rs::{Ipfw, IpfwCmd};

fn main() 
{
    let ipfw = Ipfw::new().unwrap();

    let res = 
        ipfw.ipfw_table_handler("testtable", IpfwCmd::Add { hosts: vec!["127.0.1.1", "127.0.2.0/24"], req_atomic_op: true }, false);

        match res
        {
            Ok(r) => println!("res: '{}'", r),
            Err(e) => println!("err: '{}'", e)
        }

    let res = 
        ipfw.ipfw_table_handler("testtable", IpfwCmd::Test { hosts: vec!["127.0.1.1", "127.0.2.0/24"]}, false);

        match res
        {
            Ok(r) => println!("res: '{}'", r),
            Err(e) => println!("err: '{}'", e)
        }

    
    let res = 
        ipfw.ipfw_table_handler("testtable", IpfwCmd::Flush, false); //{ hosts: vec!["127.0.1.2"] }, false);// { hosts: vec!["127.0.1.1", "127.0.2.0/24"], req_atomic_op: true }, false);

    match res
    {
        Ok(r) => println!("res: '{}'", r),
        Err(e) => println!("err: '{}'", e)
    }

    println!("Hello, world!");
}

依赖关系

~5–14MB
~161K SLoC