我正在编写一个 bash 脚本,用于自动检测和远程控制我公司的专有数据记录器。这些记录器运行自定义版本的 Linux,本质上是功能强大的 pis 或 arduinos。
设备上的以太网端口配置为当插入网络时,它将被授予 dhcp 租约。为了检测设备,我正在本地计算机上监控 /var/lib/dhcp/dhcpd.leases。对于每个唯一条目,我使用 进行端口扫描以测试 ssh 服务器状态nmap
。为了启用此脚本的自动启动,它会从 /etc/rc3.d/rc.local 调用,因此在启动时由 root 运行。这就是事情变得奇怪的地方。
为了确保我们始终能够检测到新连接,dhcpd.leases 文件会以无限循环的方式进行检查。我们还希望保持较低的系统占用空间,因此为了减少每次循环迭代的时间,我们对 施加了一个小的超时时间nmap
。下面是实际使用的行:
nmap --max-retries=1 -p 22 --host-timeout=50ms $ip_address
当以普通用户身份运行时,此行工作非常稳定,但作为 root,我必须将超时时间增加到 600ms 才能获得始终如一的积极结果。我已使用该time
命令对其进行了测试,以下是通常的结果(使用 600ms 超时完成):
Starting Nmap 6.40 ( http://nmap.org ) at 2014-12-19 09:41 EST
Nmap scan report for 192.168.53.101
Host is up (0.00039s latency).
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
real 0m0.059s
user 0m0.043s
sys 0m0.004s
以下是相同操作的输出,但是以 root 身份登录:
Starting Nmap 6.40 ( http://nmap.org ) at 2014-12-19 09:48 EST
Nmap scan report for 192.168.53.101
Host is up (0.00035s latency).
PORT STATE SERVICE
22/tcp open ssh
MAC Address: 00:04:D1:0B:03:EC
Nmap done: 1 IP address (1 host up) scanned in 0.55 seconds
real 0m0.580s
user 0m0.056s
sys 0m0.008s
有什么想法可能导致这个额外的时间以及如何防止它?从一些初步研究中,我可以看到 root 使用其他用户无法访问的一些默认设置运行。我该如何复制nmap
普通用户执行的条件?
另外需要注意的是,这是在 Ubuntu 14.04 LTS 机器上运行的。
答案1
经过进一步研究,我在手册页的 MISC 部分发现了一些有趣的东西。有一个选项可以--unprivileged
强制以普通用户身份(甚至 root 用户)进行操作。这会执行更少的操作并提供更少的信息,但如果您所做的只是检查端口 22 上的 ssh,它会尽可能快地完成。
答案2
我不确定是什么导致了两次运行的差异,但我对一致性和速度有一些想法,可能会有所帮助。首先,以下是使用您选择的选项在根扫描和非根扫描之间的操作差异:
- 非特权(非 root)扫描将使用一对 TCP
connect()
调用来确定主机是否已启动;root 扫描将发送 ARP 请求并嗅探网络以获取响应。ARP 请求应该更快,因为连接调用需要操作系统执行:- ARP 请求,或者至少是 ARP 缓存查找
- 至少再往返一次才能得到目标的响应
- 非根扫描将使用完整的 TCP
connect()
调用来扫描端口 22,并且完成后必须关闭套接字;根扫描将执行半握手,依靠操作系统“在后台”关闭连接。
因此,使用这些选项,特权扫描通常会更快。但是,在延迟极低的网络连接下,各种 PCAP 侦听器的设置可能会稍微减慢根扫描的速度。但这可能不是延迟的原因。
您可以通过跳过一些来加快扫描速度扫描阶段您不需要。尝试添加-n
标志以跳过反向名称查找(顺便说一句,这不计入主机超时!)或者如果你知道目标存在并且只想检查端口 22 响应,添加-Pn
跳过主机发现阶段的选项。