You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中使用rtnetlink库创建新IP路由?

在Rust中用rtnetlink实现ip route add <ip_address> dev <device_name>功能

要实现这个bash命令的功能,核心是先通过设备名称获取对应的网络设备索引——因为netlink协议依赖设备索引而非名称识别网络设备,再将索引关联到路由添加请求中。以下是具体实现步骤:

步骤1:添加依赖

在Cargo.toml中引入所需库:

[dependencies]
rtnetlink = "0.13"
ipnet = "2.7"  # 简化IP地址解析逻辑
tokio = { version = "1.0", features = ["full"] }  # rtnetlink依赖的异步运行时

步骤2:完整实现代码

下面是包含设备索引查询、路由构建与添加的完整示例:

use ipnet::IpNet;
use rtnetlink::{new_connection, Error};
use std::env;

async fn add_target_route(ip_str: &str, dev_name: &str) -> Result<(), Error> {
    // 建立netlink连接并启动后台任务处理通信
    let (connection, handle, _) = new_connection()?;
    tokio::spawn(connection);

    // 根据设备名称查询设备索引
    let dev_index = handle
        .link()
        .get()
        .match_name(dev_name.to_string())
        .execute()
        .await?
        .next()
        .ok_or_else(|| Error::Msg(format!("未找到设备: {}", dev_name)))?
        .header()
        .index();

    // 解析目标IP(支持IPv4/IPv6,兼容CIDR格式如192.168.1.0/24)
    let ip_net: IpNet = ip_str.parse()?;

    // 构建路由添加请求
    let mut route_request = handle.route().add();
    match ip_net {
        IpNet::V4(ipv4) => {
            route_request.destination_prefix(ipv4.network(), ipv4.prefix_len());
        }
        IpNet::V6(ipv6) => {
            route_request.destination_prefix(ipv6.network(), ipv6.prefix_len());
        }
    }
    // 关键操作:关联路由的输出设备(对应bash命令中的dev参数)
    route_request.output_interface(dev_index);

    // 发送请求并等待执行结果
    route_request.execute().await?;

    println!("路由添加成功: {} dev {}", ip_str, dev_name);
    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    // 从命令行参数获取目标IP和设备名称
    let args: Vec<String> = env::args().collect();
    if args.len() != 3 {
        eprintln!("使用方式: {} <目标IP> <设备名称>", args[0]);
        std::process::exit(1);
    }

    add_target_route(&args[1], &args[2]).await
}

核心逻辑说明

  1. 设备索引获取:通过handle.link().get().match_name()查询指定名称的网络设备,提取其索引——这是netlink协议识别设备的唯一标识。
  2. 路由参数设置:
    • destination_prefix用于指定路由的目标IP范围,对应bash命令中的<ip_address>。
    • output_interface(dev_index)是关联输出设备的核心方法,对应bash命令里的dev <device_name>。
  3. 异步处理:rtnetlink基于tokio异步框架,因此需要用tokio::main作为入口,通过async/await处理异步操作。

运行示例

编译后执行(替换为实际的IP地址和设备名称):

cargo run -- 192.168.3.0/24 eth0

内容的提问来源于stack exchange,提问作者mdevino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:02:13