微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在数据链路层拦截数据包

如何解决在数据链路层拦截数据包

我正在尝试使用 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") }
        }
    }
}

我正在尝试拦截我的无线接口。我期望的是,当程序运行时,如果我尝试连接到某个网站,例如,会出现一些网络连接错误,因为浏览器(或客户端)永远不会收到数据包。

解决方法

恐怕它不取决于编程语言,而是取决于操作系统。 据我所知,数据包套接字可以捕获/发送帧但不拦截它们;这就是防火墙的目的。 很久以前,我曾经尝试过这个;这是我所知道的。

它发生在防火墙中;您必须modprobe ip_queue然后添加规则以将数据包发送到该队列iptables -A OUTPUT -o eth1 -j QUEUE(根据需要调整输入/输出/接口)。

然后,您必须在用户空间中构建并运行一个程序,该程序与该队列进行交互并为每个数据包提供判断(接受/丢弃)。 这是在 C 中使用 <linux/netfilter.h>-lipq 完成的;我不知道你是否可以轻松地在 Rust 中实现相同的功能。

顺便说一句,也许最好的解决方案是不依赖用户空间进程给出判决,而仅依赖通常的防火墙规则(如果判决标准不太复杂)。存在许多启用许多复杂规则的模块和 iptables 选项。

( https://linux.die.net/man/3/libipq )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?