Страница 1 из 1

как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 12:45:56
Wic
Из за сложного устройства сети, туннель(mtu 1420) через pppoe(на mpd5 mtu 1460) соединение, стали появляться такие ошибки.

Код: Выделить всё

16:24:33.992091 IP 137.226.18.3.80 > 137.226.12.150.33012: . 2897:5793(2896) ack 114 win 91 <nop,nop,timestamp 63951179 5405908>
16:24:33.992205 IP 137.226.18.1 > 137.226.18.3: ICMP 137.226.12.150 unreachable - need to frag (mtu 1460), length 556
У кого были или есть тот поймет. Свои может позже выложу.
При поиске причины обнаружилось что MSS должен быть равен MTU -40 (иногда даже -60)
Решение для линукса есть почти в каждом втором форуме.

Код: Выделить всё

iptables -A FORWARD -p tcp --syn -s $WINXP_BOX -j TCPMSS --set-mss 1380
А вот как для freebsd изменить MSS?

Код: Выделить всё

sysctl net.inet.tcp.mssdflt=1340
ничего не изменило, пакеты приходили с тем же MSS 1460.
Сейчас прописал в mpd5

Код: Выделить всё

set iface enable tcpmssfix
результат пока проверить не могу.
Хотелось бы знать как можно вручную изменить MSS.

А теперь решение этой проблемы.
Решить как в линуксе в одну строчку не получилось, но всё же цель достигнута пакеты втиснуты в туннель :smile:
Для изменения mss используем packet filter, а в частности packet normalizator.
Для того что бы просто запустить pf, можно выполнить

Код: Выделить всё

kldload pf
А потом желательно пере собрать ядро со следующей строчкой

Код: Выделить всё

device       pf
После этого нормализуем трафик в туннеле следующим правилом

Код: Выделить всё

echo 'scrub on gif0 max-mss 1380' >> /etc/pf.conf
Добавляем pf в запуск системы

Код: Выделить всё

echo 'pf_enable="YES"'>> /etc/rc.conf
запускаем его

Код: Выделить всё

pfctl -e
и всё работает!

Специально написал всё так подробно, потому что приличного решения для ошибки типа unreachable - need to frag для freebsd найти не смог.
Огромное спасибо GRooVE за помощь!

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 18:31:26
Wic
решил эту проблему при помощи tcpmssd. при том завернул все пакеты правилом

Код: Выделить всё

ipfw add divert 8001 ip from any to any via rl0
такое решение мне очень не нравится.
Можно ли как нибудь через ipfw сделать это или как нибудь уменьши число пактов что идут через диверт.

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 18:36:55
Гость
мануальчик по MPD почитайте
и не занимайтесь ерундой

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 18:46:59
Wic
Гость писал(а):мануальчик по MPD почитайте
и не занимайтесь ерундой
доки по мпд я изучил, если есть мысли то конкретней указывайте куда копать. mpd вообще только функцию пппое клиента выполняет, вся информация идет уже по тунелю.

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 19:01:12
GRooVE
pf с этим отлично справляется
при чем отлично будет работать даже в связке с ipfw

Код: Выделить всё

# cat /etc/pf.conf
scrub out all max-mss 1400
а для mpd5 должно помочь

Код: Выделить всё

# cat /usr/local/etc/mpd5/mpd.conf | grep mss
        set iface enable tcpmssfix

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 19:23:39
Wic
с мпд5 проблем нет.
мне нужно чтобы для определенного адреса в подсети у меня входящие пакеты имели mss 1380.
при это ipfw натит все адреса разом. Можно подробней про связку pf+ipfw подробней

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 19:36:40
GRooVE
а что тут подробнее?

Код: Выделить всё

# echo 'pf_enable="YES"' >> /etc/rc.conf
# echo 'scrub out to X.X.X.X max-mss 1380' >> /etc/pf.conf
# pfctl -ef /etc/pf.conf

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 20:13:38
Wic
Благодарю, с pf не разу не работал, по этому не знаю как там и что.
А можно, чтобы только для одного ИП адреса ставился такой mss

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 20:39:31
GRooVE
внимательней на предыдущий пост посмотрите

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2009-11-25 20:44:08
Wic
GRooVE , спасибо разобрался!

Re: как изменить mss при ошибке unreachable - need to frag

Добавлено: 2012-11-13 14:51:52
vasilushechka
Wic писал(а):Из за сложного устройства сети, туннель(mtu 1420) через pppoe(на mpd5 mtu 1460) соединение, стали появляться такие ошибки.

Код: Выделить всё

16:24:33.992091 IP 137.226.18.3.80 > 137.226.12.150.33012: . 2897:5793(2896) ack 114 win 91 <nop,nop,timestamp 63951179 5405908>
16:24:33.992205 IP 137.226.18.1 > 137.226.18.3: ICMP 137.226.12.150 unreachable - need to frag (mtu 1460), length 556
У кого были или есть тот поймет. Свои может позже выложу.
При поиске причины обнаружилось что MSS должен быть равен MTU -40 (иногда даже -60)
Решение для линукса есть почти в каждом втором форуме.

Код: Выделить всё

iptables -A FORWARD -p tcp --syn -s $WINXP_BOX -j TCPMSS --set-mss 1380
А вот как для freebsd изменить MSS?

Код: Выделить всё

sysctl net.inet.tcp.mssdflt=1340
ничего не изменило, пакеты приходили с тем же MSS 1460.
Сейчас прописал в mpd5

Код: Выделить всё

set iface enable tcpmssfix
результат пока проверить не могу.
Хотелось бы знать как можно вручную изменить MSS.

А теперь решение этой проблемы.
Решить как в линуксе в одну строчку не получилось, но всё же цель достигнута пакеты втиснуты в туннель :smile:
Для изменения mss используем packet filter, а в частности packet normalizator.
Для того что бы просто запустить pf, можно выполнить

Код: Выделить всё

kldload pf
А потом желательно пере собрать ядро со следующей строчкой

Код: Выделить всё

device       pf
После этого нормализуем трафик в туннеле следующим правилом

Код: Выделить всё

echo 'scrub on gif0 max-mss 1380' >> /etc/pf.conf
Добавляем pf в запуск системы

Код: Выделить всё

echo 'pf_enable="YES"'>> /etc/rc.conf
запускаем его

Код: Выделить всё

pfctl -e
и всё работает!

Специально написал всё так подробно, потому что приличного решения для ошибки типа unreachable - need to frag для freebsd найти не смог.
Огромное спасибо GRooVE за помощь!
Возможно я ошибаюсь, но кажется вы идете не верным путем: для начала вам необходимо разрешить ICMP (3 и 4 типов). Когда на интерфейс приходит пакет, размер которого больше, чем MTU, то система отправляет ICMP пакет Destination is unreachable. В ICMP содержится информация о размере MTU. Другая сторона получает это сообщение и уменьшает размер пакета до MTU, заданного в ICMP пакете.

Вы жестко задаете max-mss, это допустимо, но в некоторых ситуациях может привести к проблемам. Например если на одном из промежуточных узлов изменится MTU.

Поправьте если не прав.

PS: Дату сообщения и темы видел, но вопрос актуален и в наши дни :)