How to change MTU size in Linux
The default MTU size in most of the Ethernet networks is 1500 bytes. However, you can change it as per the requirements. In this tutorial, we will explain how to change MTU size in Linux.
Prerequisites
- Ubuntu 20.04 system
- User with sudo privileges
Note: The commands discussed in this article have been tested on Ubuntu 20.04 LTS (Focal Fossa). The same commands are also valid for Debian distribution.
View Current MTU Size
In order to view the current MTU size of your ethernet interface, use the ifconfig command as follows:
The output below shows the current MTU size of interface ens33 is 1500.

Alternatively, you can also use the “ip a” command to view the current MTU size:

Temporarily changing the MTU Size – Using ifconfig command
We can use the ifconfig command to change the MTU size of a system’s network interface. However, remember that this change does survive a reboot and returns to the default value i.e. 1500.
To change the MTU size of an interface, use the following syntax:
For instance, to change the MTU size of an interface named ens33 to 1000 bytes, the command would be:
After running the above command, the MTU size changes instantaneously. This change even does not require a service restart.
You can verify the new MTU size by running the following command in Terminal:

From the above output, you can verify that MTU size has now changed to 1000 bytes. However, as mentioned before, this change will not survive a reboot. The MTU size will return to its default value of 1500 after a reboot.
Permanently changing the MTU Size
The ifconfig command instantaneously changes the MTU size but this change does not survive a system reboot. In the following section, we will see how to permanently change the MTU size.
In dynamic IP addressing, the MTU size is set by DHCP. So will need to configure the DHCP configuration file located at /etc/dhcp/dhclient.conf. For static IP address, we will make changes in the network interface configuration file located at /etc/network/interfaces.
Using /etc/dhcp/dhclient.conf file
If the DHCP server is running on your system and the network interfaces are configured to receive the IP addresses from it, then use /etc/dhcp/dhclient.conf file to change the MTU size.
Edit the nano /etc/dhcp/dhclient.conf using the following command:
Then add the following lines below the “send host-name = gethostname(); line:
default interface-mtu <mtu_size>;
supersede interface-mtu <mtu_size>;
For instance, to set the MTU size to 1400, we will add:
default interface-mtu 1400;
supersede interface-mtu 1400;
If you have multiple interfaces and you want to change the MTU size of just one interface, then enclose it in the braces as follows:
default interface-mtu < mtu_size > ;
supersede interface-mtu < mtu_size > ;
Once you have configured the file, save, and close it.
Now restart the networking service using the following command in Terminal:
Also, bring up the interface using the following command:
Make sure to replace the <interface_name> with the actual network interface on your system e.g ens33, eth0, eth1, etc.
In our case, it would be:
Now issue the following command in Terminal to verify if the MTU size has changed successfully.
From the output, you can see the MTU size has been changed to 1400.
Using /etc/network/interfaces file
If your network interface is configured to obtain a static IP address, then you can change the MTU size by configuring the /etc/network/interfaces file.
Edit the /etc/network/interfaces file using the following command in Terminal:
Append the below line in the file:
Make sure to replace <interface-name> with the actual interface name and <mtu_size> with the MTU size you want to set on the network interface.
For instance, to change the MTU size of an interface named ens33 to 1300 bytes, the command would be:

Once you have configured the file, save, and close it.
Now restart the networking services using the following command in Terminal:
Also, bring up the interface using the following command:
Make sure to replace the <interface_name> with the actual network interface on your system e.g. ens33, eth0, eth1, etc.
In our case, it would be:
Now issue the following command in Terminal to verify if the MTU size has changed successfully.

From the output, you can see that the MTU size has been changed to 1300. This change will be kept persistent and will not be affected even after a reboot.
That is all there is to it! By following the above procedures, you can change the MTU size of a network interface either temporarily or permanently in your Linux system. Hope this helps!
Значение MTU
MTU — maximum transmission unit -максимальный размер пакет или фрейма в байтах, который может быть отправлен единовременно без фрагментации. Узнать значение и поменять MTU в Linux можно используя утилиту ip. Чтобы изменения сохранялись после перезагрузки требуется продублировать новое значение в сетевых настройках.
Узнать значение и поменять MTU в Linux
Узнать значение MTU для всех интерфейсов можно выполнив в консоли команду ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 54:52:00:91:96:85 brd ff:ff:ff:ff:ff:ff
Чаще всего встречается 1500 — это значение по умолчанию для Ethernet интерфейсов.
Поменять MTU на сервере с Debian можно так:
ip link set dev eth0 mtu 1400
При этом начинает использоваться значение 1400, после перезагрузки эти изменения не сохранятся.
Чтобы сделать их постоянными нужно отредактировать файл /etc/network/interfaces
Для CentOS это скрипты /etc/sysconfig/network-scripts/*, для других систем иначе — для Debian также возможны варианты, но чаще всего это /etc/network/interfaces
К нужному интерфейсу достаточно дописать mtu 1400 отдельной строкой
IFACE при этом заменить именем интерфейса, таким как eth0
Если настройки сети выдаются DHCP, то секция примет такой вид:
iface eth0 inet dhcp
pre-up /sbin/ifconfig $IFACE mtu 1454
Для сервера, к которому нет доступа по SSH MTU можно узнать экспериментальным путем. Значение может потребоваться при поиске сетевых неполадок.
Это делается за счет опции -M do утилиты ping.
ICMP пакеты при этом будут отправляться с заданным MTU, из ответа будет видно реальное значение.
PING ya.ru (87.250.250.242) 1572(1600) bytes of data.
ping: local error: Message too long, mtu=1500
— ya.ru ping statistics —
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
28 байт вычитается, поскольку они отданы под хэдеры IP и ICMP.
При установке 1500 байт PING проходит успешно.
PING ya.ru (87.250.250.242) 1472(1500) bytes of data.
1480 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=57 time=32.0 ms
— ya.ru ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 32.040/32.040/32.040/0.000 ms
Читайте про iface inet — директиву, которую можно увидеть в /etc/network/interfaces
Изменить размер MTU в Linux
MTU (Stands for Maximum Transmission Unit) — это максимальный размер пакета, который может быть передан с сетевого интерфейса. Все устройства, включая серверы и коммутаторы/маршрутизаторы, участвующие в коммуникации, должны иметь одинаковый размер MTU. Большой размер MTU имеет меньше накладных расходов, связанных с ним, в то время как меньший MTU имеет меньшую задержку.
Размер MTU по умолчанию в большинстве сетей Ethernet составляет 1500 байт. Однако вы можете изменить его в соответствии с требованиями. В этом руководстве мы объясним, как изменить размер MTU в Linux.
Просмотр текущего размера MTU
Чтобы посмотреть текущий размер MTU вашего интерфейса ethernet, используйте команду ifconfig следующим образом:
Приведенный ниже результат показывает, что текущий размер MTU интерфейса eht0 равен 1500.

Также можно использовать команду «ip a» для просмотра текущего размера MTU:
Временное изменение размера MTU
Мы можем использовать команду ifconfig для изменения размера MTU сетевого интерфейса системы. Однако помните, что это изменение сохраняется после перезагрузки и возвращается к значению по умолчанию, т.е. 1500.
Чтобы изменить размер MTU интерфейса, используйте следующий синтаксис:
Например, чтобы изменить размер MTU интерфейса с именем eth0 на 1000 байт, выполните следующую команду:
После выполнения вышеуказанной команды размер MTU изменится мгновенно. Это изменение даже не требует перезапуска службы.
Вы можете проверить новый размер MTU, выполнив следующую команду в терминале:
![]()
Из приведенного выше результата вы можете убедиться, что размер MTU теперь изменился на 1000 байт. Однако, как уже говорилось ранее, это изменение не переживет перезагрузку. После перезагрузки размер MTU вернется к значению по умолчанию 1500.
Постоянное изменение размера MTU
Команда ifconfig мгновенно изменяет размер MTU, но это изменение не сохраняется после перезагрузки системы.
При динамической IP-адресации размер MTU устанавливается DHCP. Поэтому необходимо настроить конфигурационный файл DHCP, расположенный по адресу /etc/dhcp/dhclient.conf. Для статической IP-адресации мы внесем изменения в файл конфигурации сетевого интерфейса, расположенный по адресу /etc/network/interfaces.
Использование файла /etc/dhcp/dhclient.conf
Если в вашей системе запущен DHCP-сервер и сетевые интерфейсы настроены на получение IP-адресов от него, то для изменения размера MTU используйте файл /etc/dhcp/dhclient.conf.
Отредактируйте nano /etc/dhcp/dhclient.conf с помощью следующей команды:
Затем добавьте следующие строки ниже строки
Например, чтобы установить размер MTU равным 1400, мы добавим:
Если у вас несколько интерфейсов и вы хотите изменить размер MTU только одного интерфейса, то заключите его в скобки следующим образом:
После настройки файла сохраните и закройте его.
Теперь перезапустите сетевую службу с помощью следующей команды в Терминале:
Также запустите интерфейс с помощью следующей команды:
Обязательно замените <interface-name> на реальный сетевой интерфейс в вашей системе, например ens33, eth0, eth1 и т.д.
В нашем случае это будет:
Теперь выполните следующую команду в терминале, чтобы проверить, успешно ли изменился размер MTU.
Использование файла /etc/network/interfaces
Если ваш сетевой интерфейс настроен на получение статического IP-адреса, то вы можете изменить размер MTU, настроив файл /etc/network/interfaces.
Отредактируйте файл /etc/network/interfaces с помощью следующей команды в Терминале:
Добавьте в файл следующую строку:
Обязательно замените <interface-name> на фактическое имя интерфейса, а <mtu_size> на размер MTU, который вы хотите установить на сетевом интерфейсе.
Например, чтобы изменить размер MTU интерфейса с именем ens33 на 1300 байт, выполните следующую команду:
После настройки файла сохраните и закройте его.
Теперь перезапустите сетевые службы с помощью следующей команды в Терминале:
Также запустите интерфейс с помощью следующей команды:
Обязательно замените <interface-name> на реальный сетевой интерфейс вашей системы, например, ens33, eth0, eth1 и т.д.
В нашем случае это будет:
Теперь выполните следующую команду в терминале, чтобы проверить, успешно ли изменился размер MTU.
Большие потоки трафика и Linux: прерывания, маршрутизатор и NAT-сервер
В нашей городской сети более 30 тысяч абонентов. Суммарный объем внешних каналов — более 3 гигабит. А советы, данные в упомянутой статье, мы проходили еще несколько лет назад. Таким образом, я хочу шире раскрыть тему и поделиться с читателями своими наработками в рамках затрагиваемого вопроса.
В заметке описываются нюансы настройки/тюнинга маршрутизатора и NAT-сервера под управлением Linux, а также приведены некоторые уточнения по поводу распределения прерываний.
Прерывания
Раскидывание прерываний сетевых карт по разным ядрам — это самое первое, с чем сталкивается сисадмин при возрастании нагрузки на linux-маршрутизатор. В упомянутой статье тема освещена достаточно подробно — поэтому надолго останавливаться на этом вопросе мы не будем.
Хочу только отметить:
- если вы вручную раскидываете прерывания, то вам необходимо остановить сервис irqbalance. Этот сервис предназначен как раз для автоматического регулирования прерываний между ядрами процессоров. Если вы делаете эту работу вручную — сервис лучше остановить;
- не забудьте внести соответствующие правки в «автозагрузку» (например, /etc/rc.local) — т.к. после рестарта сервера все прерывания опять распределятся вкучку на одном ядре;
- после рестарта сервера, сетевые карты могут получить (а скорее всего, именно так и будет) новые номера прерываний. Поэтому в /etc/rc.local лучше не вписывать руками конкретные номера прерываний — а автоматизировать с помощью вспомогательного скрипта распознавание, какая сетевая какое прерывание заняла.
Маршрутизатор
В первоначальной статье есть фраза «если сервер работает только маршрутизатором, то тюнинг TCP стека особого значения не имеет». Это утверждение в корне неверно. Конечно, на небольших потоках тюнинг не играет большой роли. Однако, если у вас большая сеть и соответствующая нагрузка — то тюнингом сетевого стека вам придется заняться.
Прежде всего, если по вашей сети «гуляют» гигабиты, то имеет смысл обратить свое внимание на MTU на ваших серверах и коммутаторах. В двух словах, MTU — это объем пакета, который можно передать по сети, не прибегая к его фрагментации. Т.е. сколько информации ваш один маршрутизатор может передать другому без фрагментирования. При значительном увеличении объемов передаваемых по сети данных, гораздо эффективнее передавать пакеты большего объема реже, — чем часто-часто пересылать мелкие пакеты данных.
Увеличиваем MTU на linux
/sbin/ifconfig eth0 mtu 9000
Увеличиваем MTU на коммутаторах
На коммутационном оборудовании обычно это будет называться jumbo-frame. В частности, для Cisco Catalyst 3750
3750(config)# system mtu jumbo 9000
3750(config)# exit
3750# reload
Заметьте: коммутатор затем надо перезагрузить. Кстати, mtu jumbo касаются только гигабитных линков, — 100-мбит такая команда не затрагивает.
Увеличиваем очередь передачи на linux
/sbin/ifconfig eth0 txqueuelen 10000
По умолчанию значение стоит 1000. Для гигабитных линков рекомендуется ставить 10000. В двух словах, это размер буфера передачи. Когда буфер наполняется до этого граничного значения, данные передаются в сеть.
Имейте ввиду, что если вы меняете размер MTU на интерфейсе какой-то железки — вы должны сделать то же самое и на интерфейсе её «соседа». Т.е., если вы увеличили MTU до 9000 на интерфейсе linux-роутера, то вы должны включить jumbo-frame на порту коммутатора, в который данный роутер включен. В противном случае сеть работать будет, но очень плохо: пакеты ходить по сети будут «через одного».
Итоги
В результате всех этих изменений, в сети возрастут «пинги» — но общая пропускная способность заметно возрастет, а нагрузка на активное оборудование снизится.
Сервер NAT
Операция NAT (Network Address Translation) является одной из самых дорогостоящих (в смысле, ресурсоёмких). Поэтому, если у вас большая сеть, без тюнинга NAT-сервера вам не обойтись.
Увеличение кол-ва отслеживаемых соединений
Для осуществления своей задачи, NAT-серверу необходимо «помнить» обо всех соединениях, которые через него проходят. Будь то «пинг» или чья-то «аська» — все эти сессии NAT-сервер «помнит» и отслеживает у себя в памяти в специальной таблице. Когда сессия закрывается, информация о ней из таблицы удаляется. Размер этой таблицы фиксирован. Именно поэтому если трафика через сервер идет достаточно много, а размера таблицы нехватает, — то NAT-сервер начинает «дропать» пакеты, рвать сессии, интернет начинает работать с жуткими перебоями, а на сам NAT-сервер бывает даже попасть по SSH становится просто невозможно.
Чтобы таких ужасов не происходило, необходимо адекватно увеличивать размер таблицы — в соответствии с проходящим через NAT трафиком:
/sbin/sysctl -w net.netfilter.nf_conntrack_max=524288
Настоятельно НЕ рекомендуется ставить такое большое значение, если у вас на NAT-сервере меньше 1 гигабайта оперативной памяти.
Посмотреть текущее значение можно вот так:
Посмотреть, насколько уже заполнена таблица отслеживания соединений, можно вот так:
Увеличение размера hash-таблицы
Пропорционально должная быть увеличена и хэш-таблица, в которой хранятся списки conntrack-записей.
echo 65536 > /sys/module/nf_conntrack/parameters/hashsize
Правило простое: hashsize = nf_conntrack_max / 8
Уменьшение значений time-out
Как вы помниите, NAT-сервер отслеживает только «живые» сессии, которые через него проходят. Когда сессия закрывается — информация о ней удаляется, дабы таблица не переполнялась. Информация о сессиях удаляется так же по тайм-ауту. Т.е., если втечение долгого времени в рамках соединения обмена траифка нет — оно закрывается и информация о нем так же удаляется из памяти NAT-а.
Однако, по умолчанию значения тайм-аутов стоят достаточно большие. Поэтому, при больших потоках трафика даже если вы растянете nf_conntrack_max до предела — вы все равно рискуете быстро столкнуться с переполнением таблицы и разрывами соединений.
Чтобы такого не произошло, необходимо грамотно выставить тайм-ауты отслеживания соединений на NAT-сервере.
Текущие значения можно посмотреть, например, так:
sysctl -a | grep conntrack | grep timeout
В результате вы увидите что-то подобное:
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
Это значения тайм-аутов в секундах. Как вы видите, значение net.netfilter.nf_conntrack_generic_timeout равно 600 (10 минут). Т.е. NAT-сервер будет держать в памяти информацию о сессии до тех пор, пока по ней будет «пробегать» хоть что-то хотя бы раз в 10 минут.
На первый взгляд, ничего страшного — но на самом деле это очень и очень много.
Если вы посмотрите на net.netfilter.nf_conntrack_tcp_timeout_established — то вы увидите там значение 432000. Другими словами, простую TCP-сессию ваш NAT-сервер будет отслеживать до тех пор, пока по ней не пробегает какой-нибудь пакетик хотя бы раз в 5 дней(!).
Говоря еще более простым языком, за-DDOS’ить такой NAT-сервер становится проще простого: его NAT-таблица (параметр nf_conntrack_max) переполняется «на ура» простейшим флудом — вследствие чего он будет рвать соединения и в худшем варианте быстро превратится в черную дыру.
Значения тайм-аутов рекомендуется ставить в пределах 30-120 секунд. Этого вполне достаточно для нормальной работы абонентов, и этого вполне хватит для своевременной очистки NAT-таблицы, исключающей её переполнение.
И не забудьте вписать соответствующие изменения в /etc/rc.local и /etc/sysctl.conf
Итоги
После тюнинга вы получите вполне жизнеспособный и производительный NAT-сервер. Конечно же, это только «базовый» тюнинг — мы не касались, например, тюнинга ядра и т.п. вещей. Однако, в большинстве случаев даже таких простых действий будет достаточно для нормальной работы достаточно большой сети. Как я уже говорил, в нашей сети более 30 тыс. абонентов, трафик которых обрабатывают 4 NAT-сервера.

