Community discussions

MikroTik App
 
sperez
just joined
Topic Author
Posts: 1
Joined: Thu Oct 19, 2023 5:42 am

PCC issue with upload speed

Thu Oct 19, 2023 6:01 am

I have a problem with mi pcc balance, works good with the download speed but the upload speed is only from WAN1
:local version [/system resource get version];
:local versionp1 nil;
:local versionp2 nil;
:local versionp3 nil;
:local posesp nil;
:local pospun1 nil;
:local pospun2 nil;
:set posesp [:find $version " " -1];

:if ([:typeof $posesp] != "nil") do={
    :set version [ :pick $version 0 $posesp ];
};

:set pospun1 [:find $version "." -1];
:set pospun2 [:find $version "." $pospun1];

:if ([:typeof $pospun1] != "nil") do={
    :set versionp1 [:pick $version 0 $pospun1];
} else={
    :set versionp1 $version;
};


:if ([:typeof $pospun1] != "nil" && [:typeof $pospun2] != "nil") do={
    :set versionp2 [:pick $version ($pospun1+1) $pospun2];
} else={
    :if ([:typeof $pospun1] != "nil" && [:typeof $pospun2] = "nil") do={
        :set versionp2 [:pick $version ($pospun1+1) [:len $version]];
    }
};

:if ([:typeof $pospun2] != "nil") do={
    :set versionp3 [:pick $version ($pospun2+1) [:len $version]];
};


:if ( $versionp1 < 7 ) do={
    :put ( "La version de Router OS debe ser mayor o igual a la 7.0 " );
    :put ( "Tu router tiene la version ".$version." de Router OS." );
    :put ( "La version de Router OS no es valida para hacer instalacion.");
    :exit
} else={
    :put ( "Version de Router OS ". $version. " valida para hacer instalacion.");
};



    
        /interface/ethernet/set [ find name="ether1" ] \
        name="WAN1" 
    
    
    
        
        /interface/ethernet/set [ find name="ether2" ] \
        name="WAN2" 
    
    
    
        /interface/bridge/add fast-forward=no name="bridgeLAN"
    /interface/list
add name=LAN
add name=WAN

/interface/list/member
add interface="bridgeLAN" list=LAN 

    add interface="WAN1" list=WAN 
    add interface="WAN2" list=WAN 

/ip/dns/set allow-remote-requests=yes servers=8.8.4.4 
/ip/address/add address=192.168.88.0/24 interface="bridgeLAN" network=192.168.88.0 


    /routing/table/add name="to_ISP1" fib;
    /routing/table/add name="to_ISP2" fib;




/ip/firewall/mangle 
    add action=accept chain=prerouting \
        dst-address=192.168.250.250 \
        in-interface-list=LAN comment="fo_ip_gw1" 
        add action=accept chain=prerouting \
        dst-address=192.168.250.250 \
        in-interface-list=LAN comment="fo_ip_gw2" 
        add action=mark-connection chain=prerouting connection-mark=no-mark \
        in-interface="WAN1" new-connection-mark=ISP1_conn 
        add action=mark-connection chain=prerouting connection-mark=no-mark \
        in-interface="WAN2" new-connection-mark=ISP2_conn 
        add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local \
        in-interface-list=LAN new-connection-mark=ISP1_conn \
        per-connection-classifier=both-addresses:2/0          
        add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local \
        in-interface-list=LAN new-connection-mark=ISP2_conn \
        per-connection-classifier=both-addresses:2/1              
    add action=log chain=prerouting log=no comment=fo_bandera_pcc disabled=yes 
    add action=mark-routing chain=prerouting connection-mark=ISP1_conn \
        in-interface-list=LAN new-routing-mark=to_ISP1 passthrough=no 
        add action=mark-routing chain=prerouting connection-mark=ISP2_conn \
        in-interface-list=LAN new-routing-mark=to_ISP2 passthrough=no 
        add action=mark-routing chain=output connection-mark=ISP1_conn \
        new-routing-mark=to_ISP1 passthrough=no 
        add action=mark-routing chain=output connection-mark=ISP2_conn \
        new-routing-mark=to_ISP2 passthrough=no 
 
 
    /ip/firewall/nat 

add action=masquerade chain=srcnat out-interface-list=WAN comment="NAT para los paquetes que salgan por las interfaces WAN"

    
            [:parse "/ip/route/add distance=1 gateway=\"192.168.251.251%WAN1\" \
        routing-table=\"to_ISP1\"; "] 
    
    
    
        /ip/route/add dst-address=0.0.0.0/0 routing-table=main pref-src=0.0.0.0 gateway=8.8.8.8 \
        check-gateway=ping distance=1 scope=30 target-scope=11 suppress-hw-offload=no \
        comment="fo_isp1mon"
        /ip/route/add dst-address=8.8.8.8 routing-table=main gateway=192.168.1.1 \
        distance=1 scope=10 target-scope=10 suppress-hw-offload=no \
        comment="fo_isp1gtw"
        
            [:parse "/ip/route/add distance=1 gateway=\"192.168.251.251%WAN2\" \
        routing-table=\"to_ISP2\"; "] 
    
    
    
        /ip/route/add dst-address=0.0.0.0/0 routing-table=main pref-src=0.0.0.0 gateway=8.8.8.8 \
        check-gateway=ping distance=1 scope=30 target-scope=11 suppress-hw-offload=no \
        comment="fo_isp2mon"
        /ip/route/add dst-address=8.8.8.8 routing-table=main gateway=192.168.2.1 \
        distance=1 scope=10 target-scope=10 suppress-hw-offload=no \
        comment="fo_isp2gtw"
        
        /ip/dhcp-client
    add add-default-route=no dhcp-options=hostname,clientid disabled=no interface="WAN1" script=\
    ("\r\
    \n:local gateway [/ip/dhcp-client get [find interface=\"WAN1\"] gateway];\r\
    \n/ip/route \r\
    \nset [ find routing-table=\"to_ISP1\" ] gateway=\"\$gateway%WAN1\"; \r\
    \nset [ find comment=\"fo_isp1gtw\" ] gateway=\"\$gateway\"; \r\
    \n/ip/firewall/mangle \r\
    \nset [ find comment=\"fo_ip_gw1\" ] dst-address=\$gateway;")
    /ip/dhcp-client
    add add-default-route=no dhcp-options=hostname,clientid disabled=no interface="WAN2" script=\
    ("\r\
    \n:local gateway [/ip/dhcp-client get [find interface=\"WAN2\"] gateway];\r\
    \n/ip/route \r\
    \nset [ find routing-table=\"to_ISP2\" ] gateway=\"\$gateway%WAN2\"; \r\
    \nset [ find comment=\"fo_isp2gtw\" ] gateway=\"\$gateway\"; \r\
    \n/ip/firewall/mangle \r\
    \nset [ find comment=\"fo_ip_gw2\" ] dst-address=\$gateway;")
 
    /system/identity/set name="Balanceador PCC"
/system/script

add name=failoverConfig owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
    \_Correo electr\F3nico del administrador al que llegaran las notificacione\
    s de ISPs caidos\r\
    \n:global foCorreoAdministrador \"pe.17110377@gmail.com\";\r\
    \n\r\
    \n# Bandera que indica si se van a enviar correos de notificacion \"si\"/\
    \"no\"\r\
    \n:global foEnvioEmailsNotificacion \"si\";\r\
    \n\r\
    \n# Definici\F3n de ISPs y capacidades proporcionales\r\
    \n:global foIsps {{1;1};{2;1}; };\r\
    \n\r\
    \n# Relacion de ISPs con Interfaces\r\
    \n:global foRelIspInterfaz {{1;\"WAN1\"};{2;\"WAN2\"};};\r\
    \n\r\
    \n\r\
    "



add name=failover owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=("#######################################\
    ####\r\
    \n# Script Failover para router con N ISPs\r\
    \n###########################################\r\
    \n\r\
    \n# Carga de la configuracion\r\
    \n/system/script/run failoverConfig;\r\
    \n\r\
    \n\r\
    \n# Declaraci\F3n de variables principales\r\
    \n:global foIspsCaidos {nil};\r\
    \n:global foIspsCaidosAnt;\r\
    \n:global foIspsAnt;\r\
    \n:global foIpDNS;\r\
    \n:global foIsps;\r\
    \n:global foRelIspInterfaz;\r\
    \n\r\
    \n:local nIsps [:len \$foIsps];\r\
    \n:local pasos 0;\r\
    \n:local id;\r\
    \n:local interfaz;\r\
    \n:local inactive;\r\
    \n\r\
    \n\r\
    \n\r\
    \n# Inicializaci\F3n de los ISP antiguos\r\
    \n:if ([:typeof \$foIspsAnt]=\"nothing\") do={ :set foIspsAnt \$foIsps; }\r\
    \n\r\
    \n# Inicializaci\F3n de los ISP caidos anteriormente\r\
    \n:if ([:typeof \$foIspsCaidosAnt]=\"nothing\") do={ :set foIspsCaidosAnt {nil}; }\r\
    \n\r\
    \n\r\
    \n\r\
    \n# Actualizacion de las capacidades de los ISPs\r\
    \n:if (\$foIsps != \$foIspsAnt) do={ /system/script/run failoverActualizadorCapacidadesISPs; }\r\
    \n\r\
    \n\r\
    \n\r\
    \n# Proceso de pruebas de conexi\F3n a internet por los distintos ISPs\r\
    \n:foreach rel in=[\$foRelIspInterfaz] do={\r\
    \n    :set id (\$rel->0);\r\
    \n    :set interfaz (\$rel->1);\r\
    \n    :set inactive [/ip/route/get [/ip/route/find comment=\"fo_isp\$id\".\"mon\"] inactive];\r\
    \n\r\
    \n    # Si el monitor está inactivo, entonces el ISP está caido y se agrega a la lista de foIspsCaidos
    \n    :if (\$inactive) do={ :set (\$foIspsCaidos->\"\$id\") \$id; }  \r\
    \n}\r\
    \n\r\
    \n\r\
    \n# Compara los ISPs caidos actualmente contra los ISPs caidos previamente\r\
    \n# Si son iguales evita ejecutar por completo el script\r\
    \n:if ( \$foIspsCaidos = \$foIspsCaidosAnt) do={ :exit; }\r\
    \n\r\
    \n\r\
    \n# Si hubo cambios entre los ISPs activos actualmente y los anteriores\r\
    \n# se procede a hacer acutalizaci\F3n en las reglas mangle,\r\
    \n# liberar y reiniciar los clientes dhcp de las interfaces wan,\r\
    \n# en la ruta por defecto y se env\EDa notificaci\F3n de los ISPs caidos\r\
    \n\r\
    \n# Liberacion y reinicio de los clientes dhcp de interfaces wan\r\
    \n/system/script/run failoverDhcpClientRelease;\r\
    \n\r\
    \n# Actualizador de reglas Mangle\r\
    \n/system/script/run failoverActualizadorReglasMangle;\r\
    \n\r\
    \n\r\
    \n######################################################################\r\
    \n# Si se llega a este punto es por que hubo cambios en los ISPs caidos\r\
    \n######################################################################\r\
    \n/system/script/run failoverNotificadorIspsCaidos;\r\
    \n\r\
    \n\r\
    \n# Actualizaci\F3n de los ISPs caidos anteriormente\r\
    \n:set foIspsCaidosAnt (\$foIspsCaidos);\r\
    \n\r\
    \n#:log info \"Fin failover-script\";\r\
    \n\r\
    \n")

add name=failoverActualizadorCapacidadesISPs owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
    \_Actualizador de capacidades de ISPs\r\
    \n\r\
    \n:global foIsps;\r\
    \n:global foIspsAnt;\r\
    \n:global foIspsCaidosAnt;\r\
    \n\r\
    \n:local idpcc [/ip/firewall/mangle/find comment=\"fo_bandera_pcc\"];\r\
    \n:local pasos;\r\
    \n\r\
    \n# Eliminaci\F3n de las reglas pcc inservibles, a excepci\F3n de la fo_ba\
    ndera_pcc\r\
    \n:local idsReglasPcc [/ip/firewall/mangle/find per-connection-classifier~\
    \"both-addresses\" and comment!=\"fo_bandera_pcc\"];\r\
    \n\r\
    \n:foreach id in=[\$idsReglasPcc] do={\r\
    \n    /ip/firewall/mangle/remove [find .id=\$id];\r\
    \n}\r\
    \n\r\
    \n# Calculo de los pasos totales\r\
    \n:set pasos 0;\r\
    \n:foreach isp in=[\$foIsps] do={\r\
    \n    :set pasos (\$pasos + (\$isp->1));\r\
    \n}\r\
    \n\r\
    \n# Registro de las nuevas reglas pcc en funci\F3n de los ISPs\r\
    \n:local indiceMaestro 0;\r\
    \nforeach isp in=[\$foIsps] do={\r\
    \n    :for i from=1 to=(\$isp->1) step=1 do={\r\
    \n        :local idIsp (\$isp->0);\r\
    \n        /ip/firewall/mangle/add action=mark-connection chain=prerouting \
    connection-mark=no-mark dst-address-type=!local in-interface-list=LAN \
    new-connection-mark=(\"ISP\".\$idIsp.\"_conn\") \
    per-connection-classifier=(\"both-addresses:\".\$pasos.\"/\".\$indiceMaestro) \
    \r\
    \n        :set indiceMaestro (\$indiceMaestro+1);\r\
    \n    }\r\
    \n}\r\
    \n\r\
    \n# Movimiento de las reglas pcc a su nueva posici\F3n para mantener la pr\
    ioridad\r\
    \n:set idsReglasPcc [/ip/firewall/mangle/find per-connection-classifier~\"\
    both-addresses\"];\r\
    \n:foreach idRegla in=[\$idsReglasPcc] do={\r\
    \n    if (\$idRegla != \$idpcc ) do={\r\
    \n        /ip/firewall/mangle/move [find .id=\$idRegla] destination=\$idpc\
    c\r\
    \n    }\r\
    \n}\r\
    \n\r\
    \n\r\
    \n# Actualizaci\F3n de los ISP anteriores\r\
    \n:set foIspsAnt \$foIsps;\r\
    \n:log info \"Se actualizaron las capacidades de los ISPs\";\r\
    \n\r\
    \n"


add name=failoverActualizadorReglasMangle owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
    \_Actualiador de reglas Mangle\r\
    \n\r\
    \n:global foIsps;\r\
    \n:global foIspsCaidos;\r\
    \n\r\
    \n:local pasos;\r\
    \n:local pasosTmp;\r\
    \n:local estaCaido;\r\
    \n:local idIsp;\r\
    \n:local idsReglas;\r\
    \n:local disabledtmp;\r\
    \n:local idsTmp;\r\
    \n\r\
    \n\r\
    \n# Calculo de los pasos totales\r\
    \n:set pasos 0;\r\
    \n:foreach isp in=[\$foIsps] do={\r\
    \n  :set estaCaido false;\r\
    \n\r\
    \n  :foreach ispCaido in=[\$foIspsCaidos] do={\r\
    \n    :if (\$isp->0=\$ispCaido) do={\r\
    \n      :set estaCaido true;\r\
    \n    }\r\
    \n  }\r\
    \n\r\
    \n  :if (\$estaCaido=false) do={\r\
    \n    :set pasos (\$pasos + (\$isp->1));\r\
    \n  }\r\
    \n}\r\
    \n#:log info \$pasos;\r\
    \n\r\
    \n\r\
    \n:set pasosTmp 0;\r\
    \n:foreach isp in=[\$foIsps] do={\r\
    \n  :set estaCaido false;\r\
    \n  :set idIsp (\$isp->0);\r\
    \n\r\
    \n  :foreach ispCaido in=[\$foIspsCaidos] do={\r\
    \n    :if ((\$isp->0)=\$ispCaido) do={\r\
    \n      :set estaCaido true;\r\
    \n    }\r\
    \n  }\r\
    \n\r\
    \n  # Si el ISP est\E1 ACTIVO se procede a actualizar las reglas con los \
    \"pasos\" correctos\r\
    \n  :if (\$estaCaido=false) do={\r\
    \n    # Obtenci\F3n de los IDs de las reglas del ISP con new-connection-ma\
    rk\r\
    \n    :set idsReglas [/ip/firewall/mangle/find new-connection-mark=\"ISP\$\
    idIsp_conn\" and per-connection-classifier~\"both-addresses\" and comment!\
    =\"fo_bandera_pcc\"];\r\
    \n\r\
    \n    # Por cada ID de la regla se procede a asignar el total de pasos y e\
    l n\FAmero de paso correspondiente\r\
    \n    :foreach idRegla in=[\$idsReglas] do={\r\
    \n      /ip/firewall/mangle/set [find .id=\$idRegla] per-connection-classi\
    fier=\"both-addresses:\$pasos/\$pasosTmp\"\r\
    \n\r\
    \n      #Incremento del contador de pasosTmp\r\
    \n      :set pasosTmp (\$pasosTmp + 1);\r\
    \n    }\r\
    \n\r\
    \n    # Activaci\F3n de las reglas del ISP activo\r\
    \n    :set idsTmp [/ip/firewall/mangle/find new-connection-mark=\"ISP\$idI\
    sp_conn\" and per-connection-classifier~\"both-addresses\" and comment!=\"\
    fo_bandera_pcc\"];\r\
    \n    :foreach idtmp in [\$idsTmp] do={\r\
    \n        :set disabledtmp [/ip/firewall/mangle/get \$idtmp disabled];\r\
    \n        :if ( \$disabledtmp = true ) do={\r\
    \n            /ip/firewall/mangle/enable \$idtmp;\r\
    \n        }\r\
    \n    }\r\
    \n  }\r\
    \n\r\
    \n  # Si el ISP est\E1 CAIDO se procede a desactivar las reglas\r\
    \n  :if (\$estaCaido=true) do={\r\
    \n    :set idsTmp [/ip/firewall/mangle/find new-connection-mark=\"ISP\$idI\
    sp_conn\" and per-connection-classifier~\"both-addresses\" and comment!=\"\
    fo_bandera_pcc\"];\r\
    \n    :foreach idtmp in [\$idsTmp] do={\r\
    \n        :set disabledtmp [/ip/firewall/mangle/get \$idtmp disabled];\r\
    \n        :if ( \$disabledtmp = false ) do={\r\
    \n            /ip/firewall/mangle/disable \$idtmp;\r\
    \n        }\r\
    \n    }\r\
    \n  }\r\
    \n}\r\
    \n\r\
    \n"


add name=failoverDhcpClientRelease owner=admin \
    policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    source="# Script que se encarga de liberar y reiniciar el cliente DHCP\r\
    \n# para las interfaces WAN que han vuelto a tener servicio de internet\r\
    \n:global foIsps;\r\
    \n:global foIspsCaidos;\r\
    \n:global foIspsCaidosAnt;\r\
    \n:global foRelIspInterfaz;\r\
    \n\r\
    \n# Se obtienen los ISPs que estan activos actualmente\r\
    \n:foreach k,isp in=[\$foIsps] do={\r\
    \n  :local idIsp (\$isp->0);\r\
    \n  # Si el ISP no est\E1 caido y estuvo caido anteriormente\r\
    \n  :if ( [:len (\$foIspsCaidos->\$idIsp)] = 0 && [:len (\$foIspsCaidosAnt\
    ->\$idIsp)] != 0) do={\r\
    \n    /ip/dhcp-client/release [find interface=((\$foRelIspInterfaz->\$k)->\
    1)];\r\
    \n  };\r\
    \n};\r\
    \n"


add name=failoverNotificadorIspsCaidos owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=("#\
    \_Notificador de ISPs caidos\r\
    \n\r\
    \n# Variables globales\r\
    \n:global foIspsCaidos;\r\
    \n:global foIspsCaidosAnt;\r\
    \n:global foCorreoAdministrador;\r\
    \n:global foEnvioEmailsNotificacion;\r\
    \n\r\
    \n:local cadIspsCaidos \"\";\r\
    \n:local tiempo;\r\
    \n:local fecha;\r\
    \n:local bndEnvioNotificacion false;\r\
    \n:local identidad [/system identity get name];\r\
    \n\r\
    \n# Impresi\F3n de los ISPs caidos en el Log\r\
    \n:if ( \$foIspsCaidos = {nil} ) do={\r\
    \n    :log warning \"Todos los ISPs se encuentran activos\";\r\
    \n}\r\
    \n\r\
    \n:if ( \$foIspsCaidos != {nil} ) do={\r\
    \n    # Impresi\F3n de los ISPs caidos\r\
    \n    :foreach idIsp in=[\$foIspsCaidos] do={\r\
    \n        :if ( [:typeof \$idIsp] = \"num\" ) do={\r\
    \n            :log warning \"ISP\$idIsp est\E1 caido\";\r\
    \n            :set cadIspsCaidos (\$cadIspsCaidos.\",\".\$idIsp);\r\
    \n        }\r\
    \n    }\r\
    \n}\r\
    \n\r\
    \n\r\
    \n\r\
    \n# Si la bandera de env\EDo de emails de notifaci\F3n est\E1 activa, ento\
    nces\r\
    \n# se env\EDa el e-mail de notificaci\F3n de ISPs caidos\r\
    \n:if ( \$foEnvioEmailsNotificacion = \"si\" ) do={\r\
    \n\r\
    \n    # Envio de correo de notificacion de ISP Caido\r\
    \n    :if ( \$foCorreoAdministrador != \"\" ) do={\r\
    \n        :set tiempo [/system/clock/get time];\r\
    \n        :set fecha [/system/clock/get date];\r\
    \n\r\
    \n        # Env\EDo de correo\r\
    \n        :if ( \$cadIspsCaidos = \"\" ) do={\r\
    \n            /tool/e-mail/send to=\$foCorreoAdministrador subject=\"Route\
    r Balanceador \$identidad\" body=\"El \$fecha a las \$tiempo todos los ISP\
    \_estan activos\" tls=starttls;\r\
    \n        }\r\
    \n\r\
    \n        :if ( \$cadIspsCaidos != \"\" ) do={\r\
    \n            /tool/e-mail/send to=\$foCorreoAdministrador subject=\"Route\
    r Balanceador \$identidad\" body=\"El \$fecha a las \$tiempo los ISP \$cad\
    IspsCaidos se encuentran caidos\" tls=starttls;\r\
    \n        }\r\
    \n\r\
    \n        :log info \"Se envi\F3 la notificaci\F3n\";\r\
    \n        :delay 1;\r\
    \n    }\r\
    \n\r\
    \n    :if ( \$foCorreoAdministrador = \"\" ) do={\r\
    \n        :log info \"No se envi\F3 la notificaci\F3n porque la variable f\
    oCorreoAdministrador esta en blanco\";\r\
    \n    }\r\
    \n}\r\
    \n\r\
    \n\r\
    \n")


add name=lanzadorFailover owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
    \_Script que se encarga de verificar que el failover\r\
    \n# no se est\E9 ejecutando previamente para evitar duplicidad de trabajos\
    \r\
    \n\r\
    \n# Obtenci\F3n del ID del failover\r\
    \n:local idJobEjecucion [/system/script/job/find script=failover];\r\
    \n\r\
    \n# Si el script est\E1 en ejecuci\F3n evita lanzar por segunda vez el scr\
    ipt\r\
    \n:if (\$idJobEjecucion!=\"\" ) do={ :end; }\r\
    \n\r\
    \n# Si no se est\E1 ejecutando previamente se lanza el script\r\
    \n/system/script/run failover\r\
    \n"


/system/scheduler
add interval=10s name=foSchedule1 on-event=lanzadorFailover policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    start-date=jan/01/1970 start-time=00:00:00

Who is online

Users browsing this forum: No registered users and 6 guests