我正在编写一个应用程序来测试网络驱动程序以处理损坏的数据.我想使用原始套接字发送这些数据,因此发送机器的TCP-IP堆栈不会纠正它.
我只在Linux上编写这个应用程序.我有在系统调用中使用原始套接字的代码示例,但我真的希望尽可能保持测试的动态,并在Python中编写大部分(如果不是全部的话).
我在网上搜索了一些关于在python中使用原始套接字的解释和示例,但是没有找到任何真正有启发性的东西.只是一个非常古老的代码示例来演示这个想法,但绝不是有效的.
从我收集的内容来看,Python中的Raw Socket使用在语义上几乎与UNIX的原始套接字完全相同,但没有struct定义数据包结构的s.
我想知道在Python中编写测试的原始套接字部分是否更好,但在C中使用系统调用,并从主Python代码调用它?
我的应用程序在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/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
我想在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,例如).
有没有人成功在PlanetLab节点上使用Scapy(运行Fedora 12)?
我知道安全的原始套接字限制,但似乎我可以通过设置发送数据包通过Scapy conf.L3socket=L3RawSocket.至于数据包的接收,我无法让Scapy工作,所以我只使用tcpdump.
TCP和ICMP似乎有效:
UDP没有:
是否需要设置任何其他参数才能接收这些ICMP数据包?
我对使用原始套接字和libcap感到有些困惑.可以,任何人都可以简单地指出使用两者的优点.我看了几个链接,但是,它让我感到困惑.
我发现我需要在内核模块中构建一个新的sk_buff结构并将其传递给我的网络设备,但我无法弄清楚的是如何为简单的原始以太网数据包设置结构变量.
这一定很简单,但我真的很感激,如果有人能给我一个如何将sk_buff放在一起的示例代码.
我写了一个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) 是否可以创建没有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!.但是,使用普通用户权限运行时会出错.
我想以普通用户身份执行我的脚本,它应该创建一个原始套接字而不需要任何东西.可能吗?