Умные игры с сетями: обзор необычных сетевых утилитЕвгений «j1m» Зобнин (zobnin@gmail.com) Главное в хорошей статье – идея. Когда у меня появилась задумка нынешнего обзора, я полез в интернет и всего за несколько часов обнаружил огромное количество весьма любопытных сетевых утилит, а также массу редких, но очень эффектных приемов решения задач, связанных с Сетью. Отбросив мусор и сняв самые сливки, спешу о них рассказать. Измерить и обрезатьЧто делать, если мы хотим узнать пропускную способность нашей сети? Наиболее верный путь - выполнить копирование произвольного файла с удаленной машины на свою. Лучше всего проделать эту операцию с помощью протокола FTP, но подойдет так же HTTP, SMB или даже SSH. Главное - выбрать файл подлиннее. Но если ни одного из подобных сервисов на машине нет, измерение скорости передачи может превратиться в проблему. Особо хардкорные товарищи в этом случае могут запустить ping и на основе его статистических данных вычислить пропускную способность канала. Я же предлагаю не перенапрягать мозг и воспользоваться утилитой bing - особой модификацией ping, предназначенной для измерения скорости передачи данных между двумя хостами. Использовать bing почти так же просто, как и его родственника на «p». Необходимо указать IP-адрес локального конца канала и адрес его удаленного собрата, подождать некоторое время (чем дольше, тем точнее результат), остановить выполнение комбинацией <Ctrl+C> и найти в выводе команды строчку «estimated throughput». В ней и будет указана средняя пропускная способность канала, измеренная в байтах в секунду. ОК, скорость передачи мы узнали, но для некоторых приложений подобный «реактивный режим» будет излишеством. На хлюпеньком 256-мегабитном канале даже запущенный в фоне wget может принести массу проблем при чтении форумов или интенсивном поиске в Google, а многопоточный менеджер загрузок вообще съест весь канал и не поперхнется. Умерить пыл таких программ можно с помощью хорошего брандмауэра, но не стоит заниматься мазохизмом, и на каждый чих вписывать правила и через пару часов убирать их из таблиц. Для подобных случаев есть другой, более удобный инструмент – trickle. Trickle работает в пользовательском режиме, не требует привилегий root и позволяет установить различные скорости закачки/отдачи для нескольких приложений одновременно. Использовать его очень просто – достаточно указать ожидаемые пороги скорости в кб/с, имя ограничиваемой программы и ее аргументы. К примеру, ограничим скорость закачки wget до 10 кб/c:
И запустим сервер FTP со скоростями закачки/отдачи, равными 30 кб/c и 20 кб/с:
Если ты ограничиваешь пропускную способность для нескольких приложений одновременно, то перед стартом trickle запусти специальный демон trickled, который будет обслуживать множественные инстанции утилиты и снизит нагрузку на процессор. Стучимся в порты«Port knoking» (в дословном переводе на родной и могучий – «Стучаться в порты»), есть не что иное, как метод произведения каких-либо действий на стороне сервера с помощью последовательного опроса определенных портов. Проще говоря, это то же самое, что последовательность стуков в дверь, после которой за ней появляется параноидального вида мужик и быстро впускает Штирлица внутрь. В компьютерном мире роль параноидального мужика обычно выполняет специальный демон, прослушивающий порты, а Штирлиц - это мы (те, кто хочет «войти»). Ну а дверь, как не трудно догадаться, это брандмауэр, открывающий определенный порт (обычно SSH). «Стук в порты» - очень интересный прием со множеством плюсов. Он абсолютно невидим для постороннего. С его помощью легко защитить сервисы от брутфорса или DoS-атак. При правильном использовании – он очень стойкий к подбору комбинаций портов. Существует масса самых различных реализаций этой техники, начиная от самопальных скриптов, написанных первокурсниками, и заканчивая плагинами для iptables, но наиболее любима в народе, проста в использовании и богата на функционал система knock (www.zeroflux.org/cgi-bin/cvstrac/knock/wiki/). О ней и поговорим. 1. Конфигурируем брандмауэр таким образом, чтобы все незанятые реальными сервисами порты выше 1024 были открыты. Часть из них незаметно будет слушать наш демон. Порт защищаемого сервиса оставляем закрытым. 2. Создаем файл /etc/knockd.conf и пишем в него примерно следующее:
3. Запускаем демон:
4. Берем такси, едем домой и на домашнем компе выполняем команду:
5. Подключаемся SSH-клиентом к серверу и делаем то, что нужно. 6. Благополучно закрываем SSH-порт:
Отныне злодей даже и не догадается о том, что на твой любимый сервер можно проникнуть извне. Для него SSH-порт всегда будет закрыт (открывается он только для того IP, с которого был осуществлен «стук»). Но и это еще не все! Заказав такси прямо сейчас, ты сможешь вернуться к серверу и получить в подарок еще более надежную технику конспирации:
Это более интересный способ открытия порта, использующий сразу два приема повышения безопасности. Во-первых, теперь Штирлиц должен долбить в дверь не только рукой, но и ногой, то есть «стучать» и в TCP, и в UDP-порты. А во-вторых, брандмауэр откроет SSH-порт для входящих соединений только на 10 секунд, в течение которых мы должны успеть установить SSH-соединение (естественно, iptables должен быть сконфигурирован так, чтобы он без вопросов пропускал любой трафик уже установленных соединений). Конечная команда на подключение выглядит следующим образом:
Незаменимый netcatСетевая версия cat оказалась тем инструментом, замену которому вряд ли можно найти. Обладая предельной простотой, он невероятно богат на функционал, а диапазон его применения столь широк, что в народе netcat окрестили «Швейцарским армейским ножом». Утилита netcat по сути не делает ничего, кроме копирования данных в порт и из него, но при этом с ее помощью можно: 1. Передавать файлы:
2. Использовать вместо telnet:
3. Сканировать на открытые порты:
4. Осуществлять фингерпринт сервисов на основе баннеров:
5. Организовывать рекурсивный шелл:
Важно понимать, что существует несколько версий netcat, поведение которых может отличаться. Экземпляр, поставляемый с дистрибутивами Linux, - это оригинал, доживший до наших дней. Все пять приведенных примеров он отработает без проблем. Версия под названием GNU Netcat не поддерживает опции '-e', поэтому второй и пятый примеры она не воспримет. Особого внимания заслуживает netcat, распространяемый вместе с BSD-системами, опция '-e' в нем есть, но предназначена она для шифрования входящего и исходящего трафика методом IPSec ESP:
Кроме того, BSD Netcat способен подключаться к удаленной машине через прокси:
В этом примере прокси находится по адресу 172.16.64.1:8080, а флаг '-Xconnect' говорит о том, что он является HTTP-прокси. Также поддерживаются SOCKS версий 4 и 5, но о них следует информировать netcat через флаг '-X4' или '-X5'. Сам netcat легко использовать в качестве прокси или редиректора портов, но в этом случае его лучше связать с демоном inetd:
Теперь весь трафик, пришедший на порт 2525, будет перенаправляться на стандартный SMTP-порт 25. Таким же образом мы можем завернуть трафик с любого порта на другой порт/машину, просто видоизменив первые две команды. Пользователи дистрибутивов Linux могут вообще не заморачиваться с netcat: демон xinetd, ставший стандартом де факто для Linux-систем, сам умеет перенаправить сетевой трафик:
Grep, sed и top на службе сетиКроме рассмотренного выше netcat, известно еще несколько примеров удачного портирования UNIX-утилит в сетевой мир. В первую очередь, это программы ngrep и netsed, предназначенные для поиска и замены текстовых элементов внутри проходящих пакетов, и nettop - утилита, осуществляющая мониторинг сетевых соединений.
А вот другая команда, позволяющая прослушать весь SMTP-трафик:
Утилита предельно проста в использовании: указать маску и нужный порт обычно достаточно, чтобы найти то, что хочешь. Будут полезными так же флаги '-i' для игнорирования регистра символов, '-t' для вывода времени прихода/отправки для каждого пакета и '-W byline', принуждающий ngrep распечатывать содержимое пакетов по одному на строку. У тебя наверняка возник вопрос, можно ли таким же способом не только искать информацию в пакетах, но и изменять ее части на свой вкус. Ответ здесь неоднозначен, но он скорее будет «Да», чем «Нет». Существует простая до безобразия утилита netsed, созданная по мотивам потокового редактора sed. Вот только в режиме «Man In The Middle» она работать не может, потому как не использует низкоуровневые сетевые возможности ядра. Вместо этого она просто слушает заданный порт и передает измененный поток пакетов на другой порт/машину (т.е. работает в режиме прокси). В свете вышесказанного, – до того как мы сможем применять netsed в боевых условиях, необходимо настроить ОС так, чтобы трафик, в недрах которого мы хотим ковыряться, автоматически заворачивался в netsed. Например, если на машине давно и исправно работает smtp-сервер, а нам, ленивым админам, вдруг ни с того ни с сего захотелось в нем что-то изменить, будет не козырно переопределять его порт на 2525, а сам netsed вешать на 25-ый порт с последующей отправкой пакетов на порт 2525. Вместо этого мы просто завернем входящий smtp-трафик на порт 2525, который будет слушать netsed, а он, в свою очередь, уже отдаст его smtp-серверу. Сделать это можно либо с помощью любого брандмауэра, либо по описанной в предыдущем разделе схеме netcat+inetd.
Теперь все встречающиеся адреса vasya@host.com будут заменены на boris@host.com. Nettop - третья по счету утилита, созданная с использованием идей, заложенных в стандартные UNIX-утилиты. По сути, перед нами простой коллектор информации о сетевых соединениях и количестве трафика, прошедшего через порты. А заслуживает упоминания он только потому, что делает это в реальном времени и очень наглядно. ВкусностиПлохое качество соединения может стать настоящей проблемой, когда в фоне запущен ssh, организующий туннель, который мы постоянно кормим новым трафиком. Поток пакетов может просто «застрять» ровно до того момента, пока мы не перезапустим клиент, или пока через узкий канал не закончит проходить порно-фильм, который льет сидящий за стеной сосед. Постоянно смотреть в монитор и следить, все ли в порядке, мы тоже не можем и, что важнее, не хотим. Поэтому переложим работу по слежке и перезапуску ssh на плечи специальной программы autossh. Утилита autossh представляет собой враппер для ssh-клиента, который просто следит за состоянием соединения с помощью посылки коротких сообщений от клиента к серверу и обратно (что-то вроде пинга). Если «пинг» не возвращается или приходит с большой задержкой, autossh обрывает соединение и пытается его восстановить. Утилиту очень легко использовать: все, что нужно, - запускать команду autossh вместо ssh со всеми стандартными аргументами последней. Долго думал, стоит ли включать ptunnel в обзор, но все-таки решил включить. Дело в том, что ptunnel (Ping Tunnel) - это утилита, о которой мечтали лет 10 назад, когда вся Россия поголовно сидела на диалапе. В те далекие времена многие провайдеры выделяли специальный телефонный номер для тестирования соединения и проверки баланса своего счета. Все это было полностью бесплатно, потому что пользователь мог получить доступ только к сайту статистики, а все остальные соединения жестко обрезались. Но ошибка админов была в том, что зачастую они оставляли возможность посылать «пинги» и DNS-запросы на любой адрес внешней сети. Программа ptunnel как раз и эксплуатирует эту «уязвимость» через инкапсуляцию TCP-пакетов в ICMP Echo запрос, создавая туннель во внешний мир. 1. Запустить сервер ptunnel на каком-нибудь внешнем интернет-сервере:
2. Установить соединение с сетью, пропускающей во внешний мир только пинги и запустить клиент:
3. Настроить mail-клиент на адрес 172.0.0.1:1110 и благополучно забрать почту с сервера pop.mail.ru. Скорость будет не ахти, но для почты и ее достаточно. INFOПропускную способность Сети гораздо проще и эффективнее измерять с помощью утилиты iperf (dast.nlanr.net/Projects/Iperf), но bing вошел в наш обзор благодаря необычности дизайна. Кроме того, на некоторых BSD-системах iperf показывает неверные результаты. С помощью knock легко организовать не только открытие портов, но и множество других полезных вещей. Это может быть, например, обратный shell, описанный в разделе про netcat, команда, перезагружающая определенный сервис, или скрипт, отправляющий отчет о состоянии сервера на телефон по SMS. WWW
|