Ник Пост Дата
0ka(0ka)

Хотел оптимизировать работу wireguard через vless и столкнулся с непонятным поведением TCP MSS.

  1. PPPOE на роутере, mtu роутера 1492, mtu пк 1500, на пк http://witch.valdikss.org.ru выдает mtu 1452 (в tcpdump вижу от клиента mss 1460, от сервера 1412).
  2. pppoe на пк, mtu 1492, http://witch.valdikss.org.ru выдает mtu 1492 (в tcpdump вижу от клиента mss 1452, от сервера 1452)

Мой VPS с mtu 9000 отправляет mss 8960, но до клиента доходит в 1 варианте 1412, во 2 1452. На другом роутере, пк и провайдере вообще приходит mss 1400 от сервера в 1 варианте.

Это можно исправить и получить максимально возможный mss?

2023-09-14T14:55:03.518Z
bolvan

MTU - это максимально возможный размер пакета, начиная с ip заголовка. то есть максимальный пейлоад данных уровня L2
MSS - максимально возможная длина полезного блока данных tcp. максимальный пейлоад уровня L4. Разница между MTU и MSS - это размер заголовков ip и tcp.
Минимальный размер ip - 20 байт, tcp - 20 байт. Отсюда и разница 40. Может быть и больше, если в tcp header включены options.

Сколько бы ни было MTU на каком-либо конце, при передаче данных на другой конец выполняется процедура path mtu discovery. С помощью icmp оконечные узлы выявляют минимальный MTU всех узлов на пути пакета. Так что PMTU будет всегда самым меньшим из MTU по пути. Иначе пакет просто не дойдет.

Если вдруг ICMP не ходят, то есть костыль на роутерах. clamp-mss-to-pmtu, который обычно имеется в ip или nftables. Модуль на роутере редактирует mss , выставленный исходным узлом

Вручную можно выявить PMTU, попингав другой конец с разными размерами пакета и флагом DF (dont fragment). Обычно в комаде ping размер устанавливается как размер пейлоада ICMP echo, так что к нему для ipv4 надо прибавить 28 байт (20 ip + 8 icmp). Для 1500 MTU макс пинг будет 1472.

2023-09-14T16:38:08.515Z
0ka(0ka)

Я походу вообще непонятно написал вопрос, да? Ответа не увидел
http://witch.valdikss.org.ru/ сколько у тебя отображает mtu? Интернет IPOE или PPPOE?
Правильный mtu у меня отображает только на IPOE подключении к инету с mtu 1500. На pppoe интернете с натом через роутер сайт отображает mtu 1452 а не 1492. И так не только у меня

И на мобильном инете мегафона с mtu 1500 сайт отображает mtu 1400
И да он реальный, пинг 1472 без фрагментации проходит, как и 1464 на pppoe

2023-09-14T17:35:27.952Z
bolvan

У меня отображает 1500 (ipoe).
Если он отображает что-то другое, значит ему приходят пакеты такого размера. Но почему они приходят - скорее всего из-за PMTU. Где-то режут.

Надо протрейсить весь путь с макс размером и DF
как-то так
traceroute -F cloudflare.com 1500

2023-09-14T17:58:49.924Z
0ka(0ka)

traceroute на мегафоне проходит c 1500 (на сайте 1400), на pppoe через нат роутера traceroute проходит c 1492 (на сайте 1452)

2023-09-14T18:08:53.260Z
bolvan

Ведьма может ошибаться :slight_smile:
Лично я больше верю traceroute
Это очень старый сайт

2023-09-14T18:14:18.864Z
0ka(0ka)

ipoe на роутере (трассировка и пинг с размером 1500 проходит)

pppoe на роутере (трассировка и пинг с размером 1492 проходит)
image

pppoe на компе (трассировка и пинг с размером 1492 проходит)

мегафон lte через андроид (трассировка и пинг с размером 1500 проходит)

ответ сервера везде разный (и совпадает с ведьмой), так и должно быть? Мне кажется что правильный ответ только в первом случае, в остальных mss меньше чем должен быть

трассировка с размером 1500 а пинг с размером 1500-28*

2023-09-14T18:32:21.521Z
bolvan

Я бы попробовал пинговать не 1.1.1.1, а какой-нибудь хост под своим контролем, где можно сделать дамп.
Чтобы выяснить несколько вещей

  1. Какой MSS отправляется клиентом (уже видно, что максимальный)
  2. Какой MSS видит роутер на внутр интерфейсе
  3. Какой MSS отсылает роутер на внешний интерфейс
  4. Какой MSS приходит приходит серверу от клиента
  5. Каким MSS сервер отвечает
  6. Какой MSS принимает роутер с внешнего
  7. Какой MSS отсылает роутер на внутр
  8. Какой MSS приходит клиенту (уже видно, что мелкий)
    Надо понять на каком этапе происходит искажение.

Я сделал такой эксперимент.
Поставил на роутере MTU 1400 внешнего интерфейса.
Снял дамп на клиенте, на сервере, на роутере с внешнего интерфейса, на роутере с внутр интерфейса. Результат такой :

Клиент отсылает 1460.
Роутер получает 1460.
Роутер отправляет 1360.
Сервер получает 1360.
Сервер отправляет 1460.
Роутер получает 1460.
Роутер отправляет 1360.
Клиент получает 1360.

Это результат работы клампера мсс в iptables

Цель - узнать кто зарезает MSS. То ли клампер в вашем случае плохо работает, то ли на пути какие-то мидлбоксы что-то чудят

2023-09-14T18:50:06.320Z
bolvan

А точно стоит гнать udp через tcp ?
Там же непонятно как udp фреймы будут упакованы в tcp.
1:1 пакет в пакет может и не быть.
Могут 10 мелких udp упаковать в 1 отсыл по tcp, который размажется на 2 tcp пакета. И в чем тогда смысл такой тщательной оптимизации по mss ?

2023-09-14T19:02:03.949Z
fdsadf4345

Максимальный mtu 1480 надо ставить на pppoe и без вариантов, а то сайты не всегда будут открываться если поставить 1492
Хочешь больше mtu, меняй провайдера )

2023-09-18T15:09:58.024Z
0ka(0ka)

Если у вас проблема с mtu 1492 значит вы или провайдер что-то сломали

2023-09-18T15:41:59.340Z
fdsadf4345

Вы знаете как работает mtu ? Думаю если бы знал, тогда бы не спрашивал. Я сказал как нужно и нет чтоб сказать спасибо, ещё и крайним меня делаешь )) Вот так вот, помогай людям, я в шоке. Учить почему так, я не собираюсь, кому надо, тот сам поймёт

2023-09-18T16:15:06.640Z
0ka(0ka)

спасибо за что? сообщение не по теме и никак не помогает

2023-09-18T16:15:57.829Z
fdsadf4345

Тогда удачи с 1492 )

2023-09-18T16:16:42.855Z
0ka(0ka)

команды для теста выше есть, удачи в определении проблемы

2023-09-18T16:17:12.382Z