如何拦截坏包?

如何拦截坏包?

我想阻止坏数据包。我已经使用了 CSF 并将它们添加到 csfpost.sh...但我真的要阻止这些(标志:SYN ECN CWR)

现在,这些是我的规则..

#!/bin/bash
# Drop Various Attacks
iptables -A INPUT -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A OUTPUT -p udp -j DROP
ip6tables -A OUTPUT -p udp -j DROP
iptables -A INPUT -p tcp --destination-port 8080 -j DROP
iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ECN,CWR -j DROP

# Prevent source address 127.0.0.1 from sending data through various interfaces
iptables -A INPUT -p all -s localhost -i wlan0 -j DROP
iptables -A INPUT -p all -s localhost -i eth0 -j DROP

# Drop Fragments
iptables -A INPUT -f -j DROP

# Drop ICMP (Ping) Packets
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

# Do not respond to pings
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP

# Drop Invalid Packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

# Drop LAND (Local Area Network Denial) Packets
# In this attack, a packet is spoofed to make the source address appear as the IP-address of the target.  In other words, the source and destination IP-addresses are the same.
iptables -A INPUT -s 127.0.0.0/8 -j DROP

# Drop Null Packets
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Drop excessive RST Packets to avoid Smurf-Attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

## Drop Smurf-Attacks
# Smurf-Attacks send a large number of ICMP "echo broadcast" packets with a spoofed source IP-address being the target's IP-address. The machines on the network recieve this broadcast message and reply to the target with "echo reply" packets. One way to block this attack is to block all the ICMP packets. However, if that cannot be done, then a limit may be applied to the ICMP packets allowed.
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

# Drop Spank DoS Attacks
# Computers answer TCP packets that are coming from a multicast-address. This can be used for the Spank DoS Attack or stealth-scans.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop SYN Flood Packets
# This is a type of DOS (Denial Of Service) attack.
iptables -A INPUT -p tcp -m state --state NEW -m limit --limit 2/second --limit-burst 2 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -j DROP

# Drop XMAS Packets
# A Christmas-Tree Packet is a packet that has all flags of any protocol set. The FIN, URG, and PSH bits in the TCP header are set. This packet is called an "Xmas Tree" packet because all the fields of header are "lightened up".
iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# Prevent Port-scans

# Use only one of the two given port-scan lock-out systems
# Lock-out systems that attempted a port-scan (lock lasts a day)
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove
# Lock-out systems that attempted a port-scan (lock lasts a week)
iptables -A INPUT -m recent --name portscan --rcheck --seconds 604800 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 604800 -j DROP
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# Log Port-Scan Attempts
iptables -A INPUT -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -m recent --name portscan --set -j DROP
iptables -A FORWARD -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -m recent --name portscan --set -j DROP

# Block Packets used by Port-Scans
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL URG,PSH,SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

答案1

尝试去列出并丢弃所有可能的坏事是徒劳的,因为这个列表可能是无限的,而且肯定会不断扩大。相反,设计防火墙规则时推荐的原则是定义规则以接受以下类型的流量:必要的让系统完成其工作,然后添加一条最终规则放下其他一切。

如果您的“CSF”是配置服务器防火墙,那么它很可能已经按照这个原则设计了。

你说你的规则已经进来了csfpost.sh,它们看起来都是iptables -A命令,所以他们在CSF创建的规则链的末尾添加了新规则。但如果 CSF 设计良好,它会在其规则末尾放置一条“丢弃所有尚未被接受的内容”规则。由于规则是按顺序检查的,因此您的一长串手动规则实际上可能有根本没有任何实际效果因为它们都是在最后一条 CSF 规则之后添加的。

您的脚本还包含一些规则,如果它们实际上放置在规则集的开头,则实际上可能有害。例如:

iptables -A OUTPUT -p udp -j DROP
ip6tables -A OUTPUT -p udp -j DROP

您正在阻止所有传出 UDP 流量。 IP 组播只能使用 IGMP 进行控制,使用 UDP 进行数据传输。这些规则意味着系统根本无法发送任何有用的 IPv4 或 IPv6 多播消息。由于 IPv6 实质上用多播取代了广播,因此这将有效削弱 IPv6。在 IPv4 方面,这将阻止最基本的 DNS 查询、NTP 和 DHCP。

iptables -A INPUT -s 127.0.0.0/8 -j DROP

由于此规则不限于外部接口,因此它也会对环回接口生效,并会有效地丢弃其上的所有流量。阻塞环回接口会导致很多软件无法工作或行为非常奇怪。

iptables -A INPUT -d 224.0.0.0/4 -j DROP
...
iptables -A INPUT -d 239.255.255.0/24 -j DROP

这也将删除所有 IPv4 多播。第二条规则是不必要的,因为第一条规则已经涵盖了它。

iptables -A INPUT -d 255.255.255.255 -j DROP

如果您的系统充当 DHCP 服务器,这将破坏该功能。 (DHCP客户端在启动时还不知道自己的IP地址,因此只能发送源地址为0.0.0.0、目的地址为255.255.255.255的广播。如果这样的广播按原样从一个网段传递到另一个网段通过路由器,该路由器配置严重错误。)

iptables -A INPUT -p tcp -m state --state NEW -m limit --limit 2/second --limit-burst 2 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -j DROP

每秒只有 2 个新传入 TCP 连接,缓冲区还可以容纳 2 个连接?单个网络浏览器可以轻松满足这一需求。

iptables -A INPUT -p tcp --tcp-flags SYN,ECN,CWR -j DROP

ECN 不是单个标志,而是涉及多个新 TCP 标志的技术。Linux内核已经支持ECN。它可能已经具有内置的健全性检查,比使用简单的 iptables 规则所做的更准确。

iptables -A INPUT -f -j DROP

删除 IP 片段可能是过时的建议:无论如何,Linux 内核可以并且将会根据需要自动重新组装和健全性检查所有片段。这种情况发生在连接跟踪处理数据包之前iptables,因此该规则可能永远不会匹配任何内容。

总的来说,在我看来,您要么在没有完全理解其含义的情况下收集各种防火墙规则,要么遵循过时或不完整的建议。

要在单个命令级别设计有效的防火墙规则iptables,您确实需要了解系统完成其工作所需接受的所有网络流量类型,并且至少对所涉及的协议有基本的了解。如果您尝试为每种可能的坏事收集规则而不了解它们与“好”流量类型的关系,那么您总是会失败。如果你继续走这条路,你会以惨痛的方式学到这一点——考虑到你自己受到了警告。

相关内容