Wireshark — это мощный инструмент анализа сетевых протоколов, который может захватывать и анализировать пакеты данных в сети. В этой статье будет подробно описано, как использовать точные правила фильтрации Wireshark, чтобы помочь пользователям точно извлекать необходимые пакеты данных из больших пакетов данных, чтобы более эффективно проводить устранение неполадок в сети и анализ безопасности.
Эта статья состоит из двух частей. В первой части представлены методы фильтрации полей Wireshark, а вторая часть посвящена различным сценариям применения для анализа случаев. Wireshark поддерживает более 3000 протоколов и более 240 000 полей фильтров. Поэтому в этой статье невозможно охватить каждый из них. Однако метод фильтрации тот же. Фильтруйте то, что необходимо.
Ни одно учебное руководство не может превзойти официальную документацию. Читателям, желающим получить более глубокое и полное представление о Wireshark после прочтения этой статьи, настоятельно рекомендуется прочитать официальное руководство по документации:
имя файла | Ссылка на документацию |
---|---|
wireshark-filter(4) Manual Page | |
Wireshark User’s Guide | |
Страница загрузки документа |
в то же время,Вы можете существовать в Wireshark, используя команду фильтра.,То же самое можно использовать и в существовании Tshark.,Tshark — официальный компонент Wireshark.,Можно понимать как CLI-версию Wireshark.,Wireshark и Tshark — это инструменты, основанные на библиотеке libpcap.,Используйте один и тот же синтаксис фильтрации,Это называется pcap-фильтр. Чтобы узнать о случаях использования Tshark,Вы можете обратиться к авторуЭта статья。
После раскрытия сообщения любое поле, по которому вы щелкаете мышью, может использоваться в качестве условия фильтрации. Например, при щелчке мышью по полю «Порядковый номер» в левом нижнем углу отобразится соответствующий синтаксис фильтрации поля:
Вам даже не нужно вводить это условие фильтра вручную, просто перетащите его с помощью мыши в верхнее поле фильтра:
То же самое касается любых других полей.
существовать Вид --> Внутренности --> Поддерживаемые протоколы (Поддерживаемые Протоколы), чтобы просмотреть все поддерживаемые протоколы, введите в поле поиска поле, в котором вы хотите выполнить поиск:
Будут отображены все соответствующие поля протокола. Даже если подполе протокола соответствует содержимому поиска, оно будет отображено. Например, при поиске DNS будьте осторожны и не нажимайте Enter. Через несколько секунд будут выведены результаты:
Обычно при анализе протокола и устранении неполадок сначала необходимо понять нормальное поведение протокола при взаимодействии и роль каждого поля сообщения, чтобы можно было дополнительно фильтровать ненормальные запросы взаимодействия и ответные сообщения.
Оператор | C-образный стиль | описывать | Пример |
---|---|---|---|
and | && | логическое И | ip.src==10.0.0.5 and tcp.flags.fin==1 |
or | || | логичный или | ip.src==10.0.0.5 or ip.src==192.1.1.1 |
xor | ^^ | Логическое исключающее ИЛИ | tr.dst0:3 == 0.6.29 xor tr.src0:3 == 0.6.29 |
not | ! | логическое отрицание | ! udp |
... | Не участвует | дочерний заказ/кусочек Оператор | eth.src:4 == 00:00:83:00 |
in | Не участвует | Установить членов коллекции | http.request.method in {"HEAD", "GET"} |
Примечание. Логический оператор чувствителен к регистру и должен быть в нижнем регистре. Для или используйте C-образный. Как написать стиль.
Три основные операции AND, или и Non не будут здесь подробно описываться.,Вы можете обратиться к Примеру в приведенной выше таблице.,В основном говорим о различияхили、дочерний заказ、Коллекция из трех типов Оператора.
Если и только если одно из условий выполняется, и оба условия не могут быть выполнены одновременно, это истинно, и соответствующие пакеты данных отфильтровываются.
Например, следующее выражение:
ip.addr == 192.168.1.1 xor ip.addr == 10.10.0.100
Фильтровать пакеты с IP-адресом 192.168.1.1 или пакеты с ip.addr 10.10.0.100, но не может одновременно соответствовать обоим условиям, то есть интерактивные запросы между 192.168.1.1 и 10.10.0.100 не будут сопоставлены. Да, но. их взаимодействие с другими IP-адресами может нормально совпадать.
Аналогично использованию массива или использованию срезов в Python.
Например, в следующем примере метод HTTP-запроса фильтруется, а первые три символа представляют собой сообщения GET:
http.request.method[0:3]=="GET"
Или первые три цифры указанного исходного Mac-адреса могут быть:
eth.src[0-2] == 38:22:d6
существуют В зависимости от условий фильтра,Пока он соответствует элементам в коллекции,Все совпадает.
Фильтровать несколько IP-адресов одновременно, что может быть:
ip.addr in {192.168.1.99,10.1.1.254,10.2.1.253}
В сочетании с вышеизложенным и логикой Оператора фильтруются только запросы SYN:
ip.addr in {192.168.1.99,10.1.1.254,10.2.1.253} && tcp.flags.syn==1 && tcp.flags.ack==0
Таким же образом, если вы хотите фильтровать пакеты с нескольких портов одновременно и не получать пакет второго подтверждения SYN-ACK узла в потоке TCP, вы можете сделать следующее:
tcp.port in {80,8080,443} && tcp.completeness.syn-ack==0
Вы можете видеть, что только порты 443 и 8080 соответствуют условиям фильтрации. Тестируемый одноранговый сервер не прослушивал эти два порта, поэтому он ответил RST-ACK.
Использование наборов также может быть непрерывным, например фильтрация порта 443 и портов 4430~4434:
tcp.port in {443, 4430..4434}
Или диапазон IP-адресов:
ip.addr in {10.0.0.5 .. 10.0.0.9, 192.168.1.1..192.168.1.9}
Оператор | Псевдоним | C-образный стиль | описывать | Пример |
---|---|---|---|---|
eq | any_eq | == | равный | ip.src == 10.0.0.5 |
ne | all_ne | != | не равен | ip.src != 10.0.0.5 |
all_eq | === | конгруэнтный | ip.src === 10.0.0.5 | |
any_ne | !== | Недостаточность и т. д. | ip.src !== 10.0.0.5 | |
gt | > | больше, чем | frame.len > 10 | |
lt | < | меньше, чем | frame.len < 128 | |
ge | >= | больше или равно | frame.len ge 0x100 | |
le | <= | меньше или равно | frame.len <= 0x20 | |
contains | Протокол, поле или срез содержат значение | sip.To contains "a1762" | ||
matches | ~ | Сопоставьте протокол или текстовое поле с помощью регулярного выражения Perl (PCRE) | http.host matches "acme\.(org|com|net)" |
Выше равный, не равный, больше, чем, меньше, чем, больше, чемравный, меньше, Вместо того, чтобы знакомить с базовыми Операторами, такими как чемравный, мы представим несколько необычных, но очень полезных Операторов.
Разница между равным (==) и конгруэнтным (===):
Например, в следующем примере фильтруются запросы с номером TCP-порта 80:
tcp.port == 80 # Как написать равенство
tcp.port === 80 # Как написать конгруэнтный
тот же пакет,использоватьравный(==)можно отфильтровать Порт источника и назначение — 80 сообщений,использоватьконгруэнтный(===)будет соответствовать источнику и назначениюиз Портыдля80изсообщение。
Поскольку порты источника и назначения,После того, как вышеуказанные условия фильтра записаны,,Все они относятся к полям, которые необходимо проверить в tcp.port.,и==、===Сопоставьте и отфильтруйте в соответствии с их неплотностью.。
Например, в следующем примере IP-адрес источника и назначения фильтрации должен находиться в сегменте сети 10.0.0.0/8:
ip.addr === 10.0.0.0/8
Приведенное выше соответствующее утверждение предусматривает, что IP-адреса источника и назначения должны находиться в сегменте сети 10, что эквивалентно:
ip.src==10.0.0.0/8 && ip.dst==10.0.0.0/8
Как следует из названия, взяв в качестве примера указанный выше отфильтрованный номер порта, если одно из отфильтрованных полей не равно, то условие выполнено.
Например, следующее условие фильтра:
tcp.port !== 80
контрастравный(==),Нетконгруэнтный(!==)Исключается ситуация, когда порты источника и назначения оба80ситуация,рама как размер,Порт источника и назначения,Может удовлетворить только один — 80.
Если вы хотите отфильтровать, содержит ли поле указанную строку, вы можете использовать contains.
Например, в TCP-соединении для запросов, содержащих строку «изображение», метод фильтрации может быть следующим:
tcp contains "tcp"
Конечно, вы можете заменить tcp любым протоколом или полем, например: udp содержит, Frame содержит, http содержит. Обязательным типом данных является строка, поэтому tcp.port и ip.addr не могут использовать contains.
Например, если имя хоста фильтрации http-запросов — youtube.com, оно может быть:
http.host contains "youtube.com"
Фильтрация DNS-запросов, содержащих cloud.tencent.com, может осуществляться следующим образом:
dns.qry.name contains "cloud.tencent.com"
Или вы можете напрямую фильтровать данные полезной нагрузки, например, nping инициирует обнаружение протокола UDP и отправляет тестовую строку «test»:
nping --udp -p 2115 --data-string "test" 192.168.1.72
Сервер слушает порт 2115 udp и отвечает на то, что получает:
socat -v udp-l:2115,fork exec:'/bin/cat'
Тест, содержащий полезную нагрузку, можно обычно фильтровать с помощью следующих двух операторов:
udp contains "test"
udp.payload contains "test"
Режим сопоставления поддерживает регулярное выражение Perl (PCRE), соответствующее протоколу или текстовому полю, которое является более гибким, чем содержит.
Пример 1,Фильтровать запросыURIСодержитmsfнитьиз.comвеб-сайт:
http.request.full_uri matches ".*msf[a-z]+.com"
Пример 2,Фильтрация клиентов при подтверждении TLS Доменное имя на этапе приветствия должно начинаться с символа v и заканчиваться на microsoft.com:
tls.handshake.extensions_server_name ~ "^v.*microsoft.com$"
Пример 3,Фильтрация в протоколе DNS,Соответствующие сообщения с трех веб-сайтов:
dns matches "windows.com|microsoft.com|bing.com" Можно написать #dns как dns.qry.name.
кроме,ты можешьиспользоватьбыстрая клавишаCtrl + Fчтобы открыть окно поиска,Поддержка обычного, шестнадцатеричного, строкового, фильтра,И вы можете установить, чувствителен ли регистр,Поиск не поможет вам фильтровать сообщения,Искать каждые,В порядке сверху вниз,Каждый раз находится кадр данных, соответствующий требованиям.
Иерархия Оператор(#)за которым следует десятичное число,Поля могут быть ограничены определенным уровнем в стеке протоколов.
Например, следующий пакет VXLAN инкапсулирует внутренний IP-заголовок через UDP, а также IP-заголовок, который поставляется с самим пакетом, поэтому существует два уровня: внутренний и внешний:
В настоящее время я хочу отфильтровать IP-адрес внутреннего уровня (второй уровень).,Затем вы можете добавить уровень Оператор#2,Например, отфильтруйте пакеты с внутренним IP-адресом 10.120.9.130.,И порт назначения TCP составляет 51801 пакет.,Это можно написать так:
ip.dst#2 == 10.120.9.130 && tcp.dstport == 51801
Если вы хотите отфильтровать исходный IP-адрес первого уровня, вы можете использовать ip.src по умолчанию или добавить # 1. В сочетании с совпадающими символами, упомянутыми выше, внешний источник и пункт назначения должны находиться в сегменте сети 10. Вы можете. да:
ip.src#1 == 10.120.9.130 && tcp.dstport == 51801 && ip.addr#2 === 10.0.0.0/8
Инкапсуляция GRE такая же. Например, в следующем сообщении GRE также инкапсулирует уровень IP-заголовка, а также IP-заголовок, который поставляется с исходным сообщением, поэтому существует два уровня интрасети:
В сочетании с упомянутым выше соответствием Оператор(~)иконгруэнтный Оператор(===),Отфильтруйте внешние IP-адреса источника и назначения, чтобы они находились в сегменте сети 10, или начните с сегмента сети 11.,В то же время внешний IP-адрес источника и IP-адрес назначения находятся в сегменте сети 10.,Тогда это может быть:
string(ip.addr) ~ "^10|^11" && ip.addr#2 === 10.0.0.0/8
Сюда кладем внешний слойip.addrтип данных переданstring()функция Конвертироватьдля Понятнонить,Затем сопоставьте регулярное выражение, сопоставив Оператор.
То же самое касается IPIP, который разделен на внутренние и внешние IP-заголовки. Структура следующая:
Во-первых, мы существуем в Wireshark, фильтруя инкапсулированные пакеты IPIP. Вы можете использовать следующий синтаксис:
ip.proto == 4
Из синтаксиса фильтрации нетрудно увидеть, что инкапсуляция IPIP ( IP Encapsulation within IP) находится в протоколе № 4.,Числовой порядковый номер, соответствующий протоколу,Можно обратиться кОрганизационная документация IANA。фильтрприезжатьIPIPсообщениеназад,Далее заголовки IP на разных уровнях можно использовать для фильтрации пакетов, соответствующих требованиям.
Например, чтобы отфильтровать запросы, внутренний IP-заголовок которых содержит 10.0.0.2 и является записью DNS A, это может быть:
ip.proto == 4 && ip.addr#2 == 10.0.1.4 && dns.qry.type == 1
Wireshark поддерживает множество функций преобразования, см. таблицу:
функция | описывать |
---|---|
upper | Преобразовать строковое поле в верхний регистр |
lower | Преобразовать строковое поле в нижний регистр |
len | Возвращает длину строкового или байтового поля в байтах. |
count | Возвращает количество вхождений поля в кадр. |
string | Преобразовать нестроковое поле в строку |
vals | Преобразование значения поля в его строку значения (если есть) |
dec | Преобразовать целочисленное поле без знака в десятичную строку |
hex | Преобразовать целочисленное поле без знака в шестнадцатеричную строку |
max | Возвращает максимальное значение параметра |
min | Возвращает минимальное значение параметра |
abs | Возвращает абсолютное значение параметра |
Вышеупомянутые функции не приведены в примерах по отдельности, но описаны некоторые из наиболее часто используемых функций.
Вы можете использовать эти две функции для преобразования строки в верхний и нижний регистр, а затем выполнять регулярное сопоставление, чтобы добиться нечувствительности к регистру.
Например, чтобы отфильтровать поле сервера заголовка HTTP-ответа для Apache, это может быть:
lower(http.server) ~ "apache"
Отфильтруйте метод HTTP-запроса как POST или GET:
upper(http.request.method) ~ "post|get"
len()функция вернет размер поля в байтах,Поэтому его можно использовать вместе с Оператором.,Отфильтруйте пакеты, поля которых соответствуют требованиям к размеру.
Фильтрация поля URI заголовка http. Сообщения размером больше или равными 10 байтам могут быть:
len(http.request.uri) >= 10
Фильтруйте пакеты с именами хостов HTTP, превышающими или равными 20 байтам:
len(http.host) >= 20
Она используется чаще. Если поле имеет нестроковый тип и вы хотите преобразовать его в строковое поле для регулярного сопоставления, функция string() очень поможет.
Например, чтобы отфильтровать IP-адреса, начинающиеся с сегмента сети 10 или с сегмента сети 23, это может быть:
string(ip.addr) ~ "^10|^11"
Фильтровать нечетные кадры, т.е. кадры, заканчивающиеся на 1/3/5/7/9:
string(frame.number) ~ "[13579]$"
Таким же образом фильтрация пакетов, исходный порядковый номер которых является нечетным числом, а бит флага равен SYN, может быть выполнена следующим образом:
string(tcp.seq_raw) ~ "[13579]$" && tcp.flags.syn==1 && tcp.flags.ack==0
Сопоставить IP-адреса, оканчивающиеся на 255 в IP-адресе назначения (от 172,16 до 172,31):
string(ip.dst) matches r"^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.255"
Функции max() и min() принимают любое количество параметров одного типа и возвращают наибольший/наименьший параметр в наборе соответственно.
Фильтруйте TCP-порт источника и порт назначения, а максимальное количество пакетов не может превышать 1024:
max(tcp.srcport,tcp.dstport) <= 1024
Фильтровать пакеты с портом источника TCP + портом назначения, большим или равным 1024:
min(tcp.srcport+tcp.dstport) >= 1024
формадля${proto.field}из Выражениедля Поле Цитировать。其ценить从鼠标选приезжатьизв текущем кадреизсоответствующий Полечитать。это сборкадинамический фильтризметод。
Например, следующий пример,Сначала я прохожуфильтрзаявлениеdns.a
фильтрмногоDNSсообщение,В это время я выделил мышкой первый кадр:
dns.a # Смысл этого оператора заключается в фильтрации поля адреса в ответном сообщении DNS.
Запись разрешения, возвращаемая ответом DNS первого кадра, следующая: IP-адрес 10.85.15.101.
После выполнения вышеуказанного действия,Wireshark действительно разместил указанный выше IP-адрес,Ссылка на задание дана${dns.a},На данный момент мы процитируем это,Фильтровать http-запросы,иIP-адрес назначениядля我们刚刚鼠标点选Цитироватьиз Полеценить:
http && ip.dst eq ${dns.a}
Вы можете видеть, что HTTP-запросы, соответствующие требованиям, фильтруются.
На этом этапе мы снова нажимаем Enter:
Вы обнаружите, что возврат на этот раз пуст.,потому чтодля Цитировать一次назад${dns.a}будет очищен,Чтобы продолжить цитирование,затем используйтеdns.aоператор и повторный выбор мыши.。
выше${}Этот способ записи аналогиченbashвнутрииз Переменная запись,Затем разверните его,Вы также можете ссылаться на несколько переменных одновременно,напримерв то же времяиспользоватьip.addrиtcp.portдвафильтр Поле:
ip.addr == 10.8.15.101 && tcp.port == 80
В этот момент кликаем по кадру мышкой.
Затем создайте ссылки на переменные и фильтруйте только http:
ip.addr == ${ip.addr} && tcp.port== ${tcp.port} && http
Мы получили нужные данные в обычном режиме.
Нажмите Анализировать --> Выражение фильтра отображения (Display Filter Expression) 可以进入приезжатьфильтрстраница выражения,существование Здесь вы можете искать любой протокол или поле по вашему желанию.,И кликните мышкой, чтобы выбрать нужное вам выражение,Wireshark поможет вам написать полное заявление.
напримерпоискdns.a,Появится весь полный текст, соответствующий протоколу или полю dns.a:
На этом этапе мы нажимаем на первый из них, то есть dns.a, и вы можете выбрать символ связи в правом верхнем углу:
Затем в разделе существующего значения просто напишите значение поля IP, которое нужно фильтровать:
После нажатия кнопки «ОК» и «Ввод» будет применен этот оператор фильтра:
То же самое относится и к любому другому протоколу или методу фильтрации полей.
Например, вы хотите отфильтровать пакеты SYN при первом подтверждении TCP.,И эта функция часто используется,Этот оператор фильтра необходимо добавить в виде кнопки.,Удобно применить это утверждение при следующем щелчке мыши.,Не нужно каждый раз вводить вручную,Это особенно полезно для более длинных операторов и операторов с более сложной логикой.
Во-первых, четко отфильтруйте оператор фильтрации, соответствующий пакету SYN в первом подтверждении TCP:
tcp.flags.syn==1 && tcp.flags.ack==0
Затем добавьте кнопки пользовательских фильтров в указанном порядке:
НажмитеOKназад可以看приезжать右边多出来一个我们自定义изкнопка метки:TCP SYNS:
Каждый раз, когда вы запускаете его, Wireshark автоматически применяет определенный нами оператор фильтра.
Например, сценарий ICMP,Когда вы хотите открыть сообщение,Он может четко отображать время пинга каждого пакета.
Сначала вам нужно найти поле времени ответа ICMP, развернуть сообщение «Ответ ICMP» и найти поле «Время ответа»:
Щелкните правой кнопкой мыши поле, а затем щелкните его правой кнопкой мыши. --> Применить как столбец (Применить as Column):
После этого в дальнем правом углу сообщения вы увидите дополнительный столбец: Время ответа. Перетаскиваем его на заметную часть посередине, чтобы в каждом ответном пакете ICMP отображалось свое время:
Здесь не приводятся примеры. С помощью этого метода поля любого протокола можно применять в качестве столбцов, что позволяет Wireshark более интуитивно отображать ключевые поля, на которых мы хотим сосредоточиться.
Исходный порядковый номер (поле: tcp.seq_raw) также называется абсолютным порядковым номером. По умолчанию порядковые номера, отображаемые Wireshark, представляют собой относительные порядковые номера с каждым потоком TCP в качестве измерения (например, последовательность первого подтверждения SYN). начинается с 0 (расчет), а порядковые номера seq в реальных взаимодействиях являются исходными порядковыми номерами и не начинаются с 0, поэтому использование относительных порядковых номеров не способствует двухточечному, сквозному или полноканальному анализу. того же потока TCP.
В это время вы можете существовать редактировать(Edit)--> Предпочтения(Preferences)--> Протоколы --> TCP На странице снимите флажок Относительный серийный номер (Относительный серийный номер). sequence numbers):
После нажатия приложения,Вы можете видеть, что все отображаемые последовательности являются оригинальными.,Последующий анализ конвекции можно отфильтровать и сопоставить с исходной последовательностью.
Wireshark будет находиться в самой левой части кадра, отмечая кадры запроса (→) и кадры ответа ( ←) символами стрелок:
Это особенно полезно для пакетов, длина кадра которых слишком велика и усекается, поэтому невозможно определить, какой кадр является кадром запроса или ответа, как в следующем примере:
Если вы не смотрите на символ стрелки,Нелегко интуитивно определить, какой кадр является HTTP-запросом.,Wireshark отмечает это по умолчанию.,Кадр 4 — это запрос,Кадр 11 — это ответ,Предполагается, что мышь должна выбрать кадр запроса.илиответный кадр,WiresharkТолько тогда рамка запроса будет для вас полностью размечена.иответный кадр。
То же самое касается DNS и ICMP. Например, если вы выберете один из запросов DNS с помощью мыши, Wireshark одновременно отметит ответы, соответствующие выбранному запросу, символами стрелок.
Используйте следующий оператор фильтрации, чтобы отфильтровать HOST запроса HTTP и имя хоста запроса на этапе приветствия клиента в ходе установления связи TLS:
tls.handshake.type == 1 || http.request
HTTPЗапросить доменное имясуществоватьhttp.hostв пределах поля,TLS/HTTPSЗапросить доменное имясуществоватьclient Поле расширения SNI на этапе приветствия отображается, поэтому, как показано на рисунке выше, эти два поля можно использовать в качестве столбцов, а имя домена запроса, передаваемое в сообщении HTTP/HTTPS/TLS, можно увидеть более четко.
Нам бы хотелось знать о сообщениях с кодами состояния HTTP-ответа 4xx и 5xx. Вы можете сделать это:
string(http.response.code) ~ "^4[0-9]{2}$|^5[0-9]{2}$"
первыйиспользоватьstring()функция ВоляHTTPкод состояния Поле Конвертироватьдлянитьтип,Затем используйте PCRE для сопоставления кода состояния 4xxи5xx.
Если вы хотите ограничить поиск несколькими фиксированными кодами состояния, это еще проще:
http.response.code in {403,404,502,503,504}
Если это сообщение, зашифрованное HTTPS/TLS, вы хотите отфильтровать код состояния.,Этот метод не работает,Поскольку данные зашифрованы, после рукопожатия не видно полей с открытым текстом.,Если соответствующие поля не фильтруются после расшифровки,Как расшифровать можно посмотретьЭта статья。
Фильтровать запросы, которые не прошли первое рукопожатие и не получили ответ SYN-ACK, который может быть:
tcp.completeness.syn==1&&tcp.completeness.syn-ack==0&&tcp.completeness.ack==0&&tcp.completeness.data==0&&tcp.completeness.fin==0
tcp.completeness.syn-ackЭто заявление,используется дляфильтрсуществование TCP-соединенияиз Он закрыт в положении флага?syn-ackизсообщение,То же самое относится и к другим флагам,Официальная документацияиз Объяснено ниже:
TCP Conversation Completeness
TCP conversations are said to be complete when they have both opening and closing handshakes,
independently of any data transfer. However, we might be interested in identifying complete
conversations with some data sent, and we are using the following bit values to build a filter value
on the tcp.completeness field :
• 1 : SYN
• 2 : SYN-ACK
• 4 : ACK
• 8 : DATA
• 16 : FIN
• 32 : RST
Вы можете увидеть полное сообщение ниже. Соединение было фактически отклонено RST-ACK, поскольку порт целевого сервера не прослушивается:
А если мы просто отфильтруем пакеты с Syn, равным 1, и ack, равным 0:
tcp.flags.syn==1 && tcp.flags.ack==0
Эта логика просторама как размер,Пока флаг SYN равен 1,И флаг ACK равен 0 пакетам,будет отображаться,Не существует понятия TCP-потока/TCP-сеанса.,Некоторые сцены также могут быть отфильтрованы.,Но больше рекомендуетсяtcp.completeness.xxxзаявление,Более точные требования к попаданию.
Следующие методы можно использовать для фильтрации сообщений о таймауте TCP или повторной передаче о потере пакетов:
tcp.analysis.retransmission
Вы также можете добавить ограничивающее условие для фильтрации повторно передаваемых пакетов TCP с разницей во времени, большей или равной 0,2 с:
tcp.analysis.retransmission && tcp.time_delta >= 0.2
Сначала щелкните любой кадр TCP, найдите поле временной метки, щелкните правой кнопкой мыши «Время». since previous frame in this TCP Поле «поток» (означает время относительно предыдущего кадра в потоке TCP) --> Применить как столбец (Применить as Column):
Затем перетащите поле туда, где его можно увидеть:
Щелкнув это поле, вы отсортируете пакеты от больших к меньшим, снизу вверх за считанные секунды:
Нажмите еще раз, чтобы отсортировать сообщения от меньшего к большему.
Найдя аномально трудоемкий кадр и щелкнув правой кнопкой мыши, чтобы отследить поток, не забудьте перезагрузить пакет и восстановить его последовательность пакетов:
В противном случае это поле все равно будет отсортировано по размеру.
Если вы хотите фильтровать сообщения с этим полем, превышающим определенный интервал времени, например, если интервал кадров превышает 100 секунд, вы можете использовать:
tcp.time_delta >= 100
Сначала примените поле, требующее времени ответа ICMP, в виде столбца. О том, как работать, см. выше. 2.9 часть.
Затем фильтруйте только запросы ответа icmp:
icmp.type == 0
Вы можете видеть, что в поле «Время ответа» интуитивно указано время RTT каждого ответного сообщения icmp.
Щелкните это поле дважды, чтобы отсортировать его от большого к меньшему, какой пакет занимает больше всего времени, можно увидеть более интуитивно:
Далее, если вы хотите фильтровать запросы, которые занимают более 8,5 мс, вы можете сделать:
icmp.resptime >= 8.5
Взяв в качестве примера первый ответ ICMP длительностью 9,139 миллисекунды, если вы хотите отфильтровать соответствующее ответное сообщение запроса + ответа ICMP, вы можете:
icmp.seq == 1 && icmp.ident == 8
Это может сделать одно утверждение:
icmp.resp_not_found
Видно, что пинг внутреннего публичного DNS 114 не получил ответа, что не исключает возможности запрета пинга с противоположного конца.
Сначала найди DNS responseизсообщение,展开назад找приезжать最底下изdns.timeПоле,Щелкните правой кнопкой мыши Применить к столбцу.,Вы также можете узнать, как работатьвыше 2.9 Фестиваль.
После применения в качестве столбца,Фильтровать запросы Вы можете написать напрямуюdns.time,Затем дважды щелкните столбец, который мы только что добавили:
Вы можете видеть, что время ответа DNS было отсортировано от большего к меньшему.
dns.timeПолеиз Единица измерения – секунды,Фильтрация ответов DNS, которые занимают более 50 мс, может осуществляться следующим образом:
dns.time > 0.05
Это может сделать одно утверждение:
dns.count.answers == 0
Ни один из этих запросов не был разрешен по адресу, а количество возвращенных записей было равно 0:
Вы можете отслеживать DNS-запрос и соответствующий ответ на основе поля dns.id. Например, отслеживайте следующие два поля dns.id:
dns.id in {0xdca1,0xe724}
Фильтруйте доменные имена, разрешенные DNS, например cloud.tencent.com, которые могут быть:
dns.qry.name == "cloud.tencent.com"
Поскольку тип данных этого поля принадлежит к строковому типу, в сочетании с упомянутым ранее обычным сопоставлением для сопоставления нескольких доменных имен, соответствующих требованиям, это может быть:
dns.qry.name ~ "bing.com$|microsoft.com$"
Я считаю, что многие люди сталкивались при посещении веб-сайта с такими ошибками, как «пир отказался от соединения», «ERR_CONNECTION_REFUSED», «соединение было сброшено» и другими ошибками:
Мы могли бы также проанализировать пакеты в этом сценарии:
Трехстороннее рукопожатие успешно установлено.,На этом этапе клиент отправляет запрос GET.,Узел ответил RST-ACK для отключения.,в то же время,TTL SYN-ACK, отправленного партнером, равен 112.,ip.id — 99537,И TTL RST-ACK вдруг становится 253,ip.id становится 256,Это очевидно,Это сообщение RST-ACK не было активно отправлено со стороны однорангового узла.。Так кто отправит?из?Есть несколько возможностей:
В сценарии этого типа, если нет проблем с регистрацией и нет стены безопасности между узлом и этим сегментом, рекомендуется сообщить о проблеме местному оператору или связаться с поставщиком услуг узла, чтобы сообщить об этой проблеме.
Я считаю, что, имея так много упомянутых выше методов, вы уже можете следовать этому примеру, чтобы найти соответствующие поля и выполнить фильтрацию диапазона.
Обычно для фильтрации измерения времени используется пекинское время (frame.time). Конечно, вы также можете использовать время UTC (frame.time_utc) и время UTC, соответствующие следующим двум полям времени:
После фильтрации в течение определенного времени:
frame.time >= "2024-10-20 03:45:00"
Фильтровать по определенному диапазону времени:
frame.time >= "2024-10-20 03:45:00" && frame.time <= "2024-10-20 03:45:30"
Фильтрация 1024~10240 кадров может быть:
frame.number >= 1024 && frame.number <= 10240
Эта функция требует, чтобы Wireshark настроил библиотеку IP-адресов для реализации,Как настроить Вы можете обратиться к авторуЭта статья,И есть более подробная информация об использовании фильтрации полей библиотеки адресов.,Ниже приведены лишь два наиболее часто используемых примера.
Чтобы фильтровать TCP-пакеты из указанной страны, например, чтобы фильтровать TCP-пакеты с IP-адресом в США, это может быть:
ip.geoip.country == "United States" && tcp
Конечно, это также может быть измерение города. Например, чтобы фильтровать только запросы с местоположением в Лос-Анджелесе или Чикаго, вы можете написать так:
ip.geoip.city in {"Los Angeles","Chicago"}
Фильтрация по номеру AS аналогична описанному выше методу фильтрации, просто найдите соответствующее поле фильтра.
Фильтрация запросов SYN для определенного номера AS:
ip.geoip.asnum == 20326 && tcp.flags.syn==1
Фильтрация UDP-пакетов в определенном диапазоне номеров AS:
ip.geoip.asnum >= 20000 && ip.geoip.asnum <= 21000 && udp
Определение повторного использования TCP-порта в Wireshark:
То есть, когда пакет с флагом SYN в файле захвата пакетов (исключая SYN-ACK) имеет существующий сеанс с использованием того же адреса и порта, а последовательность отличается от начальной последовательности существующего сеанса, SYN будет Сообщается, что документ помечен для повторного использования порта.
Исходя из этого определения, даже в сообщении TCP stream SYN 1 использует набор IP-адресов и портов источника и назначения, а также TCP этого пакета. stream SYN 100 также использует этот набор IP-адресов источника и назначения и портов. Даже если два потока находятся на расстоянии тысяч миль друг от друга, даже если существует разрыв в один год или десять лет, пока появляется один и тот же файл захвата пакетов. Wireshark может по определению поставить тот TCP, который появится позже stream Отметка SYN 100 означает повторное использование порта.
Например, следующий пример:
Кадр 49 и 83,Сообщение SYN существует в разных потоках TCP.,Используйте один и тот же исходный IP-адрес, IP-адрес назначения, порт источника и порт назначения.,Итак, SYN, который появится позже,Wireshark отмечает повторное использование портов.
Хотя повторное использование порта по умолчанию отмечено в Wireshark красным и черным, это не указывает на неисправность, а напоминает пользователю о повторном использовании порта. В основном это зависит от того, отклонит ли партнер запрос. Если он не отклонит запрос, он может нормально обработать ответ SYN-ACK. Если он отказывается или не отвечает, вам необходимо проверить, отключил ли партнер быструю перезапуск TCP или другие возможные конфигурации, что в основном зависит от ответа партнера. .
Чтобы отфильтровать повторное использование портов, вы можете использовать следующий оператор фильтра:
tcp.analysis.reused_ports
Определение TCP Keep-Alive от Wireshark:
То есть следующие три условия должны быть выполнены одновременно, прежде чем он будет помечен как TCP Keep-Alive:
Синтаксис фильтрации таких пакетов:
tcp.analysis.keep_alive || tcp.analysis.keep_alive_ack #Поместите сюда поддержку активности также добавляются пакеты возврата ack
Видно, что все отфильтрованные пакеты подтверждения активности одновременно удовлетворяют трем вышеуказанным условиям. Когда длина сегмента равна 1, заполненные данные равны 0, что соответствует шестнадцатеричному значению 0x00, что указывает на то, что это пустой сегмент данных. Почему установлено значение 1? Протокол TCP требует, чтобы каждый сегмент данных содержал не менее 1 байта полезной нагрузки. Установка длины в 1 байт гарантирует, что пакет обнаружения соответствует этому требованию, что не только экономит накладные расходы, но также обеспечивает возможность обновления времени поддержания активности сеанса. (обязательно здесь) В отличие от длинных соединений HTTP Keep-Alive).