【发布时间】:2018-02-19 04:22:34
【问题描述】:
查看nginx: ignore some requests without proper Host header 让我想到,如果操作系统通过向另一端发送RST(和/或FIN)正确终止底层TCP 连接,实际上不可能close(2) TCP 连接.
一种解决方法是使用 事实证明,OpenBSD 的 tcpdrop(8) 之类的东西,但是,从usr.sbin/tcpdrop/tcpdrop.c on OpenBSD 和FreeBSD 可以看出,它是通过基于 sysctl 的接口实现的,并且可能在 BSD 之外存在可移植性问题. (事实上,OpenBSD 和 FreeBSD 之间甚至基于 sysctl 的实现看起来也可能有很大的不同,需要一个移植层——OpenBSD uses tcp_ident_mapping 结构(随后,它包含两个 sockaddr_storage 元素,加上一些其他信息),而 FreeBSD、DragonFly 和 NetBSD 直接使用由两个 sockaddr_storage 元素组成的数组。)tcpdrop 似乎确实发送了 R 数据包根据tcpdump(8),可以通过查看/sys/netinet/tcp_subr.c :: tcp_drop()来确认,它最后调用tcp_close()(和tcp_close()is confirmed to send RST elsewhere on SO),所以,它似乎也不起作用。
如果我自己通过 C 建立连接,有没有办法在不确认对方的情况下随后将其丢弃,例如,不启动 RST?
【问题讨论】:
-
这样做有什么意义?顺便说一句,您链接的工具实际上是一种以管理方式关闭连接的方法。它确实发送通知。
-
@spectras 的重点是让连接挂在另一端(例如,浪费攻击者的资源)
-
> 连接也将挂在您的所有网络设备上。正确发送关闭通知可以让您的路由器和防火墙将连接置于快速老化的线路上,从而释放其表中的宝贵条目。假设攻击者拥有比您更多的设备,那么您实际上给您的基础设施施加的压力比他们的更大(更准确地说,压力分散在他们这边)。
-
感谢labrea.sourceforge.net/labrea-info.html 链接(无论是谁删除了自己的消息);基本上,是的,但我没有任何未使用的 IP 地址可以完全专用于此;正在寻找编写 nginx 模块或补丁。附言不幸的是,该页面上 CVS 网站的链接似乎已损坏,知道代码在哪里吗?
-
@spectras 不正确;唯一的状态防火墙是在终止连接的机器上,所以,这里的整个想法是完全断开连接而不发送任何数据包。
标签: c sockets tcp network-programming tcp-rst