Bash Script – getMTU.sh – Calcular MTU en pfSense



  • Hola.

    Una aportación.

    He adaptado un script de linux para pfSense (FreeBSD), para calcular el MTU de una interfaz de pfSense.

    Bash Script – getMTU.sh – Calcular MTU en pfSense: https://www.javcasta.com/bash-script-getmtu-sh-calcular-mtu-en-pfsense/

    Salu2

    –- add 19/04/2016 ---

    Actualizado script a ver 2 >> http://www.javcasta.com/bash-script-getmtuv2-sh-calcular-mtu-en-pfsense-version-2/



  • Añadido a la entrada sobre MTU de Hardware.

    ¡Gracias!



  • Hola.

    Muchas gracias. :)

    Solo recalcar que la variable WANIP debe de ser la correcta, si el interfaz WAN tiene un ip pública, averiguarla (vía script con curl es trivial) y hacer el ping contra www.google.com, por ejemplo.

    Y si el interfaz WAN del pfSense está detras de un router de un isp en una red privada,  el MTU se debe calcular contra la IP  lan del router de salida (por ejemplo ping a 192.168.1.1 que seria la ip lan del router del isp), que seguramente al 99%, si el medio es ethernet, dará 1500 (sino algo no estandard pasa).

    Pero como todo es probar, a mi a veces me  ha mejorado el ancho de banda de descarga bajando a 1492 el MTU detrás de un router de Telefónica/Jazztel/etc

    Salu2



  • Hola.

    La versión 2 de este script:

    (la tengo tb en: https://www.javcasta.com/bash-script-getmtuv2-sh-calcular-mtu-en-pfsense-version-2/ )

    Como he visto que la gente tiene dudas de concepto sobre el MTU, he revisado el script getMTU.sh a su versión 2, para que se haga el cálculo correcto.

    El MTU trabaja en la capa 2 del modelo OSI (capa de acceso al medio), y depende del medio (Ethernet, Frame relay, rdsi, etc) puede coincidir o no un MTU para un medio u otro, resumiendo, el MTU se restringe al dominio de broadcast, es decir para el medio de transmisión que queda definido entre 2 dispositivos de capa 3 (2 routers y/o firewalls).

    Si la interfaz WAN del pfSense está detras de un router que nos da salida a Inet, con un medio ethernet, la IPv4 de esa interfaz al 99% va a ser una IPv4 de una red privada, y el MTU se deberá calcular contra su GW (la IP del router que nos da salida Inet)

    Si la Interfaz WAN del pfSense  tiene una IPv4 pública (ya sea por que hemos puesto en modo bridge al router de salida a Inet, siendo este una interfaz más del pfSense, o que la interfaz WAN del pfSense se conecta directamente a Inet vía PPPoE u otro protocolo/medio), la MTU se debe calcular contra un host de Inet, p.e www.google.com.

    Y tras la teoria al grano:

    getMTUv2.sh

    #!/bin/bash
    ############################################################################
    # ref https://idyllictux.wordpress.com/2009/06/19/script-find-maximum-mtu/ #
    #                                GET MTU v2                                #
    #                       BASH SCRIPT FOR PFSENSE 2.3                        #
    #             BY JAVIER CASTAÑÓN - 2016 - HTTPS://JAVCASTA.COM             #
    ############################################################################
    # uso: alojar getMTUv2.sh en una carpeta, por ejemplo /tmp o /scripts      #
    # ejecutarlo desde shell:# sh /tmp/getMTUv2.sh o sh /scripts/getMTUv2.sh   #
    # Script válido para una sola interfaz wan,denominada wan,con una sola ipv4#
    ############################################################################
    PKT_SIZE=1476
    HOSTNAME="www.google.com"
    # Averiguamos la interfaz WAN
    #ref http://unix.stackexchange.com/questions/83385/parse-xml-to-get-node-value-in-bash-script
    #WANINTERFACE=em1
    WANINTERFACE="$(echo "cat /pfsense/interfaces/wan/if" | xmllint --nocdata --shell /cf/conf/config.xml | sed '1d;$d' | sed 's/<if>//' | sed 's/<\/if>//')"
    # Averiguamos la ipv4 de la interfaz WAN
    #WANIP=192.168.1.254
    #WANIP="$(ifconfig em1 | grep "inet " | cut -d " " -f 2)"
    WANIP="$(ifconfig $WANINTERFACE | grep "inet " | cut -d " " -f 2)"
    # IF WANIP ES PRIVADA EL MTU SE CALCULA CONTRA EL GW
    # IF WANIP NO ES PRIVADA, ES PUBLICA, EL MTU SE CALCULA CONTRA $HOSTNAME (WWW.GOOGLE.COM)
    # grep -E '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)'
    PRIVADA=$(echo "$WANIP" | grep -c -E '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)')
    if [ $PRIVADA -eq 1 ]; then
    # Averiguamos el GW de la Interfaz WAN vía traceroute con el 1er salto
    printf "Averiguando gateway de interface wan...:"
    traceroute -m 1 $HOSTNAME | grep -v "$HOSTNAME" | awk '{print $2}' > /tmp/gw.tmp
    #ELGW=192.168.1.1
    ELGW=$(cat /tmp/gw.tmp)
    printf "Parametros: \n"
    printf "interface wan: $WANINTERFACE \n"
    printf "wan ipv4: $WANIP \n"
    printf "wan gateway: $ELGW \n"
    ####
    #HACEMOS ICMP ECHO REQUEST SOBRE EL GW WAN > Message too long"
    #ping -S 192.168.1.254 -c 1 -D -s 1474 192.168.1.1 > /tmp/getmtu.tmp 
    ping -S $WANIP -c 1 -D -s $PKT_SIZE $ELGW > /tmp/getmtu.tmp
    CONTINUAR=$(cat /tmp/getmtu.tmp | grep -c "100.0% packet loss") 
    printf "Intentando con MTU $((PKT_SIZE + 28)) ICMP ECHO REQUEST SIN FRAGMENTAR a $ELGW \n"
    while [ $CONTINUAR -eq 1 ]; do
     PKT_SIZE=$((PKT_SIZE - 2))
     ping -S $WANIP -c 1 -D -s $PKT_SIZE $ELGW > /tmp/getmtu.tmp
     printf "Intentando con MTU $((PKT_SIZE + 28)) ICMP ECHO REQUEST SIN FRAGMENTAR a $ELGW \n"
     CONTINUAR=$(cat /tmp/getmtu.tmp | grep -c "100.0% packet loss")
     #count=$((`ping -S $WANIP -c 1 -D -s $PKT_SIZE $ELGW | grep -c "frag needed"`))
    done
    printf "MTU MAXIMO ES: [ $((PKT_SIZE + 28)) ] \n"
    fi
    if [ $PRIVADA -eq 0 ]; then
    printf "Parametros: \n"
    printf "interface wan: $WANINTERFACE \n"
    printf "wan ipv4: $WANIP \n"
    count=`ping -S $WANIP -c 1 -D -s $PKT_SIZE $HOSTNAME | grep -c "frag needed"`
    printf "Intentando con MTU $((PKT_SIZE + 28)) ICMP ECHO REQUEST SIN FRAGMENTAR a $HOSTNAME \n"
    while [ $count -eq 1 ]; do
     PKT_SIZE=$((PKT_SIZE - 2))
     printf "Intentando con MTU $((PKT_SIZE + 28)) ICMP ECHO REQUEST SIN FRAGMENTAR a $HOSTNAME \n"
     count=$((`ping -S $WANIP -c 1 -D -s $PKT_SIZE $HOSTNAME | grep -c "frag needed"`))
    done
    printf "MTU MAXIMO ES: [ $((PKT_SIZE + 28)) ] \n"
    fi</if>
    

    Outputs para una wan con ip privada o con una ip pública

    Con WANIP privada:

    [2.3-RELEASE][root@pfSense3.localdomain.local]/: sh /scripts/getMTUv2.sh
    Averiguando gateway de interface wan…:traceroute to www.google.com (216.58.210.228), 1 hops max, 40 byte packets
    Parametros:
    interface wan: em1
    wan ipv4: 192.168.1.254
    wan gateway: 192.168.1.1
    ping: sendto: Message too long
    Intentando con MTU 1504 ICMP ECHO REQUEST SIN FRAGMENTAR a 192.168.1.1
    ping: sendto: Message too long
    Intentando con MTU 1502 ICMP ECHO REQUEST SIN FRAGMENTAR a 192.168.1.1
    Intentando con MTU 1500 ICMP ECHO REQUEST SIN FRAGMENTAR a 192.168.1.1
    MTU MAXIMO ES: [ 1500 ]

    Con WANIP Pública:

    [2.3-RELEASE][root@pfSense3.localdomain.local]/: sh /scripts/getMTUv2.sh
    Parametros:
    interface wan: em1
    wan ipv4: 80.59.xxx.xxx
    Intentando con MTU 1504 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    Intentando con MTU 1502 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    Intentando con MTU 1500 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    Intentando con MTU 1498 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    Intentando con MTU 1496 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    Intentando con MTU 1494 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    Intentando con MTU 1492 ICMP ECHO REQUEST SIN FRAGMENTAR a www.google.com
    MTU MAXIMO ES: [ 1492 ]

    Salu2


Log in to reply