Накладні витрати 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 і відтворюваний симптом. Записаний набір із чотирьох фактів кращий за запам'ятовану константу, і це єдина версія цього, яка переживе наступне оновлення клієнта.