script – Zeque.com.ar | Linux, Mikrotik, Noticias… https://www.zeque.com.ar Temas que me salvaron alguna vez, los comparto acá Wed, 17 Jan 2018 12:27:43 +0000 en-US hourly 1 https://wordpress.org/?v=6.5 Restringir sitios en MikroTik con DNS y Firewall https://www.zeque.com.ar/restringir-sitios-en-mikrotik-con-dns-y-firewall/ https://www.zeque.com.ar/restringir-sitios-en-mikrotik-con-dns-y-firewall/#respond Mon, 15 Jan 2018 20:32:41 +0000 http://www.zeque.com.ar/?p=589 Hace unos meses surgió la necesidad de habilitar ciertos sitios y bloquear el resto en equipos remotos con tráfico satelital medido  (algunos con solo 40MB mensuales).
El problema que tuve es que las consultas DNS terminaban consumiendo el tráfico mensual en un par de semanas.
Para solucionar esto en el DNS del mikrotk agregué de manera estática los dominios que quería tener habilitados, entonces el script lo que hace es recorrer cada sitio del DNS, actualizar su IP y agregarla en un address-list en el firewall para que permita su tráfico.

Requiere RouterOS 6.2+ debido a que antes no estaba la opción on-error para tomar acción ante un error.

:foreach a in=[/ip dns static find] do={
        :global nombre
        :set nombre [/ip dns static get $a name]
        :global ip
        :global resuelto
        :set ip [/ip dns static get $a address  ]
        :global iporig
        :set iporig [:put [/ip dns  static get [/ip dns static find name=$nombre] value-name=address ]]
        /ip dns static remove $a
        :if ( [:do {[:set resuelto [:put [ :resolve $nombre server=8.8.8.8 ]]]} on-error={:set resuelto [put $iporig]}] != "") do={
                /ip dns static add address=$resuelto name=$nombre
        } else={
                /ip dns static add address=$iporig name=$nombre
}
        :put $nombre
}

:foreach a in=[/ip dns static  find  ] do={
:do { /ip firewall address-list add list=habilitadas address=[ :put [/ip dns static  get $a address   ] ] comment=[:put [/ip dns static get $a name]] } on-error {:log info "ya existe"}
} 

Luego hay que hacer las reglas en el firewall para que permita el tráfico forward del address-list habilitadas, forzar a que cualquier consulta DNS sea redirigida al mikrotik y no olvidarse de agregar una tarea programada para que corra el script.
Reglas NAT:

/ip firewall nat
add action=masquerade chain=srcnat src-address=192.168.0.0/24
add action=redirect chain=dstnat dst-port=53 protocol=tcp to-ports=53
add action=redirect chain=dstnat dst-port=53 protocol=udp to-ports=53

Reglas firewall:

/ip firewall filter
add action=reject chain=forward dst-address-list=!habilitadas dst-port=80 \
    protocol=tcp reject-with=tcp-reset
add action=reject chain=forward dst-address-list=!habilitadas dst-port=443 \
    protocol=tcp reject-with=tcp-reset

Nota: A partir de RouterOS 6.36+ ya se pueden generar address-list por nombre

]]>
https://www.zeque.com.ar/restringir-sitios-en-mikrotik-con-dns-y-firewall/feed/ 0
Backup muy simple https://www.zeque.com.ar/backup-muy-simple/ https://www.zeque.com.ar/backup-muy-simple/#respond Fri, 23 Sep 2016 16:02:11 +0000 http://www.zeque.com.ar/?p=564 Me han preguntado varias veces como hacer un backup simple, usando alguna herramienta liviana para usar en una única PC.

Una manera muy simple es configurando una tarea programada utilizando las comillas de ejecución para definir el nombre del archivo con la fecha actual en un buen formato.

tar cjf /backups/`date -I`.tar.bz2 /var/www/misitio.com
rm -rf /backups/`date -I --date="10 days ago"`.tar.bz2

Si no encontrás las comillas de ejecución lo podés hacer de esta otra forma

tar cjf /backups/$(date -I).tar.bz2 /var/www/misitio.com
rm -rf /backups/$(date -I --date="10 days ago").tar.bz2

El comando date -I devuelve la fecha en formato YYYY-MM-DD por lo que nos quedará un archivo diario con el nombre 2016-09-23.tar.bz2

Luego aplicamos con date -I –date=”10 days ago” para que calcule la fecha de hace 10 días. De esta manera tendremos un backup diario manteniendo los últimos 10 días, para evitar que se llene el disco.

Obviamente se puede ir mejorando. Hacer que envíe un email si terminó el backup correctamente.

tar cjf /backups/$(date -I).tar.bz2 /var/www/misitio.com && echo "Backup OK"|mail miemail@dominio.com -s "Backup OK""

El && permite que si el tar finaliza correctamente envíe un email. También se puede hacer con || (doble pipe) para que envíe un email solo si el tar falló.

Esto es para algo muy simple, hacer backup en una PC y unos pocos directorios. Para cosas más complejas o múltiples equipos ya pueden utilizar herramientas como Bacula.

Saludos!

]]>
https://www.zeque.com.ar/backup-muy-simple/feed/ 0
Buscar y borrar archivos con find https://www.zeque.com.ar/buscar-y-borrar-archivos-con-find/ https://www.zeque.com.ar/buscar-y-borrar-archivos-con-find/#comments Fri, 14 Mar 2014 16:02:07 +0000 http://www.zeque.com.ar/?p=450 Con el comando find no solo podremos buscar de manera avanzada archivos (por usuario, permiso, fecha de modificación, etc), sino también tomar una acción como borrar, mover, etc.

Ejemplo para borrar todos los achivos .tmp en todo el disco

find / -name "*.tmp" -delete

Borrar todos los archivos que tengan más o menos  N días

#Su fecha de creación mayor a 14 días
find /directorio -ctime +14 -delete
#Su fecha de modificación menor a 20 días
find /directorio -mtime -20 -delete

Mover todos los .mp3 a un directorio

#Busca dentro de home y mueve a /directorio-de-mp3s
#-iname es para insensitive, que no distinga mayúsculas/minúsculas
#OJO la línea termina con \;
find /home -iname "*.mp3" -exec mv {} /directorio-de-mp3s \;

Buscar y Borrar todos los archivos de un usuario

find / -user usuario1 -delete

Se pueden combinar múltiples parámetros como user, ctime y name

]]>
https://www.zeque.com.ar/buscar-y-borrar-archivos-con-find/feed/ 1
Cantidad de conexiones por Puerto https://www.zeque.com.ar/cantidad-de-conexiones-por-puerto/ https://www.zeque.com.ar/cantidad-de-conexiones-por-puerto/#respond Thu, 19 Sep 2013 19:32:51 +0000 http://www.zeque.com.ar/?p=357 Con este script puede saber la cantidad de conexiones por IP a un puerto

#X.X.X.X es la IP de nuestra interfaz pública
#YY es el puerto
#El script solo mostrará aquellas IPs con más de 10 conexiones


netstat -plan|grep X.X.X.X:YY|awk {'print $5'}| cut -d':' -f 1|sort|uniq -c|sort -nk 1 | awk '{if ($1 > 10) print "IP:\t" $2 "\t Conexiones: " $1 }'
Ejemplo:

Si mi servidor tiene configurada la IP 200.0.0.1 y quiero ver la cantidad de conexiones en el puerto 80, ejecuto lo siguiente:


netstat -plan|grep 200.0.0.1:80|awk {'print $5'}| cut -d':' -f 1|sort|uniq -c|sort -nk 1 | awk '{if ($1 > 10) print "IP:\t" $2 "\t Conexiones: " $1 }'


 

]]>
https://www.zeque.com.ar/cantidad-de-conexiones-por-puerto/feed/ 0
Borrar archivos con cierto texto https://www.zeque.com.ar/borrar-archivos-con-cierto-texto/ https://www.zeque.com.ar/borrar-archivos-con-cierto-texto/#respond Fri, 21 Dec 2012 18:58:03 +0000 http://www.zeque.com.ar/?p=230 Para borrar archivos con un determinado texto o contenido se puede realizar lo siguiente:

Opciones grep:

-i ignora diferencia mayúsculas/minúsculas
-r recursivo en los directorios (OJO!)
-l si el patrón coincide, devuelve el nombre del archivo

for archivo in `grep -irl viagra ./`; do  rm “$archivo”;done

Para asegurarse que es lo que se va a borrar, puede añadirse un echo frente al rm

for archivo in `grep -irl viagra ./`; do  echo rm “$archivo”;done

De este modo nos mostrará el listado de archivos a borrar

 

]]>
https://www.zeque.com.ar/borrar-archivos-con-cierto-texto/feed/ 0
Exportar/backup MySQL en archivos separados https://www.zeque.com.ar/exportar-mysql-en-archivos-separados/ https://www.zeque.com.ar/exportar-mysql-en-archivos-separados/#respond Thu, 15 Nov 2012 21:21:39 +0000 http://www.zeque.com.ar/?p=200 Con este script y el mysqldump exportaremos cada una de las bases de datos en archivos separados por el nombre de la DB y la fecha actual.
Es conveniente crear un usuario con todos los permisos excepto DROP y TRUNCATE


# -c (INSERT completo, incluyendo nombre de columnas)
# -R (ROUTINES, funciones o store-procedures)
# -Q (pone tablas y columnas entre comillas)
# -u (define el usuario con el que va a exportar)
# -E (exporta eventos)


#!/bin/sh
for db in `mysql -u backup –password=m1Sup3rCl4ve -Be ‘show databases’`; do
if [ $db != “Database” ]; then
/usr/local/mysql/bin/mysqldump -c -E -R –skip-lock-table –add-drop-table -Q -u backup –password=m1Sup3rCl4ve $db | gzip -1 -c > /mnt/backup/$db-$(date -I).sql.gz;
fi
done

]]>
https://www.zeque.com.ar/exportar-mysql-en-archivos-separados/feed/ 0
Agregar registro a multiples zonas en bind https://www.zeque.com.ar/agregar-registro-a-multiples-zonas-en-bind/ https://www.zeque.com.ar/agregar-registro-a-multiples-zonas-en-bind/#respond Fri, 02 Nov 2012 20:06:19 +0000 http://www.zeque.com.ar/?p=192 Agregar en el BIND DNS un registro SPF a multiples zonas que no lo tengan configurado:

En mi caso cada archivo de zona tiene el nombre del dominio. En algunos casos es db.nombrededominio.conf.


for spf in `egrep -iL 'spf1' *.com.ar`; do echo "$spf. IN TXT \"v=spf1 mx ip4:direccionip mx:mail.$spf -all\"" >> $spf;done

]]>
https://www.zeque.com.ar/agregar-registro-a-multiples-zonas-en-bind/feed/ 0