Сколько контрольных сумм у пакета VPN? Зависит от обстоятельств
Число зависит от версий IP, переносимого протокола и формата защиты. Контрольные суммы заголовка, верхнего уровня и метки целостности различаются.
Утверждение, что пакет VPN несёт ровно две контрольные суммы, звучит аккуратно и достаточно часто неверно, чтобы его стоило разобрать. Число зависит от того, какие версии IP встречаются, какой транспортный протокол переносится и какой формат защиты использует туннель. Контрольная сумма заголовка, контрольная сумма верхнего уровня и криптографическая метка целостности — это три механизма с тремя областями охвата. Их подсчёт начинается с отметки того, что покрывает каждый из них.
Проверьте, какие версии IP действительно есть на линии
Заголовки IPv4 несут 16-битную контрольную сумму заголовка, а заголовки IPv6 не несут ничего подобного. Этот единственный факт меняет число для каждого туннеля, потому что упаковка IPv4 в IPv6 и IPv6 в IPv4 даёт разные документы. Туннель может нести оба семейства сразу, и тогда в одном направлении может быть поле, которого нет в другом. Установите версии, прежде чем что-либо считать.
Запишите раскладку как список заголовков, а не как картинку. Порядок важен при чтении записи, и наличие или отсутствие поля контрольной суммы — первое, что нужно отметить.
outer IPv6 | ESP | inner IPv6 | UDP | application data
outer IPv4 | ESP | inner IPv4 | TCP | application data
В первой строке нигде в её IP-заголовках нет контрольной суммы IP-заголовка, а во второй их две, когда оба заголовка — IPv4. Та же технология туннеля, другое число, и ни одна из строк не является полным форматом линии.
Проверьте, что покрывает каждая контрольная сумма
Охват — это та часть, которую люди пропускают, и именно она делает число осмысленным. Контрольная сумма заголовка IPv4 защищает заголовок и ничего больше, поэтому ничего не говорит о полезной нагрузке за ним. Контрольная сумма UDP поверх IPv6 покрывает псевдозаголовок, а также заголовок и полезную нагрузку UDP, то есть доходит до переносимого пакета, когда дейтаграмма туннелируется. У TCP есть собственная контрольная сумма с похожей зависимостью от псевдозаголовка. Это три разные области охвата, хотя все три называются контрольными суммами.
RFC 791 определяет проверку заголовка IPv4 и её пересчёт на каждом переходе, а RFC 8200 определяет обработку верхнего уровня поверх IPv6, включая псевдозаголовок. Ни один документ не говорит, что у пакета VPN фиксированное число контрольных сумм, потому что ни один не описывает туннель.
tshark -r capture.pcap -Y "ip.proto == 50" -V | grep -i checksum
Проверьте защиту целостности отдельно
Целостность ESP — это криптографическая защита с собственным охватом и представлением, зависящим от алгоритма. Это не контрольная сумма IP или UDP под другим именем, и её длина меняется в зависимости от выбранной конструкции. Проверка целостности покрывает определённую часть пакета, которая в зависимости от режима может включать заголовок ESP и часть полезной нагрузки. Считать её полем контрольной суммы известной ширины — именно там большинство таких объяснений рассыпается.
Прочитайте выбранную конструкцию, прежде чем считать байты, и опишите результат как защиту целостности, а не как контрольную сумму с другой меткой. Декодер назовёт поле, если вы его спросите.
tshark -r capture.pcap -Y esp -V | grep -iE "integrity|icv"
Проверьте точку наблюдения, прежде чем считать
Запись на внутреннем интерфейсе и запись на линии могут показывать совершенно разные уровни. На внутреннем интерфейсе туннель уже снят, поэтому вы видите переносимый пакет и ни одного из внешних заголовков. На линии вы видите внешние заголовки и зашифрованную полезную нагрузку, которую не можете прочитать. Ни один из видов не ошибочен, и это не виды одного и того же объекта. Укажите, где сделана запись, прежде чем приводить любое число.
sudo tcpdump -ni eth0 -vv -c 5 esp
sudo tcpdump -ni tun0 -vv -c 5
Первая команда показывает внешний пакет с его трейлером целостности, а вторая показывает переносимый пакет с его собственной транспортной контрольной суммой. Сложение чисел из обеих записей ничего не считает дважды, но объясняет один и тот же пакет дважды.
Сверьте число с реальной записью
Декодируйте один пакет полностью и отметьте каждое поле, которое декодер называет контрольной суммой или значением целостности. Затем сравните каждую отметку с записанной раскладкой и удалите те, что относятся к уровню, который вы на самом деле не считаете. Число, пережившее это упражнение, защитимо, а число, названное по памяти, — нет.
Повторите для направления ответа, потому что туннель, несущий оба семейства, может различаться по направлению и по потоку. Затем назовите число вместе с его охватом, например три контрольные суммы для этого внутреннего пакета в этой точке наблюдения, а не как свойство пакетов VPN вообще.
tshark -r capture.pcap -T fields -e ip.checksum -e udp.checksum -e tcp.checksum