【发布时间】:2015-10-24 02:02:43
【问题描述】:
根据http://linux.die.net/man/7/raw,
raw_socket = socket(AF_INET, SOCK_RAW, int protocol); 是创建原始套接字的方式。
我假设原始套接字是在第 3 层创建的,因此协议不应该是
IPPROTO_TCP/IPPROTO_UDP,而应该是IPPROTO_IP。这种理解正确吗?但是当我使用协议为
IPPROTO_IP(*socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_IP);) 创建原始套接字时,套接字创建失败并出现错误不支持协议当我使用
IPPROTO_RAW(*socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);) 协议创建原始套接字时,我的应用程序没有收到任何数据包当我使用
IPPROTO_TCP(socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);) 协议创建原始套接字时,我的应用程序会收到 TCP 数据包,但内核也会响应这些数据包(在我的情况下,它会 RST 链接)。我认为这是因为内核认为没有人在监听该数据包的目标端口。
我的意图只是用虚假的 IP 和 TCP 标头发送对到达我的应用程序的消息的响应。由于上述尝试都不适合我,我应该如何创建原始套接字并使内核 TCP 层仅针对该连接保持安静?
编辑: 请跳过问题 1-3。 Filipe 已经回答了他们。对于问题 4,我们确实有一个解决方法。但是,如果这里有人有答案并愿意回答,请保持问题的开放性。
【问题讨论】:
-
我可以创建一个虚拟 tcp-socket 并误导内核将数据包转发到两个套接字(虚拟 tcp-socket 以及我的原始套接字)。虚拟套接字只会吸收数据包而不做任何事情,而我的原始套接字将完成它的设计目的。但这是唯一的方法吗?
-
您可以使用 AF_PACKET 并且内核不会对您的数据包执行任何操作(一直到 MAC 层)。但我不确定这是否是你想要的。
-
当我尝试这样做时,“socketFd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);”,套接字创建失败,提示“协议不可用”
-
您是否以 root 身份运行您的程序?普通用户无法打开原始套接字。
-
是的,它正在由root用户“root@xxx:”运行
标签: c raw-sockets ubuntu-15.04