Вопрос с перехватом пакетов с интерфейса PPP - PullRequest
0 голосов
/ 23 ноября 2010

Я использую libpcap для захвата данных из интерфейса PPP и добавления фильтра следующим образом:

char filter_exp[] = "ip";   

Но когда я нюхал пакеты в функции обратного вызова, я обнаружил, что формат IP-пакета

не правильно, размер заголовка не 20 байт.

А когда я перехватываю пакеты из eth0, все нормально.

Так, кто может сказать мне, как получить правильные пакеты ip от интерфейса PPP посредством libpcap, спасибо!

Ответы [ 2 ]

2 голосов
/ 05 августа 2013

Но когда я нюхал пакеты в функции обратного вызова, я обнаружил, что формат IP-пакета неверен, размер заголовка не равен 20 байт.

Ваша функция обратного вызова используетрезультаты вызова pcap_datalink() на pcap_t, чтобы определить, как анализировать пакеты, или вы указали различные функции обратного вызова в зависимости от результатов pcap_datalink(), верно?

Если нет, вывероятно, предполагают, что пакеты будут иметь определенный тип заголовка канального уровня, что всегда неправильно.

Пакеты PPP не обязательно будут иметь тот же тип заголовка канального уровня, что и пакеты Ethernet (хотяв Windows с WinPcap они могут иметь одинаковый тип заголовка канального уровня!).Они также могут не иметь заголовка PPP;в частности, в Linux у них будет подготовленный Linux заголовок захвата , потому что, по крайней мере, в один момент ядро ​​ 1015 * будет отбрасывать заголовок PPP и поставлять no заголовок канального уровня, поэтому libpcap должен был сделать «готовый» перехват, чтобы получить тип протокола сетевого уровня.pcap_datalink() вернет DLT_LINUX_SLL, а не DLT_PPP, для устройств PPP в Linux, чтобы указать это.

0 голосов
/ 23 ноября 2010

PPP и IP - это совершенно разные протоколы. Если вы передаете дейтаграммы IP через PPP, то вы помещаете их в заголовок PPP с IP-пакетом в качестве полезной нагрузки. Вам нужно будет удалить информацию PPP из пакета, прежде чем он станет IP-пакетом.

...