题 使用iptables时REJECT vs DROP


我有什么理由想拥有

iptables -A INPUT -j REJECT

代替

iptables -A INPUT -j DROP

80
2017-07-04 09:49






答案:


作为一般规则,当您希望另一端知道端口不可达时,请使用REJECT'使用DROP连接到您不希望人们看到的主机。

通常,LAN内连接的所有规则都应使用REJECT。对于Internet,除了某些服务器上的ident之外,来自Internet的连接通常都是删除的。

使用DROP使连接看起来是未占用的IP地址。扫描仪可能选择不继续扫描看似未占用的地址。鉴于NAT可用于重定向防火墙上的连接,众所周知的服务的存在并不一定表明地址上存在服务器。

应在提供SMTP服务的任何地址上传递或拒绝Ident。但是,SMTP服务使用Ident查找已经不再使用了。有聊天协议也依赖于工作识别服务。

编辑:使用DROP规则时:   - UDP数据包将被丢弃,其行为与连接到没有服务的无壁灯端口的行为相同。   - TCP数据包将返回ACK / RST,这与没有服务的开放端口将响应的响应相同。一些路由器将代表已关闭的服务器响应和ACK / RST。

使用REJECT规则时,将发送ICMP数据包,指示端口不可用。


72
2017-07-04 16:40



这不是真的。即使规则说“DROP”,系统仍将使用TCP SYN / ACK回复传入的数据包,就好像它是打开的一样。要真正丢弃数据包,系统需要使用TCP RST / ACK进行回复 - 没有防火墙规则。因此,最佳防火墙设置是仅转发所选端口的设置。您的DROP规则将通告您的防火墙,并且端口扫描程序将知道您正在防火墙并继续抨击您,以期将防火墙降下来。 - Dagelf
@Dagelf查看我的编辑。 RST / ACK不向扫描仪指示您正在防火墙。虽然一些黑客可能会在此响应后继续进行探测,但这应该基于了解您的服务而不是防火墙响应。它绝对减少了我经历的扫描次数和长度。 - BillThor
我的观点是,从外部可以检测到你是否正在防火墙,因为你的DROP表现不同,而不是在你没有服务运行的时候! - Dagelf
不会改变这样一个事实,即有僵尸网络利用差异并监控您的端口。 - Dagelf
@Dagelf你在哪里获得DROP发送响应的信息?这是一个重大新闻,与我观察到并被告知的一切背道而驰。您是否有指向描述此行为的文档的链接? - Score_Under


不同之处在于REJECT目标向源发送拒绝响应,而DROP目标则不发送任何内容。

这可能是有用的,例如为身份服务。如果您使用REJECT,则客户端不需要等待超时。

更多关于这个: http://www.linuxtopia.org/Linux_Firewall_iptables/x4550.html


25
2017-07-04 09:59



DROP目标不会发送任何内容。如果您对详细信息感兴趣,请查看我对已接受答案的评论并自行研究该主题! - Dagelf


通常,你想 忽视 从攻击者到某些端口的探测,我的意思是你不想发回“拒绝连接”。 “拒绝连接”意味着:“这里有服务器”,可能会提供更多信息,而丢弃数据包并不会泄露有关软件版本,可能存在的漏洞甚至是服务器正在监听IP的事实的线索。

以上是使用DROP而不是REJECT的主要原因之一。


8
2017-07-04 13:09



没有iptables规则,关闭的端口默认为REJECT。如果你DROP每个端口它是一个很好的选择(你的主机显示为关闭),但如果你只丢弃特定的端口,你实际上给他们提供的信息比REJECT更多。如果有人使用像nmap这样的毯式探测器,丢弃数据包的特定端口将显示为“已过滤”,这意味着他们知道您在那里有一个您正在隐藏的服务。 - Raptor007


我在这里看到了许多相互矛盾的答案,并且这是谷歌第一篇用正确的关键词写的文章;这是正确的解释。
这很简单:

DROP对数据包什么都不做。它没有被转发到主机,它没有得到答案。 IPtables的联合页面说它将数据包丢弃在地板上,即它对数据包没有任何作用。

REJECT与DROP的不同之处在于它确实发回了数据包,但答案就像服务器位于IP上,但没有端口处于侦听状态。 IPtables将在TCP或UDP的情况下发送RST / ACK,ICMP目标端口不可达。


6
2018-01-11 12:29



来自我的+1,但答案并不是真的不同意。他们都同意,据我所知,除了Dagelf - 谁错了。 - MadHatter
好的,这对你来说是一个小技巧:做一个“nmap localhost”。现在选择任何不“开放”的端口......并添加一个“什么都不做”的规则,例如:“iptables -I INPUT -p tcp --dport 888 -j DROP”。现在再次“nmap localhost”。你看到了什么? ... - Dagelf


如果你试图完全隐藏你机器的存在, -j DROP是合适的。例如,您可以使用它来实现黑名单。

如果您试图隐藏端口打开的事实,您应该模仿端口未打开时可能发生的行为:

  • TCP: -p tcp -j REJECT --reject-with tcp-reset
  • UDP: -p udp -j REJECT --reject-with icmp-port-unreachable

如果端口扫描程序发现少数端口正在丢弃数据包而大多数端口拒绝它们,则可以假设丢弃的数据包位于打开但隐藏的端口上。


3
2017-08-13 01:29



如果您打开几个端口(即22,25,53,80,443)然后DROP其他所有内容怎么办?现在我是否有MySQL,PostgreSQL,SQLite或Cassandra正在运行...扫描仪无法分辨,对吧? - Alexis Wilke
@AlexisWilke在这种情况下,您给端口扫描程序的唯一附加信息是您使用默认DROP策略的某种防火墙。 - Raptor007


尽管有很多正确答案,但我的两分钱:

这是一个简短的PoC FW.IDS-Drop-VS-拒绝 关于禁止系统规则(防火墙,IDS等)的主题。

不久:

  • DROP 如果禁止所有端口,可以用于recidive入侵者(所以看起来服务器在入侵者端是这样的)
  • REJECT --reject-with tcp-reset 是多端口禁止的最佳选择,因为它似乎表现为一个真正的封闭端口
  • 如果某些端口正在回答(入侵者知道主机处于活动状态), DROP 和 REJECT (不 tcp-reset)会给入侵者一个“信号”,表示有阻塞的东西(这样可以刺激他继续“攻击”,希望在某些时候提供所需的数据)

0
2017-09-20 16:49





是的,使用DROP是没有意义的。使用REJECT。

即使规则说“DROP”,系统仍然会回复带有TCP RST / ACK的传入SYN - 这是没有服务运行的端口的默认行为。 (tcpdump等人没有记录这个。)

如果服务正在运行,则SYN满足TCP SYN / ACK。

因为DROP没有按照正常情况用TCP SYN / ACK响应,而是使用RST / ACK,你的DROP规则会通告你的防火墙,而端口扫描器会知道你正在防火墙,并且可能一直在扼杀你的希望抓住你的防火墙。

现在,nmap可以报告“已过滤”而不是“已关闭”,例如:

$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -I INPUT -p tcp --dport 1111 -j DROP
$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http
1111/tcp filtered lmsocialserver

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -D INPUT 1

因此,唯一的“不可见”防火墙设置是专用设备位于您的设备之间并且仅选择性地转发端口的设置。

如果你真的想搞乱基本的扫描程序,你可以TARPIT tcp连接,它将TCP窗口设置为0,这样在打开连接后就不会传输任何数据,忽略关闭连接的请求,这意味着扫描程序必须等待如果要确定连接超时。但攻击者检测到这一点并使其超时非常短暂是微不足道的。

考虑到所有事情,你最好只使用REJECT - 或者在服务器和互联网之间放置一个专用的端口转发设备。

或者只是在面向互联网的机器上运行不需要防火墙的服务。

一般情况下,REJECT最适合Web服务器,因为无论服务尝试访问它(可能更常见的是,您)都会快速得到响应,用户或其他服务将无法等待网络中断是否存在。


-3



这个答案是不正确的。使用tcpdump可以很容易地显示DROP规则将导致系统不发送任何答案 - 正如人们所期望的那样。您的声明“要真正丢弃数据包,系统需要使用TCP RST / ACK进行回复”没有意义,因为回复任何内容显然不是“真正丢弃数据包”。如果你“真正丢弃”一个数据包,你只是不回答,这显然是DROP规则的效果。 - Juliane Holzt
你能提供指控的来源吗? DROP 会发出一个 SYN/ACK?我从来没有在我的机器上看到这个。 - motobói
@Dagelf你的文章确实说“DROP(又名DENY,BLACKHOLE)禁止传递数据包。发送没有响应。” - JeanT
它不会发送正常的响应,但无论如何都会按照说明发送一个响应。 - Dagelf
您链接的文件说“DROP ...发送没有回复“而且,据我所知,并不支持你的主张 DROP 返回一个 SYN/ACK。我也从未在任何版本的版本下看到过这种行为 iptables。如果您的来源支持您的声明,那么最有用的就是它;当然,我刚刚完成的数据包转储不支持你的声明。 - MadHatter