如何防范端口扫描仪?

如何防范端口扫描仪?

是否可以nmap完全阻止观察我的机器?通过iptables端口扫描删除所有传入连接后,将返回“已过滤”。如果 nmap 根本看不到存在哪些端口,那就更好了。这可能吗?

以下解决方案似乎不起作用:

http://sharadchhetri.com/2013/06/15/how-to-protect-from-port-scanning-and-smurf-attack-in-linux-server-by-iptables/

https://dangertux.wordpress.com/2011/09/18/defeating-port-scans-using-iptables/

http://prithak.blogspot.de/2011/12/blocking-nmap-scans-with-pf-and.html

如果无法阻止 nmap 查看我的设备,是否可以进行速率限制,以便 nmap 需要很长时间才能完全扫描我的 IP?

答案1

简单的速率限制是不够的,因为 nmap 在达到速率限制时会增加扫描延迟。以下是 iptables 的最佳用途。

首先创建ipset列表

ipset create port_scanners hash:ip family inet hashsize 32768 maxelem 65536 timeout 600
ipset create scanned_ports hash:ip,port family inet hashsize 32768 maxelem 65536 timeout 60

和 iptables 规则

iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state NEW -m set ! --match-set scanned_ports src,dst -m hashlimit --hashlimit-above 1/hour --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name portscan --hashlimit-htable-expire 10000 -j SET --add-set port_scanners src --exist
iptables -A INPUT -m state --state NEW -m set --match-set port_scanners src -j DROP
iptables -A INPUT -m state --state NEW -j SET --add-set scanned_ports src,dst

这是如何运作的:

在这里,我们将扫描的端口存储在 Scand_Ports 集中,并且我们仅在 hashlimit 规则上计算新扫描的端口。如果扫描器将数据包发送到 5 个不同的端口(请参阅 --hashlimit-burst 5),则意味着它可能是一个扫描器,因此我们将其添加到 port_scanners 集中。

port_scanners 的超时是扫描仪的阻塞时间(在该示例中为 10 分钟)。它将从头开始计数(请参阅 --exist),直到攻击者停止扫描 10 秒(请参阅 --hashlimit-htable-expire 10000)

您可以将这些参数设置为最适合您的值。

请注意,有人可以通过“扫描”作为欺骗来阻止任何 IP。我建议你不要将块超时设置得太长。

添加:

如果要添加白名单,请创建白名单

ipset create whitelisted hash:net

并改变丢弃规则

iptables -A INPUT -m state --state NEW -m set --match-set port_scanners src -m set ! --match-set whitelisted src -j DROP

答案2

如果您希望某个服务(例如 SSH)可用并能够使用,那么 Nmap 将能够找到它。一般来说,端口扫描不构成威胁;您的安全不应依赖于攻击者不知道正在运行哪些服务。使用 SSH 的非标准端口主要有助于减少日志噪声,因为在默认端口 22 上进行了大量自动暴力破解。

从安全角度来看,您的主要目标应该是:了解/预测、预防、检测、响应和恢复。以下是端口扫描与这些的关系:

知道/预测:了解您拥有哪些资产以及攻击者会追求什么。端口扫描您自己以查看您的暴露情况。了解端口扫描可以做什么和不能做什么;他们不是神奇的黑客仙尘。

防止:使用防火墙阻止访问不应公开的端口/服务。限制对已知 IP 地址的访问。将敏感数据和服务器移至网络外围并通过 VPN 或其他访问控制来控制访问。速率限制不是预防,只是延迟。

探测:监视端口扫描、暴力破解和其他攻击迹象的日志。了解什么是正常背景噪音以及什么实际上构成威胁。针对妥协迹象设置警报。

回应:制定处理安全漏洞的计划。设置诸如fail2ban 之类的自动化防御来应对威胁。速率限制可以作为一种回应,但它真的能阻止任何事情吗?

恢复: 制定恢复计划。定期进行备份并测试从备份恢复。

答案3

以下是 nmap 的文档中关于“已过滤”状态的说明:

状态可以是打开、过滤、关闭或未过滤。打开意味着目标计算机上的应用程序正在侦听该端口上的连接/数据包。已过滤意味着防火墙、过滤器或其他网络障碍物阻塞了该端口,使得 Nmap 无法判断该端口是打开还是关闭。关闭的端口没有应用程序侦听,但它们可以随时打开。当端口响应 Nmap 的探测时,它们被分类为未过滤,但 Nmap 无法确定它们是打开还是关闭。当 Nmap 无法确定两个状态中的哪一个描述端口时,它会报告 open|filtered 和 close|filtered 状态组合。

看起来“关闭”的正常行为(即,可到达的端口,但没有服务器正在监听), REJECT比 更接近 iptables 操作DROP,并且 nmap 的“过滤”诊断识别DROP(连接最终超时) ,因为正在检查的服务器完全沉默,而不是像 那样立即关闭REJECT。)

所以我建议尝试使用REJECT而不是DROP,看看扫描结果是否更符合您的喜好。

答案4

@ibrahim 提供的答案非常好,但iptables已被弃用,并被现代系统所使用nftables

因此,如果你们想知道如何将他的iptables代码转换为nftables以下内容,那么下面是一个完整且经过测试的解决方案,包括注释。

笔记:该示例仅适用于IPv4TCP但潜在的攻击者也可能使用其他协议,例如UDP或 进行攻击IPv6,因此您还需要在此处做一些额外的工作来解决这一问题。

文件:attacker.nft
运行脚本:sudo nft -f ./attacker.nft

#!/usr/sbin/nft -f

#
# IPv4 port scanning and information gathering detection
#
add table filter_4

# Sees all incoming packets, before any routing decision has been made
# Packets may be addressed to the local or remote systems
add chain filter_4 prerouting_4 {
    # -175 = After conntrack and before mangle
    type filter hook prerouting priority -175; policy accept;
}

# Port scanning detection chain
add chain filter_4 attacker_4 {
    comment "IPv4 port scanning detection chain"
}

# Prerouting filter
add rule filter_4 prerouting_4 jump attacker_4

# IPv4 attack count
add counter filter_4 attacker_count_4 {
    comment "Count of attacks over IPv4"
}

# A record of current attackers on cooldown
# NOTE: Do not set too high timeout because the attacker might as well spoof it's IP
add set filter_4 port_scanners_4 {
    flags dynamic
    type ipv4_addr
    timeout 10m
    size 256
    comment "IP of the attacker performing port scan"
}

# A record of source IP and local ports being accessed
add set filter_4 scanned_ports_4 {
    type ipv4_addr . inet_service
    flags dynamic
    timeout 1m
    size 256
    comment "Potential attacker IP and local port accessed"
}

# Detect port scanning and record attackers IP
# meter: iptables equivalent is hashlimit
# portscan: meter name
# timeout: After how many seconds do meter entries expire
# limit rate over: Match if the rate is above amount
# burst: Maximum initial number of packets to match: this number gets recharged by one every time the limit specified above is not reached, up to this number
# the default is 5, if the entry expires, the burst value is reset too
add rule filter_4 attacker_4 ct state new ip saddr . tcp dport != @scanned_ports_4 meter portscan { ip saddr timeout 10s limit rate over 1/hour burst 5 packets } update @port_scanners_4 { ip saddr }

# Drop packets originating from attacker's IP
add rule filter_4 attacker_4 ct state new ip saddr == @port_scanners_4 log flags all prefix "drop attacker_4 TCP port scanner: " counter name attacker_count_4 drop

# Keep a record of potential attacker IP and local port being probed
add rule filter_4 attacker_4 ct state new update @scanned_ports_4 { ip saddr . tcp dport }

相关内容