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 无疑更好!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。