1

Я работаю над сценарием bash для автоматического обнаружения и удаленного управления запатентованными регистраторами данных моей компании. Записывающие устройства работают под заказной версией Linux и по сути являются мощными PIS или Arduinos.

Порт Ethernet на устройствах настроен таким образом, что при подключении к сети он получает аренду 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

При запуске от имени обычного пользователя эта линия работает невероятно стабильно, но для получения положительных результатов мне нужно увеличить время ожидания до 600 мс. Я проверил это, используя команду time и вот обычный результат (сделанный с таймаутом 600 мс):

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.

2 ответа2

0

После дальнейших исследований я нашел кое-что интересное в разделе MISC справочной страницы. Для параметра --unprivileged есть опция, которая заставляет работать как обычного пользователя, даже как root. Это выполняет значительно меньше операций и предоставляет меньше информации, но если все, что вы делаете, проверяет ssh на порте 22, он делает это как можно быстрее.

0

Я не уверен, что будет причиной различий в двух запусках, но у меня есть некоторые идеи относительно последовательности и скорости, которые могут помочь. Во-первых, вот различия в операциях между корневым и некорневым сканированием с выбранными вами параметрами:

  • При непривилегированном (некорневом) сканировании будет использоваться пара вызовов TCP connect() для определения работоспособности хоста; корневые сканирования отправят запрос ARP и прослушают сеть для ответа. Запрос ARP должен быть быстрее, так как вызовы connect требуют, чтобы ОС выполняла:
    1. запрос ARP или, по крайней мере, поиск в кэше ARP
    2. по крайней мере, в другую сторону, чтобы получить ответ от цели
  • Для сканирования без полномочий root будет использоваться полный вызов TCP connect() для сканирования порта 22, и он должен закрыть сокет после завершения; Сканирование root выполнит половинное рукопожатие, полагаясь на ОС, чтобы закрыть соединение «в фоновом режиме».

Таким образом, с этими опциями, как правило, привилегированное сканирование будет быстрее. Однако при сетевом соединении с очень малой задержкой возможно, что настройка различных прослушивателей PCAP немного замедлит сканирование корня. Но это, вероятно, не то, откуда ваша задержка.

Вы можете ускорить сканирование, пропустив некоторые ненужные фазы сканирования . Попробуйте добавить флаг -n чтобы пропустить обратный поиск имени (кстати, это не учитывает таймаут хоста!). Или, если вы знаете, что цель присутствует и хотите проверить только ответ порта 22, добавьте опцию -Pn чтобы пропустить этап обнаружения хоста.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .