Аудит Linux может помочь. Он будет по крайней мере определять местонахождение пользователей и процессов, осуществляющих сетевые подключения дейтаграмм. UDP-пакеты - это дейтаграммы.
Сначала установите auditd
фреймворк на свою платформу и убедитесь, что он auditctl -l
что- то возвращает, даже если он говорит, что правила не определены.
Затем добавьте правило для наблюдения за системным вызовом socket()
и отметьте его для более легкого поиска позже ( -k
). Я должен предположить, что вы используете 64-битную архитектуру, но вы можете заменить b32
ее, b64
если нет.
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Вы должны выбрать man-страницы и заголовочные файлы, чтобы построить это, но то, что он захватывает, по сути, это системный вызов: socket(PF_INET, SOCK_DGRAM|X, Y)
где третий параметр не указан, но часто равен нулю. PF_INET
равно 2 и SOCK_DGRAM
равно 2. TCP-соединения будут использовать, SOCK_STREAM
который будет установлен a1=1
. ( SOCK_DGRAM
во втором параметре может быть ORed с помощью SOCK_NONBLOCK
или SOCK_CLOEXEC
, следовательно, &=
сравнения.) Это -k SOCKET
наше ключевое слово, которое мы хотим использовать при последующем поиске журналов аудита. Это может быть что угодно, но мне нравится, чтобы все было просто.
Пусть пройдет несколько минут и просмотрите контрольные записи. При желании вы можете форсировать пару пакетов, выполняя команду ping для хоста в сети, что приведет к поиску DNS, который использует UDP, что должно отключить наше предупреждение аудита.
ausearch -i -ts today -k SOCKET
И вывод, похожий на раздел ниже, появится. Я сокращаю это, чтобы выделить важные части
type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET
В приведенном выше выводе мы видим, что ping
команда вызвала открытие сокета. Я мог бы тогда запустить strace -p 14510
процесс, если он все еще работал. ppid
(Идентификатор родительского процесса) также перечислен в случае это сценарий , который нерестится проблема ребенок много.
Теперь, если у вас много UDP-трафика, этого будет недостаточно, и вам придется прибегнуть к OProfile или SystemTap , которые в настоящее время находятся за пределами моего опыта.
Это должно помочь сузить положение в общем случае.
Когда вы закончите, удалите правило аудита, используя ту же строку, которую вы использовали для его создания, только замените -a
на -d
.
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Вы можете использовать netstat, но вам нужны правильные флаги, и это работает, только если процесс, который отправляет данные, все еще жив. Он не найдет следов чего-то, что ненадолго ожило, отправило UDP-трафик, а затем ушло. Это также требует локальных привилегий root. Это говорит:
Вот я запускаю ncat на моем локальном хосте, отправляю трафик UDP на порт 2345 на (несуществующей) машине 10.11.12.13:
Вот некоторые выходные данные tcpdump, подтверждающие, что трафик идет:
Вот полезный бит , использующий netstat с флагом -a (для просмотра сведений о порте) и флагом -p для просмотра сведений об идентификаторе процесса. Это флаг -p, который требует привилегий root:
Как вы можете видеть, pid 9152 используется как открытый порт 2345 на указанном удаленном хосте. Netstat также помогает через ps и сообщает мне имя процесса
ncat
.Надеюсь, это пригодится.
источник
grep -w 57550
потому что несколько процессов могли выполнять поиск DNS на одном и том же сервере. Ваш метод не отличит их.У меня была точно такая же проблема, и, к сожалению,
auditd
она для меня мало что сделала.У меня был трафик с некоторых из моих серверов, идущий в сторону DNS-адресов Google,
8.8.8.8
и8.8.4.4
. Теперь у моего сетевого администратора умеренный OCD, и он хотел убрать весь ненужный трафик, так как у нас есть наши внутренние DNS-кеши. Он хотел отключить исходящий порт 53 для всех, кроме тех серверов кеша.Итак, после неудачи с
auditctl
, я копаться вsystemtap
. Я придумаю следующий скрипт:Тогда просто запустите:
Это вывод, который я получил:
Это оно! После изменения
resolv.conf
этих PID не принимал изменения.Надеюсь это поможет :)
источник
Вот опция systemtap, использующая пробники сетевого фильтра, доступные в stap версии 1.8 и выше. Смотрите также
man probe::netfilter.ip.local_out
.источник
Я бы использовал сетевой сниффер типа tcpdump или wireshark для просмотра DNS-запросов. Содержимое запроса может дать представление о том, какая программа их выдаёт.
источник
Имейте в виду, что при использовании autitctl nscd, например, использует немного другой параметр в системном вызове сокета при выполнении DNS-запроса:
Поэтому, чтобы убедиться, что вы перехватываете эти запросы в дополнение к тем, что были упомянуты выше, вы можете добавить дополнительный фильтр с тем же именем, если хотите:
Здесь 2050 - это побитовое ИЛИ SOCK_DGRAM (2) и SOCK_NONBLOCK (2048).
Тогда поиск найдет оба фильтра с одинаковым ключом
SOCKET
:Шестнадцатеричные значения для констант сокетов я нашел здесь: https://golang.org/pkg/syscall/#pkg-constants
Поскольку у меня нет комментариев к репутации, я добавил это.
источник