Натоварване на IPsec: режимът, NAT-T и алгоритмите го променят
Една публикувана стойност за натоварването описва една инкапсулация по един път. Съберете заглавките, които вашият тунел действително договаря, и после измерете пътя.
Някъде в някое ръководство има число, обикновено между шестдесет и осемдесет байта, което някой е извадил от 1500, за да получи MTU на интерфейса. Това число описва една конкретна инкапсулация по един конкретен път. Сменете режима, външното семейство адреси, шифъра или наличието на NAT и сметките вече не важат за вашия тунел.
Числото идва от друг тунел
Натоварването не е свойство на IPsec по принцип. То е свойство на пакета, който действително се изгражда: договорен режим, външна заглавка, заглавка за защита, подпълване, поле за цялост и евентуално допълнителна UDP обвивка.
Стойност, цитирана за транспортен режим с IPv4 и без NAT, описва по-малък пакет от тунелен режим с IPv6 при преминаване през NAT. И двете са верни за своя случай. Копирането на която и да е от тях в друго внедряване е начинът, по който хората се сдобиват с MTU, който чупи големите преноси. Отказът е тих, защото малките заявки продължават да работят.
Съберете слоевете, които наистина ги има
Започнете от външната IP заглавка и вървете навътре. В тунелен режим оригиналният пакет е отвътре, така че външната заглавка е добавка, а не замяна. RFC 4303 описва заглавката на ESP, подпълването и данните за цялост, които я следват.
| Layer | What it adds | When it applies |
|---|---|---|
| Outer IP header | 20 bytes for IPv4, 40 for IPv6 | Always, and 40 rather than 20 if the outer path is v6 |
| ESP header | 8 bytes of SPI and sequence number | Always |
| Block cipher IV | 8 to 16 bytes depending on the transform | When the negotiated cipher uses one |
| Padding and trailer | Padding to the block size, plus two trailer bytes | Always, and the amount varies with payload length |
| Integrity data | 12 to 16 bytes for common authenticated ciphers | When integrity protection is negotiated |
| UDP encapsulation | 8 bytes | NAT traversal on port 4500, which is common for clients behind NAT |
Нито един от тези редове не е постоянен между внедряванията, а редът за подпълване не е постоянен дори в едно внедряване. Точно затова една публикувана стойност за натоварването разочарова.
Два обекта могат да не са съгласни за един и същ тунел
Защитеният пакет все още трябва да премине външния път, а външният път не е еднакъв навсякъде. PPPoE линията за достъп носи по-малко от чист Ethernet сегмент. Мобилната мрежа може да се свие още, а доставчик, който тунелира собствения си трафик, добавя още една инкапсулация, за която никой не е споменал. Тунел, който работи на една връзка и се проваля на друга, описва втората връзка, а не протокола.
И двете посоки могат да се различават. Асиметричен маршрут може да ви даде работещо качване и застинало сваляне, което изглежда като проблем на приложението, докато не погледнете размерите на пакетите, а не достъпността. Успешният малък ping доказва много малко за отговор в пълен размер.
Измерете, вместо да изваждате
Намерете най-голямата дейтаграма, която оцелява по пътя. После я сравнете със стойността, която интерфейсът съобщава:
ip link show eth0 | grep -o 'mtu [0-9]*' ip xfrm state list ping -M do -s 1400 198.51.100.7 ping -M do -s 1372 198.51.100.7 tcpdump -ni any -c 20 'esp or udp port 4500'
Намалявайте размера на ping, докато не започнат да пристигат отговори, и приемете най-голямата работеща стойност за бюджета на този път. Изходът на xfrm ви казва кой режим и кои алгоритми са договорени, а това е входът за всяко честно изчисление. Заснемането потвърждава дали по кабела пътува ESP или ESP в UDP обвивка, което решава въпроса с NAT без догадки.
Отделете една стойност и за контролната плоскост. Пакетите за ръкостискане на IKE имат различна структура от пакетите с данни, така че размер, изведен от заснемане на ръкостискане, не е MTU на плоскостта с данни.
Сложете числото там, където му е мястото
За TCP през тунел ограничаването на MSS често е най-малко инвазивната мярка, защото намалява това, което крайните точки изпращат, без да променя самия тунел. За тунел, базиран на маршрути, задайте MTU на тунелния интерфейс умишлено и документирайте защо. Ако направите и двете наведнъж и после измерите, няма да научите кое е помогнало.
Дръжте договорения режим, външното семейство, състоянието на NAT и възпроизводимия симптом заедно в тикета. Записан набор от четири факта бие запомнена константа и това е единствената версия, която оцелява след следващото обновяване на клиента.