drop 和 reject 都是用来回绝数据包连贯的,但 drop 和 reject 回绝的后果是不一样的。

大家能够应用以下例子来测试,而后在服务端抓包

# iptablesiptables -A INPUT 5 -p tcp --dport 8086 -j REJECT --reject-with tcp-resetiptables -A INPUT -p tcp --dport 8088 -j DROP# reject 默认是 icmp-port-unreachableiptables -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 无疑更好!