У меня есть монтирование NFS через туннель Strongswan IPSec, который инкапсулирован в туннель 6to4. IPSec — потому что мне нужно шифрование для трафика NFS, 6to4 — потому что провайдер VPS не назначит собственный префикс IPv6 моему серверу. Поскольку у меня были проблемы с MTU на туннеле 6to4, мне пришлось понизить MTU на туннельном интерфейсе до минимума (1280 — если я попытаюсь установить что-то меньшее, я получаю сообщение «Ошибка: mtu меньше минимума устройства». ).
NFS по-прежнему хочет отправлять пакеты по MTU. Я знаю это, потому что у меня есть правило nftables для регистрации пакетов ESP:
выход цепи {
фильтр приоритета вывода обработчика типа фильтра; политика принять;
ip6 nexthdr esp counter пакетов 303367 байт 323173696 log accept
}
Таким образом, я вижу эти пакеты, зарегистрированные в syslog/journal:
29 янв. 2001 LEN=1316 TC=0 HOPLIMIT=64 FLOWLBL=155038
(IP-адреса изменены на частные по соображениям конфиденциальности.)
Теперь я не вижу зарегистрированный пакет с tcpdump
потому что якобы они отбрасываются ядром из-за превышения MTU.Я предполагаю, что NFS пытается придерживаться настройки MTU, но не знает, что ее пакеты будут инкапсулированы в IPSec. Таким образом, даже если NFS сгенерирует пакет размером менее 1280 байт, добавленный к нему заголовок ESP получит его с превышением установленного MTU. Я также подозреваю, что NFS устанавливает флаг DF на своих пакетах, потому что в противном случае работала бы фрагментация. (Я тестировал его с ping6 -M хочу
и фрагментированные пакеты прошли.) Поэтому я не могу уменьшить MTU, NFS настаивает на отправке пакетов, которые будут превышать MTU при шифровании, и даже устанавливает флаг DF.
Что я могу сделать сейчас? Следующие вещи, о которых я думал, но не знаю, как реализовать:
- Установите максимальный размер пакета для NFS, например. с опцией монтирования, но я не думаю, что есть такая настройка, я уже искал ее.
- Настройте Strongswan для решения этой ситуации, но я тоже не нашел такой опции.
- Установите правило nftables, которое каким-то образом уведомляет NFS о том, что она должна генерировать пакеты меньшего размера. Например. сообщать о еще более низком MTU для NFS, когда он его ищет — не знаю, возможно ли это вообще.
- Снимите флаг DF с пакетов, чтобы принудительно выполнить фрагментацию. Я тоже не знаю, как это сделать, и возможно ли это.
Я думаю, что nftables — это то, что нужно, но если бы это можно было решить на уровне NFS, было бы еще лучше. Я также был бы признателен за решения с iptables, я мог бы посмотреть, что эквивалентно nftables.
Поскольку об этом спрашивают в комментариях, я предоставляю информацию о своих интерфейсах.
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state Режим UP DEFAULT group default qlen 1000
ссылка/эфир aa:00:11:4d:f7:01 brd ff:ff:ff:ff:ff:ff
4: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
ссылка/сидение 192.168.32.84 одноранговый 216.66.84.42
А вот и туннели(IP-туннель
):
sit0: ipv6/ip удаленный любой локальный любой ttl 64 nopmtudisc 6rd-prefix 2002::/16
he-ipv6: ipv6/ip удаленный 216.66.84.42 локальный 192.168.32.84 ttl 255 6-й префикс 2002::/16
(Изменил свой общедоступный IPv4 на частный адрес, но на самом деле у меня есть глобально маршрутизируемый адрес для местный
; 216.66.84.42 — это туннельный шлюз HE 6to4, который хорошо известен, поэтому оставлен здесь.)
А вот маршрут по умолчанию, который применяется для трафика:
по умолчанию через fd48:2b50:6a95:a6db::1 dev he-ipv6 metric 1024 onlink pref medium
Таким образом, приложения считают, что их пакеты будут отправлены он-ipv6
, который имеет MTU 1280. Но их пакеты сначала инкапсулируются в IPSec ESP, а затем отправляются через он-ipv6
туннель. Результатом является зашифрованный IPSec пакет данных NFS, инкапсулированный в пакет 6to4, который сам отправляется на eth0
интерфейс к 216.66.84.42 (шлюз HE).