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,它们的利用场景是什么样的?
- 从防火墙性能方面来看,DROP 的解决效率显著比 REJECT 低 。DROP 会导致客户端不停的发送 SYN 包到服务器,最终客户端期待 tcp timeout 才进行发送数据包。这会减轻 上传带宽 的占用。
- 从平安层面来思考,DROP 不会向客户端返回任何数据包,无疑是最平安的。应用 DROP 使连贯看起来像一个未被占用的 IP 地址。
总结:通常,你的局域网内的所有连贯规定都应该应用 REJECT。对于互联网,除了某些可信赖的服务器外,来自互联网的连贯通常是 DROP。
DROP 不合乎 TCP 连贯标准,可能对你的网络造成不可预期或难以诊断的问题,所以在可信赖的局域网内应用 REJECT 无疑更好!