שאלה: Возникли проблемы при передаче больших файлов, доступе к почтовым и веб-серверам через туннель. Что это и как решить?

תשובה: 

Благодарим участника нашего форума ska101, написавшего статью в форуме, на базе которой и создан этот FAQ.

Общая суть проблемы и частично ее решение приведена здесь:
1.http://www.cisco.com/warp/public/105/56.pdf

Здесь сведена теория по фрагментации пакетов при туннелировании и в частности по IPSec:
2.http://www.cisco.com/warp/public/105/pmtud_ipfrag.pdf

1. Схема подключения:
ХР <-> 804HV <-> SHDSL <- 128k -> SHDSL <-> 804HV <-> Linux <-> Internet
На всех интерфейсах установлено MTU=1500. В этом случае наблюдается "захлебывание" и зависание почтовых клиентов и броузеров.

Машина с Linux выдает все пакеты с установленным флагом DF (Dont Fragment), то есть на Linux по умолчанию включен режим PMTU discovery. При инкапсуляции добавляется до 58 байт данных IPSec. В результате размер пакета превышает MTU интерфейса и роутер должен вернуть соотв. ICMP сообщение Linux-машине, которая в свою очередь должна передать такой же пакет, но меньшей длины. Чего не происходит, поскольку нет ICMP сообщения. Я не смог их зафиксировать даже когда изменил правила файервола.

Решение:
Базируется на основе информации из источника №2.

Необходимо понизить длину пакета на величину от 52 до 58 байт. Зависит от настроек VPN.

Менять MTU на интерфейсе Linux-машины неправильно, т.к. она работает на несколько подсетей с MTU=1500. Поэтому менять нужно только в случае с удаленным офисом.

1. Если в первом Syn-пакете с запросом на подсоединение изменить значение MSS, то все остальные ответные пакеты будут отсылаться не более указанного размера.
MSS=MTU-40 т.е. в нашем случае получаем ( 1500-58 ) - 40 = 1402.

2. Затем например в iptables написать, что-то вроде:
iptables -t mangle -A INPUT -j TCPMSS --set-mss 1402 -s {branch office IP} -p tcp --syn
Модуль с "таргетом" TCPMSS должен быть в наличии.

Для других ОС:

Windows 95/98/ME

Чтобы изменить размер MTU нужно добавить ключ MaxMTU в ветку
Hkey_Local_Machine\System\CurrentControlSet \Services\Class\netTrans\000n,
где n - номер привязки адаптера к TCP/IP. MaxMTU = 16 битное целое число, тип данных для ключа - String.

Источник: статья базы знаний Microsoft Q158474

Windows NT 4.0

Для изменения MTU нужно в ветке HKEY_LOCAL_MACHINE\System\CurrentControlSet \Services\AdapterID\Tcpip\Parameters, где AdapterID - интерфейс, для которого изменяется параметр, создать ключ MTU типа DWORD. Значение этого ключа и есть MTU для интерфейса, по умолчанию - 1500.

Источник: статья базы знаний Microsoft Q120642

Windows 2000/XP

Для изменения MTU нужно в ветке HKEY_LOCAL_MACHINE\System\CurrentControlSet \Services\Tcpip\Parameters\ Interfaces\[Adapter ID], где AdapterID - интерфейс, для которого изменяется параметр, создать ключ MTU типа DWORD. Значение этого ключа и есть MTU для интерфейса, по умолчанию - 1500.

Источник: статья базы знаний Microsoft Q314053

Таким образом все меняется на лету и не нужно больших изменений. Эффект хорошо видно сниффером.