防范网络物理拓扑扫描的核心是主动“失真”网络视图,需从协议层(禁用icmp三类响应)、响应行为(静默丢弃非白名单端口syn包)、连接状态(限速限连)三维度协同防御。

防范针对网络物理拓扑的扫描攻击,核心不是“隐藏IP”,而是让攻击者无法通过基础探测手段(如 traceroute、ICMP探测、端口扫描)还原你的网络结构。这类攻击不直接打垮服务,却为后续渗透铺路——防火墙规则必须从协议层、响应行为、连接状态三个维度主动“失真”网络视图。
禁用关键ICMP响应,切断traceroute路径
traceroute依赖三种ICMP报文:Time Exceeded(路由器返回)、Destination Unreachable(目标主机返回)、Echo Reply(Ping回复)。只关Ping远远不够。
- Linux(iptables):屏蔽三类报文入站响应
sudo iptables -A OUTPUT -p icmp --icmp-type time-exceeded -j DROP
sudo iptables -A OUTPUT -p icmp --icmp-type destination-unreachable -j DROP
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP - firewalld(CentOS/RHEL):
sudo firewall-cmd --add-rich-rule='rule protocol value="icmp" icmp-type="time-exceeded" drop' --permanent
sudo firewall-cmd --add-rich-rule='rule protocol value="icmp" icmp-type="destination-unreachable" drop' --permanent
sudo firewall-cmd --reload - Windows防火墙:在“高级设置”中新建出站规则,协议选ICMPv4,自定义ICMP类型,分别填入代码11(Time Exceeded)、3(Destination Unreachable)、0(Echo Reply),动作为“阻止连接”
限制TCP/UDP端口探测响应
扫描器发SYN包试探端口,若服务器回应RST(拒绝)或SYN-ACK(开放),就暴露了服务存在。可通过丢弃非白名单端口的SYN包,让扫描器收不到任何响应——即“静默丢弃”,制造“无应答黑洞”。
- Linux示例(仅放行SSH 22、HTTP 80、HTTPS 443):
sudo iptables -A INPUT -p tcp ! --dports 22,80,443 -m state --state NEW -j DROP
sudo iptables -A INPUT -p udp ! --dports 53 -m state --state NEW -j DROP
(注意:UDP需谨慎,DNS等必要服务保留) - Windows:新建入站规则 → 类型选“端口” → 协议TCP → 特定本地端口填22,80,443 → 动作“允许连接”;再建一条规则,协议TCP → 所有端口 → 动作“阻止连接”,并确保它排在允许规则之后(优先级更低)
封禁已知扫描网段与高频异常源
单纯靠协议控制不够,需结合日志识别行为特征。重点拦截两类IP:
• 全网公开的扫描器C段(如Shodan、Censys常用出口IP段)
• 本机access.log中1分钟内请求>50次且路径高度随机(如遍历/wp-admin/、/phpmyadmin/、/backup.zip)的源IP
- 一键封禁脚本思路(Linux):
提取nginx日志中高频异常IP → 用iptables -A INPUT -s x.x.x.x -j DROP加入黑名单 → 每小时自动清理超24小时未再触发的IP - 云平台补充:阿里云/腾讯云安全组中,添加入方向规则,源IP填192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8(私有地址段),协议全部,动作“拒绝”——防止内网横向扫描外溢
- 避免误伤:百度、Google爬虫IP段需提前白名单(可查官方IP列表),或通过User-Agent+频率限速替代硬封
启用连接状态跟踪与速率抑制
拓扑扫描常伴随短连接风暴(如SYN Flood、UDP碎片扫描)。防火墙需区分“合法会话”与“探测噪声”。
- Linux connlimit限制单IP并发连接数:
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT --reject-with tcp-reset - firewalld速率限制(每分钟最多10个新连接):
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="10/m" accept' --permanent - Windows:使用Netsh命令开启连接限制(需管理员权限):
netsh advfirewall set allprofiles state on
netsh advfirewall set allprofiles settings maxconns 50











