防火墙中 drop 与 reject 的区别

drop 和 reject 都是用来拒绝数据包连接的,但 drop 和 reject 拒绝的结果是不一样的。

大家可以使用以下例子来测试,然后在服务端抓包

# iptables
iptables -A INPUT 5 -p tcp --dport 8086 -j REJECT --reject-with tcp-reset

iptables -A INPUT -p tcp --dport 8088 -j DROP

# reject 默认是 icmp-port-unreachable
iptables -A INPUT -p tcp --dport 8089 -j REJECT --reject-with icmp-port-unreachable

从实验结果来看:

  • drop:客户端 telnet 会一直发送 syn 请求包到服务器,服务端直接将数据丢弃(即黑洞掉),最终客户端会返回 Operation timed out
  • reject tcp reset:telnet 发送 syn 包到服务端,服务端直接返回 reset 包,返回非常快。客户端显示 "Connection refused"
  • reject icmp port-unreachable:telnet 发送 syn 包到服务端,服务端返回 icmp port unreachable 给客户端,客户端显示 "Connection refused"

何时使用 DROP,何时使用 REJECT,它们的应用场景是什么样的?

  1. 从防火墙性能方面来看,DROP 的处理效率明显比 REJECT 低。DROP 会导致客户端不停的发送 SYN 包到服务器,最终客户端等待 tcp timeout才停止发送数据包。这会加重上传带宽的占用。
  2. 从安全层面来考虑,DROP 不会向客户端返回任何数据包,无疑是最安全的。使用 DROP 使连接看起来像一个未被占用的 IP 地址

总结:通常,你的局域网内的所有连接规则都应该使用 REJECT。对于互联网,除了某些可信任的服务器外,来自互联网的连接通常是 DROP。

DROP 不符合 TCP 连接规范,可能对你的网络造成不可预期或难以诊断的问题,所以在可信任的局域网内使用 REJECT 无疑更好!

你可能感兴趣的:(运维)