Для общего фильтра, исключающего весь трафик в моем дампе, который находится между частными IP-адресами, я придумал следующее:
sudo tcpdump -n '
(not
(
(src net 172.16.0.0/20 or src net 10.0.0.0/8 or src net 192.168.0.0/16)
and
(dst net 172.16.0.0/20 or dst net 10.0.0.0/8 or dst net 192.168.0.0/16)
)
) and
(not
(
(dst net 172.16.0.0/20 or dst net 10.0.0.0/8 or dst net 192.168.0.0/16)
and
(src net 172.16.0.0/20 or src net 10.0.0.0/8 or src net 192.168.0.0/16)
)
)' -w test2.dump
Кажется довольно чрезмерным, но он также, кажется, работает, этот фильтр намного длиннее, чем должен быть, и есть лучший способ выразить эту логику, или что-то не так с фильтром?
Я запускаю встроенные tcpdump 4.0.0 и libpcap 1.0.0 в Mac OS X v10.6.2, и мне кажется, что это сойдет мне с рук:
'not (src net (10 or 172.16/12 or 192.168/16) and dst net (10 or 172.16/12 or 192.168/16))'
Я провел пару быстрых тестов, которые, похоже, сделали то, о чем вы просите: трафик, который был и из любой подсети частных адресов RFC 1918 был опущен, но был включен весь трафик, в котором одна или обе конечные точки имели общедоступный адрес.
Обратите внимание, что у вас была ошибка в исходном фильтре для сети 172.16. Вы переместили маску подсети на 4 бита в неправильном направлении. 172.16 - это на самом деле / 12, а не / 20, как вы написали. То есть 172.16.0.0 - 172.31.255.255 - это все частные адреса RFC 1918, тогда как ваш фильтр улавливал только 172.16.0.0 - 172.16.15.255.
Разве это не твой второй блок
(not
(
(dst net 172.16.0.0/20 or dst net 10.0.0.0/8 or dst net 192.168.0.0/16)
and
(src net 172.16.0.0/20 or src net 10.0.0.0/8 or src net 192.168.0.0/16)
)
)
такой же, как ваш первый блок, только в обратном порядке? Я бы сказал это and
это симметричная операция, поэтому разница не будет? (Это означает, что вы могли бы просто удалить второй блок.)