gpt4 book ai didi

networking - 在数据链路层拦截数据包

转载 作者:行者123 更新时间:2023-12-03 11:34:43 26 4
gpt4 key购买 nike

我正在尝试使用 rust 库 pnet 在数据链路层拦截(即使用而不是捕获)数据包,但是它似乎没有拦截它们,只需阅读它们即可。我不确定是我对网络缺乏了解还是其他原因
这是示例代码:

use pnet::datalink::{self, NetworkInterface, Channel};
use pnet::datalink::Channel::Ethernet;
use pnet::packet::{Packet, MutablePacket};
use pnet::packet::ethernet::{EthernetPacket, MutableEthernetPacket};

use std::env;
use iovec::IoVec;

// Invoke as echo <interface name>
fn main() {
let interface_name = env::args().nth(1).unwrap();
let interface_names_match =
|iface: &NetworkInterface| iface.name == interface_name;

let interface = datalink::linux::interfaces().into_iter()
.filter(interface_names_match)
.next()
.unwrap();

let config = datalink::linux::Config::default();
let channel = datalink::linux::channel(&interface, config).unwrap();



let (tx, mut rx) = match channel {
Ethernet(tx, rx) => {
(tx, rx)
}
_ => {panic!("Could not create channel")}
};

let mut counter = 0;
loop {
match rx.next(){
Ok(packet) => {
counter += 1;

if counter % 1000 == 0 {
println!("{}", counter);
}
},
Err(_) => { panic!("Error occured") }
}
}
}
我试图拦截我的无线接口(interface)。我期望的是,当程序运行时,如果我尝试连接到某个网站,例如,会出现一些网络连接错误,因为浏览器(或客户端)永远不会收到数据包。

最佳答案

恐怕它不依赖于编程语言,而是依赖于操作系统。
据我所知,数据包套接字可以捕获/发送帧但不拦截它们;这就是防火墙的目的。
很久以前,我曾经尝试过这个;这是我所知道的。
它发生在防火墙中;你必须 modprobe ip_queue然后添加一条规则以将数据包发送到该队列iptables -A OUTPUT -o eth1 -j QUEUE (根据需要调整输入/输出/接口(interface))。
然后,您必须在用户空间中构建并运行一个程序,该程序与该队列交互并为每个数据包给出判断(接受/丢弃)。
这是在 C 中使用 <linux/netfilter.h> 完成的。和 -lipq ;我不知道你是否可以轻松地在 Rust 中做同样的事情。
顺便说一句,也许最好的解决方案不是依赖用户空间进程给出判决,而只是依赖通常的防火墙规则(如果判决的标准不是太复杂的话)。存在许多启用许多复杂规则的模块和 iptables 选项。
(https://linux.die.net/man/3/libipq)

关于networking - 在数据链路层拦截数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65990646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com