Чи може VPN вичерпати ентропію? Що насправді показує entropy_avail
Затримка під час завантаження і повільний встановлений тунель — різні несправності. Прочитайте етап, справжній сенс лічильника та чергу, перш ніж звинувачувати випадковість.
Вичерпання випадковості ядра — привабливе пояснення повільного VPN і майже завжди хибне для симптому, про який повідомляють люди. Хост, що чекає на випадковий вивід, зупиняється в певний момент, зазвичай на початку завантаження або під час обробки ключів. Тунель, який швидко з’єднується, а потім повільно передає натомість описує пропускну здатність. Розділіть ці два спостереження, перш ніж ставити демон, щоб виправити число, яке ви не дочитали.
Чому міф виживає
Обидві проблеми реальні й здалеку виглядають однаково. Затримки запуску на щойно завантаженій віртуальній машині справді бувають, і повільний встановлений тунель такий самий реальний. Помилка — припускати, що друга спричинена першою, бо криптографія з’являється десь в обох історіях. Ніщо в слові шифрування не означає, що кожен переданий байт споживає свіжий байт шуму довкілля.
Ці генератори працюють не так. Криптографічна бібліотека тримає генератор із насінням і бере з нього вивід, пересіваючи за власною політикою, тож дорогий момент — це засівання, а не рівномірна передача.
Що генератор робить на кожен пакет
У OpenSSL 3 ієрархія генераторів за замовчуванням будується з примірників DRBG, які засівають і пересівають згідно з конфігурацією та станом. У OpenVPN 2.6 шлях даних AEAD виводить свій nonce з порядкового номера пакета разом із неявним значенням для сеансу, тоді як старіший шлях CBC бере псевдовипадковий IV на кожен пакет. Жодна зі схем не підтримує правило, що переміщення гігабайта споживає гігабайт свіжого шуму ядра. Обидві підтримують думку, що генерація ключів і рукостискання — це місце, де засівання має значення.
Випадок CBC варто назвати, бо він схожий на міф і ним не є: його IV на кожен пакет походить із генератора бібліотеки за власним графіком пересівання бібліотеки, ніколи з виклику ядра на кожен пакет. Коли хтось наводить вартість ентропії на байт, запитайте, яку версію бібліотеки і який шлях коду вони міряли.
Де очікування справді видно
Ставте позначки часу навколо етапів, а не навколо сеансу: запуск, автентифікація, зміна ключа й передача. Очікування до того, як тунель стане придатним, — це інша скарга, ніж низька стала швидкість, і лише одна з них вказує на випадковість. У Linux звичайний getrandom() запит може блокуватися, доки випадкове джерело ядра не ініціалізовано, тому версія цієї проблеми під час завантаження реальна на віртуальних машинах і вбудованих платах, яким спочатку мало чим годувати пул.
| Етап | Що запускати | Показник, що означає очікування | Показник, що означає пропускну здатність |
|---|---|---|---|
| Завантаження, до будь-якого тунелю | systemd-analyze critical-chain | юніт, який стоїть секунди до запуску тунелю | не застосовно, поки нічого не передається |
| Рукостискання | journalctl -u openvpn-server@server -b | довгий проміжок до завершення послідовності ініціалізації | не застосовно, тунель не піднято |
| Встановлена передача | ss -tin поруч із sar -n DEV 1 | заблокований процес із порожніми чергами сокета | повні черги, повторні передачі й один зайнятий потік |
Дві дешеві команди належать до початку цього набору, і вони вирішують прості питання ще до того, як таблиця взагалі знадобиться. Лічильник, який вони читають, — це облік ентропії, а не вимірювач смуги пропускання, і один знімок не може показати, чи процес заблоковано, скільки він чекав і який інтерфейс викликають функції його бібліотеки. Проба, взята після відновлення, зазвичай повністю пропускає затримку, тож тримайте версію ядра поруч із показником.
cat /proc/sys/kernel/random/entropy_avail
uname -rУзгодьте виправлення з показником
Якщо ядро справді чекає на ініціалізацію, дивіться на підтримуваний платформою шлях засівання, а не на тунель. Віртуальній машині можна дати випадковий пристрій від хоста, наприклад virtio-rng, і підготовка образу важлива, бо насіння, скопійоване без змін у багатьох гостей, не є незалежною ініціалізацією. Якщо бібліотека повідомляє про збої засівання після завантаження, дослідіть її налаштоване джерело й поведінку постачальника, а не змінюйте налаштування ядра.
ss -tin dst 203.0.113.7
sar -n DEV 1 5Документація генератора OpenSSL описує, як ця ієрархія отримує вхід і коли відбувається пересівання, що є значно вужчим твердженням, ніж міф, і правильне лише для тієї реалізації. Демон ентропії — не універсальний ремонт швидкості, і його встановлення заради зростання лічильника змінює припущення безпеки, не демонструючи затримку. Для пропускної здатності йдіть шляхом даних: один насичений потік, повторні передачі, зовнішні втрати й скидання черг потребують кожен свого виправлення, а розміри буферів розв’язують буферизацію сокета з власними доказами з черг.