
Tengo una instalación de Ubuntu Server 14.04 que está conectada a Internet mediante PPPoE. Por el momento mi ppp0
interfaz tiene una MTU de 1492 que funciona en su mayor parte.
Me gustaría aumentar la MTU a 1500, que es compatible con mi ISP.
Hasta ahora he aumentado la MTU de la interfaz Ethernet subyacente a 1508 y he intentado agregar las siguientes líneas en/etc/ppp/peers/dsl-provider
mtu 1500
mru 1500
Pero mi ppp0
interfaz todavía tiene una MTU de 1492. Creo que la sintaxis de mis líneas agregadas es correcta, ya que usar valores inferiores a 1492 funciona como se esperaba.
Cambiar manualmente la MTU de la ppp0
interfaz a 1500 después de que se haya activado funciona, pero solo afecta a los paquetes en una dirección. Al hacerlo, puedo enviar paquetes de 1500 bytes a través de Internet y llegarán a su destino sin fragmentación. Pero el tráfico entrante todavía se envía en fragmentos de 1492 bytes.
Al capturar el tráfico en la interfaz Ethernet cuando se activa la conexión PPPoE, puedo ver que en la solicitud de configuración que mi máquina Ubuntu Server 14.04 envía al proveedor, el MRU se especifica como 1492. Entonces sé que el problema está de mi parte. de la conexión.
¿Por qué Ubuntu Server 14.04 usa 1492 como MRU en la solicitud de configuración, cuando el archivo de configuración dice 1500? ¿Y cómo puedo cambiarlo a 1500?
Respuesta1
Descargué el ppp
código fuente escribiendo estos dos comandos:
sudo apt-get build-dep ppp
apt-get source ppp
En el archivo de encabezado pppd/plugins/rp-pppoe/pppoe.h
encontré esto:
/* Header size of a PPPoE packet */
#define PPPOE_OVERHEAD 6 /* type, code, session, length */
#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD)
#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD)
#define MAX_PPPOE_MTU (MAX_PPPOE_PAYLOAD - 2)
ETH_DATA_LEN
se define en/usr/include/linux/if_ether.h
#define ETH_DATA_LEN 1500 /* Max. octets in payload */
Y en pppd/plugins/rp-pppoe/plugin.c
encontré esto:
if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
lcp_wantoptions[0].mru = MAX_PPPOE_MTU;
Lo que todo esto significa es que el rp-pppoe
complemento tiene un límite codificado de 1492 bytes. Y la única forma de aumentarlo es modificando la fuente y reconstruyendo el complemento con un límite más alto.
Al eliminar las cuatro líneas anteriores plugin.c
y reconstruir el módulo, pude aumentar la MTU de 1492 a 1500. Esto solo funciona siempre que se sepa que la línea subyacente admite el tamaño más grande, lo que sucede en mi conexión. .
Para detectar la capacidad de la línea subyacente, sería necesario utilizar una versión más nueva de pppd compatible con RFC 4638. Ubuntu 16.04 tiene una versión pppd más nueva y, por lo tanto, debería poder usar tamaños de MTU más grandes para PPPoE sin necesidad de recompilar ningún código.
Respuesta2
puede ejecutar pppd a través de strace y filtrar para mostrar solicitudes 'abiertas' para ver de qué archivos se abre para obtener su configuración.
sudo strace -f -e open pppd
En mi experiencia (de banda ancha del Reino Unido), todas las conexiones han sido 1492 si pasan por BT, ¿hay alguna razón específica por la que necesita otros 8 octetos?
Tengo entendido que si no coincide correctamente con la MRU, puede terminar haciendo que sus paquetes se conviertan en paquetes múltiples, especialmente si no permite cosas como una sobrecarga de 8 octetos para la encapsulación.