Я хочу отслеживать список используемых портов в системе Linux. Я хочу создать сценарий, который может запускать предупреждение, когда новый порт работает или не работает. Например, когда порт 8080 активен, я получаю предупреждение: этот порт используется процессом xxx. Когда он снова упадет, я хочу получить еще одно предупреждение.
Как я могу это сделать? netstat, nmap и iptables показывают используемые порты в точное время, но я хочу обновить то, что именно произошло.
Я должен заметить, что не могу подключиться к Интернету. Поэтому я не могу устанавливать новые программы, я должен работать с базовыми программами.
Получить эту информацию немного сложно. Этот конкретный способ будет регистрировать информацию о вызове системного вызова bind (2). Это предварительный вызов для фактического начала приема соединений (процесс-демон обычно вызывает прослушивание, а затем принимает после этого). Здесь используется функция аудита Linux (поэтому для этого потребуется запустить auditd)
В audit.rules;
-a exit, всегда -F arch = b64 -S bind
Затем в audit.log мы будем иметь строки вроде:
type=SYSCALL msg=audit(1380535439.187:560): arch=c000003e syscall=49 success=yes exit=0 a0=8 a1=9c1ce0 a2=10 a3=7fffd8000050 items=0 ppid=3021 pid=3022 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=4 comm="nginx" exe="/usr/sbin/nginx" key=(null)
type=SOCKADDR msg=audit(1380535439.187:560): saddr=02001F90000000000000000000000000
Первая строка (type = SYSCALL syscall = 49) относится к вызову привязки (как в /usr/include/asm/unistd_64.h
, следующая (type = SOCKADDR) фактически декодирует / отображает аргумент к нему:
0200 1F90 00000000 0000000000000000
Итак, осталось написать сценарий, который завершает этот файл и декодирует / отправляет уведомления при возникновении соответствующего события.
Периодически запускать fuser 8080 / tcp && openalertscript || closedalertscript
1-я команда вернет PID процессов, связанных с этим сокетом.