@Hitch
Здравствуйте
Как я уже писал ранее , проблема в том , что PF работает чуть выше уровнем , чем Вам надо (см статью в этой ветке порядок прохождения пакетов )
Если все-таки надо фильтровать на уровне канальном с анализом Ethernet заголовка и именно на PF , то я бы решал эту проблему через Netgraph ( но в лоб ее не решить , нужно приложить некие усилия )
Суть в том , что эта подсистема позволяет перехватывать и анализировать трафик именно в том момент , когда он передается от драйвера адаптера к ядру системы и наоборот
Таким образом , можно отсеивать пакеты с неразрешенными Mac- адресами и пропускать валидные пакеты
Тут есть 2 пути
1 использовать комбинацию модулей ng_ether +ng_bpf
(они уже встроены в ядро PF , и тут надо только написать грамотный скрипт и составить bpf- программу , используя tcpdump)
пример такой программы
printf "Configuring ${INTERFACE}_bpf..."
ngctl msg ${INTERFACE}_bpf: setprogram { thisHook=\"${INTERFACE}_to_bpf_from_tee\" \
ifMatch=\"${INTERFACE}_from_bpf_to_one2many\" ifNotMatch=\"drop\" \
bpf_prog_len=19 bpf_prog=[ { code=40 jt=0 jf=0 k=12 } { code=21 jt=16 jf=0 k=34525 } \
{ code=21 jt=0 jf=15 k=2048 } { code=48 jt=0 jf=0 k=23 } { code=21 jt=0 jf=13 k=17 } \
{ code=40 jt=0 jf=0 k=20 } { code=69 jt=11 jf=0 k=8191 } { code=177 jt=0 jf=0 k=14 } \
{ code=72 jt=0 jf=0 k=14 } { code=21 jt=0 jf=8 k=53 } { code=80 jt=0 jf=0 k=24 } \
{ code=84 jt=0 jf=0 k=128 } { code=21 jt=0 jf=5 k=128 } { code=32 jt=0 jf=0 k=30 } \
{ code=21 jt=2 jf=0 k=3232236006 } { code=84 jt=0 jf=0 k=4294967264 } \
{ code=21 jt=0 jf=1 k=3232235808 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }
printf "OK! \n"
2 использовать комбинацию модулей ng_ether + ng_macfilter
тут все несколько отличается от пути 1 и конфигурируется тоже легче , НО тк модуль ng_macfilter не интегрирован в ядро PF , то
его придется отдельно собирать под конкретную версию Freebsd
https://www.gsp.com/cgi-bin/man.cgi?section=4&topic=NG_MACFILTER
https://github.com/freebsd/freebsd-src/blob/main/sys/netgraph/ng_macfilter.c
посмотреть , с какими модулями собрано ядро можно командой
kldstat -v | grep ng_