通常,对于 IP 表,您会丢弃或拒绝流量。对于 TCP,有没有办法让 iptables 发回一个 syn 但忘记连接?
答案1
xtables-addons
有TARPIT
目标(手册页):
TARPIT
不使用本地每个连接资源来捕获并保留传入的 TCP 连接。TARPIT 仅在 TCP 级别工作,并且完全与应用程序无关。该模块将应答 TCP 请求并像侦听服务器一样进行操作,但除了发送 ACK 或 RST 之外,不发送任何数据。传入的数据包将被忽略并丢弃。
在 Debian/Ubuntu 上,该软件包是xtables-addons-common
。
答案2
有几件不太好的事情是可以做的;可以插入 RST 数据包,除非涉及的主机具有异常和自定义的防火墙配置,否则 RST 将导致连接关闭。另一种方法是接受连接,但随后以某种方式删除状态条目;这可能看起来像
...
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --syn -m tcp --dport 22 -j ACCEPT
...
可能还带有日志记录(通过日志扫描仪进行操作,例如sec.pl
)或安装的某些其他模块conntrack-tools
运行类似于以下的命令
conntrack -D -s 192.0.2.42
192.0.2.42 通过 ssh 连接后删除该 IP 的状态表条目。
答案3
发回一个 syn 但忘记了连接?
这意味着生成 SYN/ACK 但不跟踪连接。
不完全是,有点。
首先第一件事:为什么?
如果 SYN 发送至关闭端口,则:
丢弃数据包并避免更多处理。
如果您要回答任何问题,并且攻击者将收到表明您在那里的答案,那么:只需用 RST 回答即可。一个完全可能且常见的 iptables 答案:
您可以使用 iptables -p tcp [...] -j REJECT --reject-with tcp-reset 发回 RST。
如果 SYN 是到打开端口然后:
允许服务器(服务)按其认为合适的方式处理请求。
使用 SYNPROXY 帮助服务器。
这实际上是试图保护服务器免受 SYN-ACK Flood DDoS 攻击。这与你所问的不一样,也不可能。不可能有两个实体(服务器和 iptables)同时对同一个数据包使用 SYN/ACK 进行应答。要么是其中之一,要么是另一个。
但 SYNPROXY 很聪明。它是如何工作的(以及更多):
使用 SYNPROXY 时,客户端会透明地连接到 SYNPROXY。因此,3 路 TCP 握手首先发生在客户端和 SYNPROXY 之间:
客户端向服务器 A 发送 TCP SYN
在防火墙处,当该数据包到达时,它被标记为 UNTRACKED
然后将 UNTRACKED TCP SYN 数据包提供给 SYNPROXY
SYNPROXY 获取此信息并使用 TCP SYN+ACK(未跟踪)进行响应(作为服务器 A)
客户端使用 TCP ACK 进行响应(在 iptables 中标记为 INVALID 或 UNTRACKED),该 ACK 也提供给 SYNPROXY
一旦客户端连接到 SYNPROXY,SYNPROXY 就会自动发起与真实服务器的 3 向 TCP 握手,欺骗 SYN 数据包,以便真实服务器将看到原始客户端正在尝试连接:
SYNPROXY 向真实服务器 A 发送 TCP SYN。这是 iptables 中的一个新连接,发生在 OUTPUT 链上。数据包的源IP是客户端的IP
真实服务器A向客户端回复SYN+ACK
SYNPROXY 接收此消息并用 ACK 响应服务器。连接现已标记为 ESTABLISHED
一旦建立连接,SYNPROXY 就会离开客户端和服务器之间的流量
因此,SYNPROXY 可用于任何类型的 TCP 流量。它可用于未加密和加密的流量,因为它不会干扰内容本身。
话虽如此...
您无法在没有服务器的端口中设置 SYNPROXY(它将不起作用)。
因此,对于封闭的端口,您需要一台服务器,也许是一台假服务器,但无论如何都是一台服务器。
有关的: