1. Подготовка: обновление и установка зависимостей
sudo apt-get update
sudo apt-get install -y build-essential autoconf automake libtool \
git pkg-config libpcap-dev flex bison
Пояснение:
- build-essential — gcc/make и т.д.
- libpcap-dev — заголовки/библиотеки pcap (в истории вы пытались собирать libpcap, но можно установить пакет).
- flex и bison — требуются для сборки некоторых компонентов.
Если хотите собрать libpcap вручную, то можно:
cd /opt
git clone https://github.com/the-tcpdump-group/libpcap
cd libpcap
./configure
make -j$(nproc)
sudo make install
sudo ldconfig
(но пакет libpcap-dev решает нужду в большинстве случаев, я использовал его).
2. Клонирование/копирование p0f-mtu и начальная сборка
Лучше поставить в /opt:
sudo mkdir -p /opt
cd /opt
git clone https://github.com/ValdikSS/p0f-mtu.git
# или если у вас уже архив — распакуйте
cd /opt/p0f-mtu
Запустите сборочный скрипт:
cd /opt/p0f-mtu
sudo ./build.sh
Если ./build.sh падает с ошибками — смотрите вывод, установите дополнительные dev-пакеты. Частые зависимости: libpcap-dev, libssl-dev, liblzma-dev, zlib1g-dev — при необходимости устанавливайте.
Сам скрипт можете поставить в директорию своего сайта:
git clone https://github.com/ValdikSS/p0f-mtu-script.git
3. Сборка инструментов (tools)
Перейдите в каталог tools и соберите утилиты клиента:
cd /opt/p0f-mtu/tools
make p0f-sendsyn # если доступно
make p0f-client
После успешной сборки у вас появятся p0f-client, p0f-sendsyn и др.
4. Привилегии для захвата пакетов
Для захвата пакетов p0f должен иметь привилегии (raw sockets). Варианты:
- Запускать p0f от root (просто sudo или systemd с User=root) — просто, но менее безопасно.
- Дать бинарю права CAP_NET_RAW и CAP_NET_ADMIN (лучше):
sudo setcap 'cap_net_raw,cap_net_admin+eip' /opt/p0f-mtu/p0f
(если ваша сборка разместила бинарь под другим путём — поправьте путь).
Если setcap недоступен, установите libcap2-bin.
5. Запуск p0f вручную (проверка)
Примеры команд из вашей истории (корректируем пути и опции):
Запуск демона:
cd /opt/p0f-mtu
sudo ./p0f -i eth0 -s /opt/p0f-mtu/p0f-socket -u daemon -d 'tcp and (dst port 80 or src port 80)'
Объяснение опций:
- -i eth0 — интерфейс для прослушивания (подставьте ваш интерфейс: ip a).
- -s /opt/p0f-mtu/p0f-socket — unix socket для клиента.
- -u daemon — сменить пользователя на daemon после привилегий (можно создать специального пользователя).
- -d '...' — BPF-фильтр для снижения объёма трафика.
Подсказка: если хотите запускать в фоне — используйте nohup или лучше systemd (см. ниже).
6. Проверка p0f-client
После того как демон запущен и создал socket /opt/p0f-mtu/p0f-socket, вы можете опрашивать socket:
/opt/p0f-mtu/tools/p0f-client /opt/p0f-mtu/p0f-socket 8.8.8.8
/opt/p0f-mtu/tools/p0f-client /opt/p0f-mtu/p0f-socket 104.23.221.102
Первый аргумент — путь к socket, второй — IP для запроса. В истории именно так и делали — это удобный способ протестировать работу.
7. Создание системного пользователя (рекомендуется)
Создайте пользователя, от имени которого будет работать p0f (без логина):
sudo useradd --system --no-create-home --shell /usr/sbin/nologin p0f
sudo chown -R p0f:p0f /opt/p0f-mtu
Если в командной строке p0f указываете -u p0f, процесс после инициализации переключится на этого пользователя.
8. systemd-unit для p0f (рекомендуется для продакшна)
Создайте файл /etc/systemd/system/p0f.service со следующим содержимым:
[Unit]
Description=p0f passive OS/fingerprint daemon (p0f-mtu)
After=network.target
[Service]
Type=simple
User=p0f
Group=p0f
# при необходимости укажите полный путь к бинарю
ExecStart=/opt/p0f-mtu/p0f -i eth0 -s /opt/p0f-mtu/p0f-socket -u p0f -d "tcp and (dst port 80 or src port 80)"
# если нужен абсолютный путь для working dir
WorkingDirectory=/opt/p0f-mtu
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Затем:
sudo systemctl daemon-reload
sudo systemctl enable --now p0f.service
sudo journalctl -u p0f.service -f
Проверьте статус:
sudo systemctl status p0f.service
9. Логирование и ротация логов
p0f пишет в stdout/journal. Если вы хотите файлы логов — используйте systemd-юнит с StandardOutput=append:/var/log/p0f.log или перенаправляйте вывод в лог-файл и настроите logrotate.
Пример конфигурации для logrotate /etc/logrotate.d/p0f (если используете файл):
/var/log/p0f.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 p0f p0f
}
10. Тонкая настройка BPF-фильтра и интерфейса
BPF-фильтр в -d важен для снижения нагрузки. Примеры:
- HTTP трафик: 'tcp and (dst port 80 or src port 80)'
- Добавить HTTPS (если нужно): tcp and (port 80 or port 443)
- Фильтрация по IP-сети: net 10.0.0.0/8
Также убедитесь, что выбран правильный интерфейс: ip link / ip addr чтобы не слушать ненужный интерфейс.
11. Отладка проблем (частые ошибки и решения)
- p0f не запускается — нет прав: используйте sudo или дайте setcap привилегии (см. выше).
- socket не создаётся / p0f-client не подключается: проверьте пути и права на socket; запуск от не того пользователя может не позволять клиенту читать.
- Ошибка сборки: установите недостающие *-dev пакеты по сообщениям configure/make.
- Если использовали ручную сборку libpcap: убедитесь, что ldconfig выполнил обновление (sudo ldconfig), чтобы система увидела новую libpcap.
- SELinux/AppArmor: при включённом профиле безопасность может блокировать сетевой доступ — посмотрите логи audit/dmesg и временно отключите профиль для проверки.
12. Команды для быстрого тестирования (суммарно)
# 1) Сборка (пример)
cd /opt/p0f-mtu
sudo ./build.sh
# 2) Сборка инструментов
cd /opt/p0f-mtu/tools
make p0f-client
make p0f-sendsyn
# 3) Запуск вручную (для теста)
sudo /opt/p0f-mtu/p0f -i eth0 -s /opt/p0f-mtu/p0f-socket -u p0f -d 'tcp and (dst port 80 or src port 80)'
# 4) Проверка client
/opt/p0f-mtu/tools/p0f-client /opt/p0f-mtu/p0f-socket 8.8.8.8