使用iptables时,拒绝与丢弃

我有什么理由要这么做

iptables -A INPUT -j REJECT 

代替

 iptables -A INPUT -j DROP 

一般来说,当你想让另一端知道端口不可用时,使用REJECT'使用DROP来连接你不想让人看到的主机。

通常,您的局域网内的所有连接规则都应该使用REJECT。 对于互联网,除了某些服务器上的身份识别码之外,来自互联网的连接通常是删除的。

使用DROP使连接看起来是一个未被占用的IP地址。 扫描仪可以select不继续扫描出现空闲的地址。 鉴于NAT可以用来redirect防火墙上的连接,众所周知的服务的存在并不一定表示地址上存在服务器。

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

编辑:当使用DROP规则时: – UDP数据包将被丢弃,行为将与没有服务的无防火墙端口相同。 – TCP数据包将返回一个ACK / RST,这个响应与没有服务的开放端口将作出响应相同。 某些路由器会代表服务器发生故障而作出响应并确认ACK / RST。

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

区别在于REJECT目标发送拒绝响应给源,而DROP目标不发送。

这对于识别服务可能是有用的。 如果使用REJECT,则客户端不需要等待超时。

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

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

以上是使用DROP代替REJECT的主要原因之一。

我在这里看到很多相互矛盾的答案,因为这是Google的第一篇关于正确关键词的文章。 这里是正确的解释。
这很简单:

DROP对数据包不做任何处理。 它不会被转发到主机,它不会得到回应。 IPtables的联机手册说它将数据包丢弃在地板上,即它对数据包没有任何作用。

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

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

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

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

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

在较老的Linux内核上,即使规则显示为“DROP”,系统仍然使用TCP RST / ACK来回复传入的SYN – 这是没有运行服务的端口的默认行为。 在较新的内核上,“DROP”按广播方式工作,只是忽略传入的stream量,而“REJECT”以ICMP端口不可访问的方式回复。

如果某个服务正在运行,则SYN将与TCP SYN / ACK相符。

因为DROP没有按照正常的TCP RST / ACK来响应,所以如果你没有丢弃所有的端口,你的DROP规则将通告你的防火墙,并且端口扫描器会知道你在防火墙上,并且会继续摧毁你的希望抓住你的防火墙。 (现在nmap可以报告“过滤”而不是“closures”)。

因此,最好的防火墙设置是专用设备位于设备之间,只有有select地转发端口。

如果你真的想搞砸基本的扫描仪,你可以TARPIT TCP连接,它将TCP窗口设置为0,以便在连接打开后没有数据可以传输,忽略closures连接的请求,这意味着扫描器必须等待如果想要确认连接超时发生。

但是对于攻击者来说,检测这个并且使得他的超时时间非常短暂是微不足道的 – 所以所有的事情都可以考虑,你最好使用REJECT–或者在你的服务器和互联网之间放置一个专用的端口转发设备。

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

通常REJECT最适合networking服务器,因为任何服务试图访问它都会很快得到响应,用户或其他服务不会一直在等待networking中断。

DROP规则的唯一潜在的好处是,如果你的上传容量less于下载容量 – 如果你使用了DDOS,那么你的上游链接就不会因为响应而陷入困境。