
Пишем TCP-сканер портов на Go: goroutine, timeout и CSV-отчёт
albatomm 2 часа назад Пишем TCP-сканер портов на Go: goroutine, timeout и CSV-отчёт Средний 6 мин 3.6K Go * Сетевые технологии * Проектирование и рефакторинг * Программирование * Linux * Туториал Недавно знакомый...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. albatomm 2 часа назад Пишем TCP-сканер портов на Go: goroutine, timeout и CSV-отчёт Средний 6 мин 3. 6K Go * Сетевые технологии * Проектирование и рефакторинг * Программирование * Linux * Туториал Недавно знакомый попросил помочь с небольшой задачей по проверке внешнего периметра сети компании. Сразу уточню: речь шла об инфраструктуре, на проверку которой было разрешение.
Под внешним периметром обычно понимают всё, что доступно из интернета: публичные IP-адреса, домены, поддомены, облачные или VPS-серверы, а также сервисы, которые слушают внешние порты. Задача была простой по формулировке, но интересной технически: нужно понять, какие адреса доступны извне и к каким портам можно подключиться. Что мы будем делатьВ данной статье я покажу, как сделать простой TCP port scanner на Go.
Технические детали
Он будет уметь:Читать IP-адреса и домены из файлаПроверять диапазон портовОпределять открытые порты и добавлять к ним условную оценку рискаСразу реализуем ограничение параллельности через семафор, чтобы обработка портов была быстрееСтруктура проекта и сам кодПроект небольшой, поэтому структура получилась простой. Я разделил код на несколько пакетов, чтобы каждая часть отвечала за свою задачу. go internal/ input/ input.
go resolver/ resolver. go services/ services. sumКоротко пройдёмся по пакетам внутри internal и разберём, за что отвечает каждый из них.
Input - отвечает за чтения файла и возвращения массива string с нашими портами:func ReadTargets(path string) (string, error) { file, err := os. Close() return ParseTargets(file) } func ParseTargets(reader io. Reader) (string, error) { targets := make(string, 0) scanner := bufio.
Отраслевые последствия
NewScanner(reader) for scanner. Scan() { text := strings. Text()) if text == "" strings.
HasPrefix(text, "# { continue } targets = append(targets, text) } if err := scanner. = return targets, nil } Здесь всё просто: открываем файл, читаем его построчно через bufio. Scanner, пропускаем пустые строки и комментарии, а остальные значения возвращаем как список целей.
Services - данный пакет отвечает за справочную информацию о сервисах по номеру порта:package services type Info func Lookup(port int) Info { switch } Lookup не делает fingerprint сервиса. Он просто подсказывает наиболее вероятный сервис по номеру порта. Структура Info - хранит в себе Name - это названия сервиса, например SSH или HTTP.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





