标签: raw-sockets

如何在Python中使用原始套接字?

我正在编写一个应用程序来测试网络驱动程序以处理损坏的数据.我想使用原始套接字发送这些数据,因此发送机器的TCP-IP堆栈不会纠正它.

我只在Linux上编写这个应用程序.我有在系统调用中使用原始套接字的代码示例,但我真的希望尽可能保持测试的动态,并在Python中编写大部分(如果不是全部的话).

我在网上搜索了一些关于在python中使用原始套接字的解释和示例,但是没有找到任何真正有启发性的东西.只是一个非常古老的代码示例来演示这个想法,但绝不是有效的.

从我收集的内容来看,Python中的Raw Socket使用在语义上几乎与UNIX的原始套接字完全相同,但没有struct定义数据包结构的s.

我想知道在Python中编写测试的原始套接字部分是否更好,但在C中使用系统调用,并从主Python代码调用它?

python sockets raw-sockets

34
推荐指数
2
解决办法
8万
查看次数

如何将原始套接字绑定到特定接口

我的应用程序在CentOS 5.5上运行.我正在使用原始套接字发送数据:

sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sd < 0) {
  // Error
}
const int opt_on = 1;
rc = setsockopt(m_SocketDescriptor, IPPROTO_IP, IP_HDRINCL, &opt_on, sizeof(opt_on));
if (rc < 0) {
  close(sd);
  // Error
}
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = my_ip_address;

if (sendto(m_SocketDescriptor, DataBuffer, (size_t)TotalSize, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)  {
  close(sd);
  // Error
}
Run Code Online (Sandbox Code Playgroud)

如何将此套接字绑定到特定的网络接口(例如eth1)?

c sockets linux network-programming raw-sockets

30
推荐指数
2
解决办法
7万
查看次数

在MAC层访问无线接口(802.11)(Linux)

我花了最后几天阅读手册页,文档和谷歌提出的任何其他内容,但我想我现在比起初时更加困惑.

这就是我想要做的事情:我希望通过带有C/C++的Linux系统上的无线接口(802.11)使用我自己的3-x协议发送和接收数据包.到现在为止还挺好.我不需要信标,关联或任何AP/SSID相关的东西.然而,对于数据传输,我希望MAC层"像往常一样",这意味着单播数据包是ACK,重传,退避等.我还想享受扩展的QoS功能(802.11e有4个队列和不同的访问类别).另一方面,混杂模式不是一个问题,我只需要广播数据包和发送到特定站的数据包.

什么是正确的方法呢?关于原始套接字访问的大多数文档似乎都集中在网络嗅探上,但这并没有帮助.我一直在玩监控模式已经有一段时间了,但从我到目前为止所读到的内容来看,收到的数据包在监控模式下没有确认等.如果没有监控模式,会有什么替代方案?使用ad hoc模式和unix原始套接字?或者我是否必须摆弄司机?

我不是在寻找一个完整的解决方案,只是一些好的想法,从哪里开始.我通读了socket(2),socket(7)和packet(7)的手册页,但这对于不同模式下MAC层的行为没有帮助.

提前致谢.

linux network-programming network-protocols raw-sockets systems-programming

18
推荐指数
2
解决办法
9390
查看次数

使用C#的原始套接字

我想在C#中编写一个端口扫描程序,我不能使用SocketType.Raw,因为原始套接字是从桌面版本的Windows中取出的.我不能使用SharpPcap或Winpcap的其他包装,因为我使用PPPoE进行互联网连接,而Winpcap不支持PPP设备.

我需要使用一个实现原始套接字的库,而不依赖于winpcap.

有任何想法吗?基本上我需要发送SYN,接收SYN/ACK或RST但不发送ACK.

编辑:

对于那些不相信RAW套接字从Windows桌面版本消失的人,请看这里:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v = vs.85).aspx

在Windows 7,Windows Vista,Windows XP Service Pack 2(SP2)和Windows XP Service Pack 3(SP3)上,通过原始套接字发送流量的能力受到以下几种限制:

  • TCP数据无法通过原始套接字发送.
  • 无法通过原始套接字发送具有无效源地址的UDP数据报.任何传出UDP数据报的IP源地址必须存在于网络接口上,否则数据报将被丢弃.此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送欺骗数据包(具有伪造源IP地址的TCP/IP数据包)的能力.
  • 不允许bind使用IPPROTO_TCP协议的原始套接字调用该函数.
    注意bind具有原始套接字函数被允许用于其它协议(IPPROTO_IP,IPPROTO_UDP,或IPPROTO_SCTP,例如).

c# tcp raw-sockets

14
推荐指数
1
解决办法
2万
查看次数

PlanetLab上的Scapy

有没有人成功在PlanetLab节点上使用Scapy(运行Fedora 12)?

我知道安全的原始套接字限制,但似乎我可以通过设置发送数据包通过Scapy conf.L3socket=L3RawSocket.至于数据包的接收,我无法让Scapy工作,所以我只使用tcpdump.

TCPICMP似乎有效:

  • ICMP echo-r​​equests获得echo-r​​eply回复
  • 具有低TTL的ICMP回应请求获得超时消息
  • TCP SYN数据包返回TCP RST数据包
  • 具有低TTL的TCP数据包获得超时消息

UDP没有:

  • 到封闭端口的UDP数据包会触发ICMP端口不可达消息,但此消息不会使其返回到我的条子.Tcpdump只能看到UDP数据包.
  • UDP数据包沿路径到期的情况也是如此.

是否需要设置任何其他参数才能接收这些ICMP数据包?

python sockets fedora raw-sockets scapy

14
推荐指数
1
解决办法
802
查看次数

libpcap是否在它们下面使用原始套接字?

我对使用原始套接字和libcap感到有些困惑.可以,任何人都可以简单地指出使用两者的优点.我看了几个链接,但是,它让我感到困惑.

raw-sockets libpcap

12
推荐指数
2
解决办法
5033
查看次数

如何在Android中创建Raw套接字?

有没有人尝试创建RawSocketAndroid,并已成功了吗?

sockets android raw-sockets

11
推荐指数
2
解决办法
5232
查看次数

从内核模块内部发送原始以太网数据包

我发现我需要在内核模块中构建一个新的sk_buff结构并将其传递给我的网络设备,但我无法弄清楚的是如何为简单的原始以太网数据包设置结构变量.

这一定很简单,但我真的很感激,如果有人能给我一个如何将sk_buff放在一起的示例代码.

c sockets network-programming raw-sockets linux-kernel

10
推荐指数
1
解决办法
4529
查看次数

由tcpdump捕获的udp数据包,但socket没有收到

我写了一个rawudp程序,通过原始套接字发送udp数据包,网址为http://www.tenouk.com/Module43a.html.然后我写了一个udp服务器来监听给定端口上的udp数据包.代码如下所示:

...
sd = socket(AF_INET, SOCK_DGRAM, 0);
bind(sd, (struct sockaddr *)&ipaddr, sizeof(ipaddr));
size = recvfrom(sd, msgbuf.text, 2000, 0, (struct sockaddr *)&sin, &sin_len);
... // print the recevied udp packet
Run Code Online (Sandbox Code Playgroud)

当我使用rawudp将udp数据包发送到udp服务器时,如果源IP地址和目标IP地址不同,则可以.但是如果源IP地址和目标IP地址相同,则udp服务器无法接收udp数据包.

我试图使用tcpdump来捕获udp数据包.我发现tcpdump在使用相同的源和目标IP地址时可以显示udp数据包.当源和目标IP地址相同时,似乎udp数据包被丢弃,因此udp服务器中的套接字没有收到它.

以下是一些日志(IP地址已在日志中更新).两种情况之间的唯一区别是源IP地址(192.168.0.26对192.168.0.226).

我陷入了这个问题.有没有人可以帮助我.提前致谢.

udp客户端(rawudp):

case 1> rawudp 192.168.0.26 18321 192.168.0.226 19702 test.bin # using different source and destination ip addresses
size of ip header:  20
size of udp header: 8
read 69 bytes from file test.bin successfully.
socket() - using SOCK_RAW socket and UDP protocol is OK.
setsockopt() …
Run Code Online (Sandbox Code Playgroud)

udp tcpdump raw-sockets

10
推荐指数
0
解决办法
7666
查看次数

在没有root权限的Python中创建原始套接字

是否可以创建没有root权限的原始套接字?如果没有,脚本可以自己提升其权限吗?

我使用原始套接字编写了一个Python脚本:

#!/usr/bin/env python

import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
print "Worked!"
Run Code Online (Sandbox Code Playgroud)

以root权限运行它打印Worked!.但是,使用普通用户权限运行时会出错.

我想以普通用户身份执行我的脚本,它应该创建一个原始套接字而不需要任何东西.可能吗?

python sockets linux raw-sockets

10
推荐指数
2
解决办法
5968
查看次数