我已经创建了一个套接字,之后我写了一个'接收来自':
sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
data_size = recvfrom(sock_raw, buffer, 65536, 0, &saddr, &saddr_size);
我已将此限制在我的SYN ATTACKER包中
printf((unsigned int)tcph->syn);
如何删除该数据包?
答案 0 :(得分:2)
你做不到。太晚了。当你的代码获得它时,内核也在处理SYN(实际上已经完成了)。
防御SYN泛滥是困难的并且非常技术性,并且无法通过简单的插入式用户空间程序来完成。 Linux已经内置了一些SYN Flood缓解。它基于SYN cookie技术(https://en.wikipedia.org/wiki/SYN_cookies),并在linux上使用tcp_syncookies sysctl
参数启用。
如果你真的想自己做,你需要开发内核代码。这个问题的存在表明这远远超出了你目前的专业知识。
另一种方法是将另一台机器插入要防御的机器前面,其他机器在原始模式下接收流量,并可以选择是否将数据包转发到受保护机器。在这种情况下,您可以在用户空间中完成此操作。 (如果没有尽最大努力的话,显然存在巨大的潜在性能问题。)
这都假设你真的想要防御SYN洪水。如果您只是希望阻止来自某些来源的SYN,那么可以通过内置的linux iptables
工具实现开箱即用。这还取决于与底层网络堆栈密切相关的内核实现。