问题标签 [raw-sockets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Linux 上 C/C++ 中的简单原始套接字服务器
我正在尝试使用原始套接字构建以太网。我不能使用 TCP/IP、UDP 或任何其他协议。
这是因为它将与非常简单的硬件进行通信,这些硬件没有资源来处理所有不同的协议层。我的网络将由一台主机组成,它通过以太网交换机与多个硬件进行通信。在这一点上,我基本上只是想向每个硬件发送简单的数据包,并建立一个我可以扩展的简单服务器。我的系统运行 Linux,服务器需要用 C 或 C++ 编写。
我一直在尝试查找有关如何使用原始套接字的信息,但每个人总是说不要使用它们并且没有提供任何信息。我有很强的编程背景,但没有网络经验。任何人都可以提供有关如何开始或在哪里可以找到相关教程的任何信息吗?
sockets - 为什么在执行 read() 时 ETH_P_IP 和 ETH_P_ALL 之间存在差异
我有以下设置:
当我使用在 linux 网桥上打开一个 RAW 套接字时
我将套接字绑定到 eth2。当客户端向服务器发送数据包时,网桥上运行的wireshark报告该数据包的源mac地址为client(eth0),目的mac地址为server(eth1)。
当我执行 aread()
时,读取的数据的前 6 个字节是目标 mac 地址,正确读取为 server(eth1)。
但是,当我将语句更改为
当我执行 aread()
时,读取的数据的前 6 个字节显示目标 mac 地址是 linux bridge (eth2)。
为什么会这样?内核或以太网卡驱动程序是否将其自己的 MAC 地址放入缓冲区而不是使用 ETH_P_IP 读取线路?
c++ - sendto 的原始套接字错误:没有错误代码 [是:sendto 的原始套接字错误:没有这样的设备]
我坚持发送原始以太网帧。
[编辑]
我发现了一些错误。
1. 在套接字调用中它必须是 AF_PACKET。
2. AF_PACKET 没有 SOCK_PACKET 选项,但是 SOCK_DGRAM 和 SOCK_RAW
使用 SOCK_DGRAM,wireshark 捕获格式错误的 LLC 数据包。
但是使用 SOCK_RAW 没有错误消息,也没有捕获数据包。
我没有发现真正出了什么问题。
[/编辑]
编码:
关于CK
udp - UDP 数据包被 tcpdump 捕获,但没有被套接字接收
我按照网页http://www.tenouk.com/Module43a.html编写了一个 rawudp 程序来通过原始套接字发送 udp 数据包。然后我写了一个 udp 服务器来监听给定端口上的 udp 数据包。代码如下所示:
当我使用rawudp向udp服务器发送udp数据包时,如果源ip地址和目的ip地址不同就可以了。但是如果源ip地址和目的ip地址相同,udp服务器就收不到udp数据包。
我尝试使用 tcpdump 来捕获 udp 数据包。我发现 tcpdump 可以在使用相同的源和目标 IP 地址时显示 udp 数据包。似乎当源IP地址和目标IP地址相同时,udp数据包在某处被丢弃,因此udp服务器中的套接字没有收到它。
以下是一些日志(IP 地址已在日志中更新)。两种情况之间的唯一区别是源 IP 地址(192.168.0.26 与 192.168.0.226)。
我被困在这个问题上。有没有人可以帮助我。提前致谢。
udp 客户端(rawudp):
udp服务器端:
当我在同一主机上运行 rawudp 和 udp 服务器时,当我将源 IP 地址和目标 IP 地址设置为相同时,upd 服务器可以接收来自 rawudp 的 udp 数据包。但是,如果我在与 udp 服务器不同的主机上运行 rawudp,当我将这些 IP 地址设置为相同时,udp 服务器无法接收来自 rawudp 的 upd 数据包。在这两种情况下,tcpdump 都可以在 udp 服务器端捕获 udp 数据包。
在后一种情况下,只有具有相同源和目标 IP 地址的 udp 数据包会受到影响。如果我将它们设置不同,upd 服务器总是可以接收 udp 数据包。lo
如果未从接口接收到数据包,我不确定内核是否会丢弃具有相同本地 IP 地址的数据包。
sockets - winpcap 是如何工作的?
如您所知,Windows 已停止支持 raw_sockets,因此没有真正的解决方案可以使用 raw_sockets 构建网络嗅探器。所以我的问题是 Winpcap 和类似的库是如何在 Windows 上提供网络嗅探的?它取决于Windows的版本吗?它是否使用其他一些技术来实现数据包嗅探?除了 raw_sockets 是否有其他解决方案来执行数据包嗅探?一些软件如wireshark 使用winpcap 来嗅探网络数据包。 原始套接字窗口
c - recvfrom 未在原始套接字上返回正确的数据包
我必须构建一个端口扫描器实用程序。我正在使用原始套接字发送一个 SYN 数据包并检测目的地是否给出任何响应。
这个原始套接字指南非常有助于了解如何设置发送具有特定位的数据包;但是,我无法使用 recvfrom 接收数据包响应。
我的观察是,我收到了所有其他数据包,除了我正在寻找的数据包。
例如,tcp dump for 1 run 显示
但是,在我的应用程序中,我看不到任何具有 32000 端口的数据包。
我的接收逻辑如下(我已经修改了快速测试的代码,基本代码与上面的链接相同)。
我的应用程序输出如下
注意:如果您要测试代码,则需要添加以下包含。
#include <arpa/inet.h>
任何指针,关于我做错了什么?
更新: 我在代码中发现了错误。读取 tcp 标头时,长度计算不正确。正确计算如下。
不过,我也可以看到从 recvfrom 调用中读取的所有其他数据包。任何想法,关于如何读取具有源 ip=原始目标 ip 和源端口=原始目标端口的特定数据包。?
python - python ipv6数据包嗅探器
嗨,我想在 FREEBSD 上通过 python、ipv6 嗅探数据包。
我很难尝试使用谷歌搜索来获取信息,但对于 freebsd 示例来说没有任何内容。
下面的代码不起作用,因为有人说 bsd 系统不支持
套接字.PF_PACKET。
有没有人有任何链接来帮助我?
linux-kernel - PF_PACKET 套接字和“端口不可达”ICMP 消息
我的应用程序需要从多个目标端口接收 UDP 数据包(这是一个真正的应用程序,而不是嗅探器)。因此,我选择使用 PF_PACKET 套接字并在应用程序级别进行端口过滤。
这是我创建套接字的方法:
int g_rawSocket = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
我正确接收UDP数据包。但是,运行应用程序的内核正在向正在向我的应用程序发送数据包的远程设备发送类型为“无法访问目标”和代码“无法访问端口”的 ICMP 数据包。我猜这是因为我没有将端口号绑定到套接字。但是,我想知道将绑定与 PF_PACKET 套接字一起使用是否合适,特别是因为我需要将多个端口绑定到它,我想这是不可能的。
请问有什么意见吗?
linux - 我自己制作的 Linux 网桥:arp 请求永远不会成功
我使用我的 Boost.Asio 扩展编写了一个桥接器(第 2 层交换机)。我们可以轻松地制作满足其类型要求的其他套接字、端点和协议。我的扩展使用带有AF_PACKET
,SOCK_RAW
和的 linux 数据包套接字htons(ETH_P_ALL)
(man 7 packet
有关数据包套接字的更多信息,请参阅)。
这是一个解释我的桥如何工作的示例:
网桥连接网络接口(例如 eth0)IF1 和 IF2,因此 PC1 可以通过在 PC2 上运行的网桥与 PC3 通信。连接接口的方式是将接收到的数据包从 IF1 发送到 IF2(反之亦然)
我的网桥按预期在有线连接下工作,但在无线连接下不起作用。所以我试图找出导致这个问题的原因,我发现 ARP 请求从未成功。
导致此问题的实际环境是:
例如,在上述环境下,现在 PC1 尝试向 router1 发送 ping(ICMP) 数据包。要将其发送到 PC3,PC1 必须知道 router1 的 MAC 地址,因此 PC1 向 PC1 发送 ARP 请求,FF:FF:FF:FF:FF:FF
而我在 PC2 上运行的网桥从 eth0 接收它并将其发送到 wlan0,但 router1 从不向 PC1 发送 arp 回复。
注意:SOCK_RAW 数据包传入和传出设备驱动程序,数据包数据没有任何变化。(引用自数据包的手册页)
我应该怎么做才能让 PC1 与 router1 通信?
谢谢你。
编辑:
这是我的 Boost.Asio 扩展。
github:pfpacket/libarex
这是我上面使用的桥。
libarex/example/layer2_switch/interface_bridge.cpp
python - 是否可以在 Twisted (Python) 中使用原始套接字
我正在编写一个 NAT 的实现,并且需要使用原始套接字。我已经习惯了 Twisted 架构,并且喜欢它处理并发连接的方式。
进入 Twisted 协议的数据经过处理、NAT 化、制表并发送出原始套接字。进入原始套接字的数据被操纵、查找、NAT 并定向到适当的协议实例。
有一个原始套接字就足够了吗?如果同时有大量连接进来怎么办。不扭曲处理,或者扭曲在无连接协议中几乎没有优势。如果有优势,任何人都可以将我引向原始套接字扭曲示例