Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Bash Script – getMTU.sh – Calcular MTU en pfSense

    Scheduled Pinned Locked Moved Español
    4 Posts 2 Posters 1.8k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      javcasta
      last edited by

      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/

      Javier Castañón
      Técnico de comunicaciones, soporte y sistemas.

      Mi web: https://javcasta.com/

      Soporte scripting/pfSense https://javcasta.com/soporte/

      1 Reply Last reply Reply Quote 0
      • belleraB
        bellera
        last edited by

        Añadido a la entrada sobre MTU de Hardware.

        ¡Gracias!

        1 Reply Last reply Reply Quote 0
        • J
          javcasta
          last edited by

          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

          Javier Castañón
          Técnico de comunicaciones, soporte y sistemas.

          Mi web: https://javcasta.com/

          Soporte scripting/pfSense https://javcasta.com/soporte/

          1 Reply Last reply Reply Quote 0
          • J
            javcasta
            last edited by

            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

            Javier Castañón
            Técnico de comunicaciones, soporte y sistemas.

            Mi web: https://javcasta.com/

            Soporte scripting/pfSense https://javcasta.com/soporte/

            1 Reply Last reply Reply Quote 0
            • First post
              Last post
            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.