Articles of raw sockets

rawsocket sendto()的一些数据包被丢弃,在networking中看不到

socketFd_ = socket(AF_INET, SOCK_RAW, protoType); sentBytes = sendto(socketFd_, buf, len, 0, (struct sockaddr *)&sa,sizeof(structsockaddr_in)); protoType = GRE 我正在networking中发送1000个数据包。 如果我的tx数据包速率是40,我能看到wireshark中的所有数据包。 然而,当我将尝试以100的速率发送一些数据包(3-4)不会在networking中达成,但sendto没有返回任何错误。 我知道sendto只是把txpacket放入队列中,不能保证在networking中传送数据包,但是从那里我可以得到丢包的统计数据和内核丢包的原因。 我曾尝试增加界面的txqueuelen到65000,但它没有帮助。 我怎么能debugging这个问题?

在MSG_DONTWAIT模式下使用recvfrom()从原始套接字读取以太网数据包

我使用原始套接字使用recvFrom()在C中发送和接收以太网数据包。 我想读取非阻塞模式,所以我使用MSG_DONTWAIT。 但是,即使接收到数据包,recvFrom()也总是返回-1。 我是C编程新手。 我能够收到我的有效载荷,但我总是收到消息“接收资源暂时不可用”。 代码片段: if ((sock = socket(AF_PACKET, SOCK_RAW, htons(0x8851))) < 0) { perror("ERROR: Socket"); exit(1); } while(1) { int flag=0; n=recvfrom(sock, buffer, 2048, MSG_DONTWAIT, NULL, NULL); if (n == -1) { perror("ERROR: Recvfrom"); close(sock); flag=1; } if (flag==0) { // Read Packet } }

用iptables TPROXYredirect到原始套接字

我打算使用iptables的TPROXY目标redirect一些UDP数据包到一个原始的套接字,但没有数据包会被套接字接收。 它使用UDP套接字。 我错过了东西或原始套接字无法接收水平TPROXY作品中的数据? iptables -A PREROUTING -t mangle -p udp -dport 8816 -dst 127.0.0.1 -j TPROXY – 在端口0 – 在-IP 127.0.0.2 消费redirect数据包的代码: #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> char _errstr[100]; #define CHECK(X) \ if (! (X)) {\ sprintf(_errstr, "%d: check failed", __LINE__);\ perror(_errstr);\ exit(1);\ } int main() { int r; int fd = […]

我可以使用tun / tap和原始套接字来创build“TCP数据包修改器”吗?

我有一个Linux应用程序,讲TCP,并帮助分析和统计,我想修改它发出的一些TCP数据包中的数据。 我宁愿这样做,而不是黑客的Linux TCP堆栈。 到目前为止,我的想法是做一个“TCP数据包修改器”的桥梁。 我的想法是通过桥的一侧的tun / tap设备连接到应用程序,并通过桥的另一侧的原始sockets连接到网卡。 我担心的是,当你打开一个原始套接字时,它仍然会将数据包发送到Linux的TCP协议栈,所以即使我想,也不能修改它们并发送它们。 它是否正确? 该桥的伪C代码草图如下所示: tap_fd = open_tap_device("/dev/net/tun"); raw_fd = open_raw_socket(); for (;;) { select(fds = [tap_fd, raw_fd]); if (FD_ISSET(tap_fd, &fds)) { read_packet(tap_fd); modify_packet_if_needed(); write_packet(raw_fd); } if (FD_ISSET(raw_fd, &fds)) { read_packet(raw_fd); modify_packet_if_needed(); write_packet(tap_fd); } } 这看起来是可能的,还是有其他更好的方法来实现相同的事情? (TCP数据包桥接和修改)

如何使用原始套接字只收听想要的stream量?

三个相关的问题: 原始套接字是否有任何相当于内核BPF(由libpcap使用)的过滤方法? 打开原始套接字是否意味着它接收到机器上的每个 IP数据包? iptables如何与原始套接字进行交互 – 原始套接字是否看到iptables丢弃的数据包? BPF – http://lwn.net/Articles/599755/

如何通过RAW套接字发送修改过的IPv6数据包?

我正尝试通过C Linux中的RAW套接字发送自定义IPv6标头。 我已经使用IP_HDRINCL套接字选项在IPv4中取得了成功,但是没有与IPv6等效的function。 我在这里find了一个解决方法,build议使用socket(AF_INET6, SOCK_RAW, IPPROTO_RAW)与启用IP_HDRINCL套接字选项具有相同的效果。 套接字已经成功创build,我没有得到任何错误,直到我用我的修改头使用sendto函数。 我像这样设置套接字: static int socketFd = 0; static struct sockaddr_in6 remote; int main() { socketFd = socket (PF_INET6, SOCK_RAW, IPPROTO_RAW); if (socketFd < 0) { printf ("An error ocurred while creating the socket.\n"); exit (2); } remote.sin6_family = AF_INET6; remote.sin6_port = htons (25000); if (inet_pton (AF_INET6, "fd00:c0de::70d6:4ab9:115d:8cda", &(remote.sin6_addr)) != […]

缺lessSOCK_RAW套接字中的ARP数据包

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <unistd.h> #include <arpa/inet.h> #include <linux/if_ether.h> #include <net/if.h> #include <netpacket/packet.h> struct ethernet { unsigned char dest[6]; unsigned char source[6]; uint16_t eth_type; }; struct arp { uint16_t htype; uint16_t ptype; unsigned char hlen; unsigned char plen; uint16_t oper; /* addresses */ unsigned […]

使用python RAW套接字的TCP握手

我正在使用python RAW套接字实现TCP握手。 然而,Linux内核很烦人,因为它试图处理这个协议的某些方面。 例如,当我发送一个SYN数据包时,服务器响应一个SYN,ACK数据包; 内核自动响应RST包重置连接。 我克服了这一点,我使用下面的iptable规则丢弃所有这样的重置数据包: -A OUTPUT -p tcp -m tcp –sport 999 –tcp-flags RST RST -j DROP 现在我想接收服务器发送的SYN,ACK包并将其打印出来。 但是当我做以下事情时我什么也收不到: a = self.s.recvfrom(4096) 我怀疑内核正在丢弃的SYN,ACK之前,我可以用我的套接字recv它。 有谁知道一个合理的解决方法?

在Linux中用PF_PACKET错误设置IP_HDRINCL

我使用以下设置一个原始数据包套接字: sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) ); 然后我试图设置套接字选项IP_HDRINCL使用: int one = 1; if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0) LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n"); 但我无法设置这个选项(我得到一个errno 92错误和消息“协议不可用”。如果我改变PF_PACKET PF_INET然后选项设置,但我必须使用PF_PACKET 。有没有办法来设置这个上面创build的套接字选项? 谢谢一堆。

Linux RAW套接字

我正在使用Linux / Debian上的RAW套接字,当使用write()而不是sendto()时,我遇到了一个问题: struct sockaddr_ll socket_address; /* Index of the network device */ socket_address.sll_ifindex = if_idx.ifr_ifindex; /* Address length*/ socket_address.sll_halen = ETH_ALEN; /* Destination MAC */ socket_address.sll_addr[0] = 0x00; socket_address.sll_addr[1] = 0x11; socket_address.sll_addr[2] = 0x22; socket_address.sll_addr[3] = 0x33; socket_address.sll_addr[4] = 0x44; socket_address.sll_addr[5] = 0x55; /* Send packet */ int b_written = 0; if ( ( […]