pfsense400x100 freebsd_bumper.sh-600x600

Perfil-ProfileBlogSoporte VorumServer Tools/HerramientasProcedimientosProyectos

Virtual_topologiaRedStub


Bitácora.




Continue Reading

(Visited 90 times, 2 visits today)

pfSense – Forzar servidor dns en la LAN

Captura de pantalla 2

Para ciertos procedimientos, como el ForceSafeSearchGoogle , se necesita que el servidor dns
de la LAN sea unicamente el propio pfSense.

Normalmente vía dhcp server se distribuye el servidor dns a los clientes de la LAN.
Pero siempre cabe la posibilidad de que algun cliente tenga una configuración tcp/ip
estática y se asigne otro servidor dns (como por ejemplo, el de google: 8.8.8.8, etc)

Una forma de evitar que nadie en la LAN use otro servidor dns excepto el propio pfSense,es crear una regla NAT port forward, tal que:

Toda petición dns (al puerto 53, ya sea con protocolo tcp o udp) desde la LAN a cualquier dirección, redirigirla a la ip LAN del pfSense al puerto dns (53)

Esto en la sintaxis del cortafuegos pf en FreeBSD, para una ip lan del pfSense: 10.168.0.254

#…. /tmp/rules.debug

# NAT Inbound Redirects
rdr on em1 proto { tcp udp } from 10.168.0.0/24 to any port 53 -> 10.168.0.254
no nat on em1 proto tcp from (em1) to 10.168.0.0/24
nat on em1 proto tcp from 10.168.0.0/24 to 10.168.0.254 port 53 -> (em1)

#….

# User-defined rules follow

anchor “userrules/*”

#….

pass  in  quick  on $LAN  proto { tcp udp }  from 10.168.0.0/24 to 10.168.0.254 port 53 tracker 1470673362 keep state  label “USER_RULE: NAT rdr-to dns”

Pero como pfSense es orientado a GUI, nada mejor que hacerlo vía GUI. Desde el menú :

Firewall > NAT >  Port Forward. Y creamos la regla:

Captura de pantalla 2

.

Captura de pantalla 1

Nota: como curiosidad, con esta regla nat port forward ya implementada, si se navega desde un firefox en un windows con  servidor dns 8.8.8.8, se navega ok, pero el IE no (al menos en el XPSP3).
Y si se hace un ping a un dominio, este resuelve el dominio vía la ip lan del pfsense,
pero si se usa la utilidad nslookup no resuelve, ya que intentará usar el servidor dns 8.8.8.8

Captura de pantalla 3

Y voila 🙂

(Visited 99 times, 1 visits today)

pfSense – ipfw layer 2 filter (sin activar portal cautivo)

ipfw_enable_and_block_or_allow_mac.zip

ipfw_enable_and_block_or_allow_mac.php

layer2filter

He implementado un script para: Como activar ipfw en pfSense, sin tener activo el Portal Cautivo, y efectuar filtrado de capa 2. El script permite o deniega una mac de origen a una mac de destino en una interfaz de un pfSense (Testeado en pfSense 2.3.2 amd64)

Código del cli php script “/scripts/ipfw_enable_and_block_or_allow_mac.php” en : https://forum.pfsense.org/index.php?topic=116291.msg644789#msg644789

Y voila 🙂

(Visited 76 times, 3 visits today)

pfCentinel V2 – Manager Update Platform/Packages for pfSense Multisite

pfCentinel V2 – Gestor de actualizaciones de plataforma/paquetes para varios sitios pfSense Descarga/Download:

pfCentinel-v2.zip

pfCentinel V 2 – Manager Update Platform/Packages for pfSense Multisite
pfCentinel V 2 – Gestor de actualizaciones de plataforma/paquetes para varios sitios

presenta Lanzo la versión 2 de esta utilidad: Gestor de actualizaciones de Plataforma/Paquetes para varios (Multisite) pfSense. La he testeado con navegador Firefox 47.0.1 en un pfSense 2.3.2 amd64 controlando en remoto las actualizaciones de pfSense con versiones:

  • 2.3
  • 2.3.1
  • 2.3.1_1
  • 2.3.1_5
  • 2.3.2

Tras la actualización de pfSense a la v 2.3.2, el script, si se ejecuta desde un pfSense 2.3.2,  ya no soporta usar localhost (127.0.0.1) como uno de los registros de machines.csv, para 127.0.0.1 dará aviso de NO CONEXION o AUTHENTICATION ERROR. También he comprobado que si se ejecuta el script desde un pfSense con versión menor a 2.3.2, la conexión php ssh (ssh2_connect) contra un pfSense 2.3.2 da NO CONEXION, esto es debido a que pfSense 2.3.2 al actualizar openSSH está usando como algoritmo de intercambio de key ssh2 a curve25519. Por lo que para que el script sea eficiente, se debe de ejecutar en la última actualización de pfSense (a día de hoy V 2.3.2) También, por motivos obvios de seguridad, se recomienda que se usen IPs de túneles, ya que el pfSense que ejecuta el script (Central) efectua conexiones ssh2 sobre los hosts de la base de datos /scripts/machines.csv. Y es recomendable no tener acceso ssh vía interfaz wan, pero sí vía tunel (OpenVPN o IPSec). Diagrama1La mejora de esta versión es que ya no hay que esperar todo el tiempo de ejecución del script con el navegador en blanco. Ahora se mostrará una barra de progreso y el cursor en estilo wait indicando que el proceso del script se está ejecutando (Esto lo he implementado con AJAX/JQUERY/JSON)

 

 

https://twitter.com/i/videos/tweet/759106575135113217

La filosofía o flujo de la utilidad es la misma que su versión 1.:

Primero se aloja el cli php script pfCentinel-Setup-v2.php en un directorio o carpeta como /tmp o /scripts. Se ejecuta desde shell:

# php /scripts/pfCentinel-Setup-v2.php

Y se crea la base de datos /scripts/machines.csv, y si ya existe se pueden añadir más hosts.

setup-aut-err

Tras eso, se aloja el GUI php script pfCentinel-Central-v2.php en la ruta /usr/local/www/ o una subcarpeta por debajo de www, como seria /usr/local/www/pfCentinel/ y se ejecuta dese navegador:

https://ip-pfsense-central/pfCentinel-Central-v2.php

o si se aloja en una subcarpeta:

https://ip-pfsense-central/pfCentinel/pfCentinel-Central-v2.php

La primera vez que se ejecute mostrará algo similar a:

SIExists-machines-csv-first-time

Si no exixtiera el fichero de la bbdd /scripts/machines.csv se veria:

NotExists-machines-csv

Avisando que se debe de ejecutar vía shell pfCentinel-Setup-v2.php para crear la bbdd.

Una vez tengamos la bbdd y ejecutado vía navegador pfCentinel-Central-v2.php, para actualizar los datos solo resta clikar en el botón verde [ + Refresh Now: Status Platforms and Packages ], y se lanzará el proceso.

SIExists-machines-csv-first-time-2

Una vez finalizado, se auto refrescarán los datos, mostrando los resultados (que se guardan en machines.csv, las claves, al igual que la versión 1, se guardan encriptadas). En la columna Local Date Last refresh tendremos la fecha y hora (local del pfSense Central) de la última comprobación de cada registro.

SIExists-machines-csv-first-time-3

pfCentinel-v2.zip

pfCentinel V 2 – Manager Update Platform/Packages for pfSense Multisite
pfCentinel V 2 – Gestor de actualizaciones de plataforma/paquetes para varios sitios

Y voila 🙂

(Visited 203 times, 1 visits today)

pfSense 2.3.2 – Demo de app con PhP/JQuery/JSON y SQLite3

Referencia: https://cybmeta.com/ajax-con-json-y-php-ejemplo-paso-a-paso

He hestado estudiando como trabajar con PhP/JSON/AJAX y/o JQuery y una base de datos SQLite3 en pfSense 2.3.2
Y tras mirar el ejmplo de este pequeño y estupendo tutorial : https://cybmeta.com/ajax-con-json-y-php-ejemplo-paso-a-paso
de Juan Padial . He adapatado su ejemplo en lugar de bbdd MySQL a una bbdd SQLite3.

php-ajax-json-1

Lo primero es crear la bbdd y la tabla y añadir registros:
a ejecutar desde shell:

Borro si existe la tabla cyb_users de la bbdd sqlite3 en fichero /scripts/bbdd_cyb_usersmachines-sqlite3.db

sqlite3 -line /scripts/bbdd_cyb_usersmachines-sqlite3.db ‘DROP TABLE IF EXISTS cyb_users;’

Creo la tabla

sqlite3 -line /scripts/bbdd_cyb_usersmachines-sqlite3.db ‘CREATE TABLE IF NOT EXISTS cyb_users (ID INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, email TEXT, url TEXT);’

Inserto resgistros

sqlite3 -line /scripts/bbdd_cyb_usersmachines-sqlite3.db “INSERT INTO cyb_users (ID, username, email, url) VALUES \
(1, ‘Paco’, ‘thisismy@email.com’, ‘http://miblog.name’), \
(2, ‘Juan’, ‘elcorreode@juan.com’, ‘http://www.misitio.com’), \
(3, ‘Ana’, ‘escribrea@ana.com’, ‘http://lawebdeana.com’);”

Hago una consulta de selección para comprobar los registros de la tabla

sqlite3 -line /scripts/bbdd_cyb_usersmachines-sqlite3.db ‘select * from cyb_users;’
ID = 1
username = Paco
email = thisismy@email.com
url = http://miblog.name

ID = 2
username = Juan
email = elcorreode@juan.com
url = http://www.misitio.com

ID = 3
username = Ana
email = escribrea@ana.com
url = http://lawebdeana.com

Todo OK.

En una carpeta, llamada tests, en la ruta /usr/local/www/tests, alojos el fichero

index.html o index.php con el contenido: (continuar)

Continue Reading

(Visited 28 times, 1 visits today)

pfSense 2.3.x – Operaciones con script PhP con base de datos SQLite3

Referencias:

pfsense-php-sqlite3

Estaba pensando instalar el servidor de bbdd relacionales MySQL en pfSense.
Pero tras comprobar que los packages (pkg) en realidad se indexan en pfSense 2.3 en base de datos sqlite3:

Ergo pfSense 2.3 ya tiene su propio motor de gestión de bbdd relacionales de serie 🙂 , y es SQLite3.

Así que he testeado como operar desde un script php con una bbdd sqlite en pfSense 2.3:

Lo básico en SQL:

  • -Crear una bbdd
  • -Crear una tabla
  • -Borrar una tabla
  • -Crear o insertar un registro
  • -Actualizar un registro
  • -Efectuar una consulta de selección
  • -Cerrar la bbdd

Desde shell también se puede operar directamente con un fichero de bbdd sqlite3:
Por ejemplo una consulta de selección:

El código PhP:

<?php

?>

Y voila 🙂

(Visited 61 times, 1 visits today)

pfCentinel V 1.0 Beta – Manager Update Platform/Packages for pfSense Multisite

Descarga/Download:

pfCentinel-V1-Beta.zip

pfCentinel V 1.0 Beta – Manager Update Platform/Packages for pfSense Multisite
pfCentinel V 1.0 Beta – Gestor de actualizaciones de plataforma/paquetes para varios sitios pfSense

pfCentinel V 1.0 Beta – Gestor de actualizaciones de plataforma/paquetes para varios sitios pfSense

Esta utilidad sirve para tener un control de actualizaciones de la plataforma y los paquetes de varios pfSense.

Son dos scripts en php que se ejecutan desde un host pfSense (al que llamaré central) y efectua vía php conexiones ssh2 sobre los hosts pfSense remotos a controlar sus actualizaciones con comandos ssh/bash

pfcentinel-setup-ya-existe-machines-00

Condiciones necesarias:
Tanto el host pfSense (central) que corre los scripts como los hosts pfSense remotos para comprobar las actualizaciones deben de tener activada la Consola ssh
( Enable Secure Shell – sshd ) y ser accesibles vía puerto tcp22.

(Esto es fácil de comprobar: hacer desde la shell del pfSense central un ssh sobre otro pfSense remoto
para el usuario root: # ssh root@ip–otro-pfSense y ver si hay conectividad y acceso/validación ok)

Condiciones recomendables:
Se recomienda que el host que ejecuta los scripts se conecte a los otros hosts vía Tunel (openVPN o IPsec), ya que se supone que los otros hosts son remotos y externos a la LAN del pfSense Central. Y por defecto pfSense bloquea en su interfaz WAN este tipo de acceso.
Es decir evitar dejar un acceso ssh vía WAN a los pfSense y trabajar de forma segura vía tunnel.

La utilidad se compone de 2 scripts php

1.- pfCentinel-Setup.php
2.- pfCentinel-central.php

El 1.- pfCentinel-Setup.php sirve para crear la base de datos de los hosts a controlar o añadir más host a esa bbdd.

pfcentinel-setup-ya-existe-machines-0

La bbdd es un simpe fichero csv, alojado en la ruta /scripts/machines.csv

La bbdd guarda en sus registros los campos:

“descr”;”host”;”platform”;”packages”;”user”;”password”

-Descripción del pfSense remoto, por ejemplo: pfMadrid
-Host del pfSense remoto, la IP del pfSense remoto (altamente recomendable que sea una IP de un tunel openVPN o IPSec)
-Plataforma: la plataforma del pfSense remoto y si necesita update y la versión disponible del update
Valores posibles (por ejemplo):
===============================
CURRENT-2.3.1_5 = Esta al día, no hay update
2.3-UPDATE-to-2.3.1_5 = HAY UN UPDATE (versión actual – UPDATE a – versión disponible)
NO_CONEXION = No hay conectividad al host remoto
ERROR_AUTENTICACION = Hay conectividad pero hay un error de validación ssh2 de usurio:clave en host remoto
-Packages: Si existe algún paquete para actualizar
Valores posibles:
=================
CURRENT = Está al día, no hay updates de paquetes
NO_CONEXION = No hay conectividad al host remoto
ERROR_AUTENTICACION = Hay conectividad pero hay un error de validación ssh2 de usurio:clave en host remoto
UPDATES = Hay actualizaciones de paquetes disponibles.
-User, el usuario para conectarse vía ssh2 al host remoto, usualmente root
-Password, la clave de User para acceder vía ssh2 al host remoto.
En este campo se guarda la clave encriptada para cada host

Se recomienda alojar este script php cli: pfCentinel-Setup.php en un directorio no accesible desde web gui, como por ejemplo el directorio /scripts , o /tmp

Para ejecutar este script (se hace vía shell), si estuviera alojado en la carpeta scripts:

/usr/local/bin/php /scripts/pfCentinel-Setup.php

Al ejecutar viá shell o cli o consola el script pfCentinel-Setup.php, la primera vez, nos irá preguntando por los datos de cada host
(cuando pregunte la clave, no se verá por consola, y se guarda de forma encriptada en machines.csv, por seguridad)

pfcentinel-setup-ya-existe-machines-2

Y hará un test de conectividad, si este da NO CONEXION es que no hay conectividad a ese host vía ssh2,
pero se puede añadir a la bbdd ( An?adimos pftest1 a /scripts/machines.csv ?(y/n):y ) u optar por no añadirlo

Si da un ERROR DE AUTENTICACION, idem al caso anterior, lo normal seria no añadirlo a la bbdd hasta que nos de un Test OK

Y si el test es OK nos mostrará el estado de UPDATES de plataforma y paquetes

Para cortar el bucle del script, a la pregunta:

Continuamos? (y/n):n

Contestar n ( = no), y para continuar, contestar y ( = yes)

Si ya existe el fichero de la bbdd /scripts/machines.csv al volver a ejecutarse este script,
nos avisará mostrando la bbdd y dandonos opción a añadir más hosts

pfcentinel-setup-ya-existe-machines-1

Una vez tengamos la bbdd lista, ya podemos ejecutar desde web gui el script:

2.- pfCentinel-central.php

Este script hay que alojarlo en la ruta:

/usr/local/www/
o
/usr/local/www/pfCentinel/ (u otra subcarpeta debajo de www)

para que sea accesible vía web gui.

Accedemos a la web gui del pfSense central, nos validamos user:pass, y en el navegador indicamos la ruta al script:
Por ejemplo:

https://10.20.10.203/pfCentinel/pfCentinel-central.php

si lo hubiésemos alojado el script en /usr/local/www/pfCentinel-central.php el link seria:

https://10.20.10.203/pfCentinel-central.php

Para 5 hosts tardará de media 1 minuto o menos el script pfCenter-central.php
Por cada host se toma de 10 a 30 sg, en mi entorno de red, para unos 9 host me ha tardado un minuto (58sg).
Hasta que el script no haya recorrido todos los registros de /scripts/machines.csv no va a mostrar nada en el navegador
así que paciencia 🙂

Así que recomiendop no tener una bbdd de más de 15 registros, ya que puede dar el error Gateway Time Out el script y no mostrar nada.

Por lo que para empezar yo probaria la primera vez el script con no más de 10 host pfSense en la bbdd, con 5 seria un buen test.
(De todas formas pocos admins tienen más de 15 pfSense que administrar 🙂 , aunque haberlos haylos)

(En otra versión más adelante cuando controle mejor AJAX (solo con php no se puede mostrar cada registro uno a uno),
podré subsanar esto haciendo que se vaya mostrando cada registro en el navegador en tiempo real)

Una vez termine el scriopt se mostrarán los resultados, y en caso de algún registro con un UPDATE presentará el link para su actualización
(el link funcionará si hay una web gui validada a ese host pfSense)

pfcentinel-setup-ya-existe-machines-3

Se podria automatizar la actualización de la platforma y/o paquetes vía script, pero creo que es un asunto delicado dejar automatizada
updates en un firewall, ya que es la piedra angular o factor crítico de cualquier infraestructura de una red.
Mejor que sea asistida por un técnico o admin, siempre pueden haber sorpresas… 🙂

La página que muestra tiene un campo: Remote Date Last refresh. Muestra la última comprobación de Update del script, pero con la fecha y hora remota
,no la del host central

La tabla que se muestra en la página se puede ordenar clikando en los campos, como por ejemplo en el campo: Remote Date Last refresh

La página tiene un botón Refresh, para volver a lanzar el script, no recomiendo hacer esto más de una  o dos veces al día en un pfSense central en
producción con alta carga de red, ya que el script abre sockets (tcp22) y consume tiempo de cpu y algo de cantidad de ram, y ya se sabe que un firewall, cuanto
menos se le sature, mejor.

Si se ejecutara este script pfCentinel-central.php sin que exista /scripts/machines.csv daria el aviso:

Ejecute vía shell pfCentinel-Setup.php para crear fichero machines.csv, y depues de crearlo, refresque esta página.

EXECUTE via shell pfCentinel-setup.php for CREATE FILE machines.csv:
after create it, refresh this page

pfcentinel-setup-ya-existe-machines-4

Y voila 🙂

(Visited 403 times, 1 visits today)

pfSense – PhP script – Configurar vía script Email smtp Notifications con cuenta de gmail

ref: http://blog.lzahq.tech/2015/01/08/Using-pfSense’s-PHP-Shell/

setupEmailNotifications

Un php cli script para configurar las notificaciones de email smtp de pfSense con una cuenta de gmail.

<?php

?>

Y voila 🙂

(Visited 68 times, 1 visits today)

pfSense – PhP Scripting – Crear Cron

createcron

Un php script para crear un cron (si no existiera ya su comando en la tabla de cron) en pfSense.

Y voila 🙂


Nota: la penúltima linea es (cosas del plugin de wp que no me parsea ok 🙂  )

$config[‘cron’][‘item’][$j][‘command’] = “/usr/local/bin/php /usr/APROBAR/www/vorumserver/of_mail_package_platform_status.php 2&gt;&amp;1”;


Nota mental: Tengo que mirar este estupendo tutorial sobre como Managing Cron Jobs with PHP
No es referido a pfSense, pero a primer vistazo es un tutorial de lujo 🙂
http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php-2–net-19428

(Visited 45 times, 1 visits today)

pfSense 2.3.x – Obtener lista de Pike project para bloquear Tor con pfBlockerNG

pikeTor.php

PikeTor.php – Pike Project PhP code adapted for pfSense 2.3.x
For download Pike Tor List and parsing to pfBlockerNG IPv4 list

Referencias:

pikeTor

El proyecto Pike project, provee una lista de nodos Tor activos las últimas 48hrs y actualizada cada 10 minutos (entre otras listas, como de proxies anonimos, etc).

Tor nodes list with the active nodes in the last 48h updated 10 minutes ago.

Para implementar esta lista en una lista IPv4 de pfBlockerNG, hay que descargarla y “parsearla” al formato del paquete pfBlockerNG.

El proyecto Pike brinda un código en PhP para bajarse la lista en formato Json y pasarla a un array . He modificado ese código para que se pueda ejecutar como un cli php script en pfSense 2.3.x (testeado en 2.3.1_5), se baje la lista, la parsee y la aloje en /usr/local/www/pikeTor.dat .

Alojandoo el script pikeTor.php en un directorio, como por ejemplo /scripts ( /scripts/pikeTor.php ), y definiendo un Cron para que ejecute ese script, por ejemplo, cada x horas, tendremos la lista actualizada cada x horas.

Simplemente habrá que añadir en pfBlockerNG en su IPv4 una lista con la ruta :

/usr/local/www/pikeTor.dat

Y efectuar un Update en pfBlockerNG.

El código

Y voila 🙂

(Visited 128 times, 1 visits today)

pfSense – PhP – fichero csv a Array y encriptar-desencriptar password

ENCRYPT-DECRYPT

Como estoy en un proyecto de desarrollo de pfSense con PhP, donde necesito:

Leer un fichero csv y pasar el contenido a un array (construir un array desde un csv)
-Hay un campo “password” que por seguridad debe guardarse encriptado en el fichero csv
-Y al leerse el campo “password” del csv , se pueda desencriptar.

Tras googlear un rato, lo he solucionado de la siguiente manera:

El fichero /scripts/machines.csv

Las funciónes y el comando que leen el fichero /scripts/machines.csv y lo pasan a un array

La función que encripta/desencripta

Lo implemento en el código html/php (muy resumido, a modo de ejemplo):

//…
foreach ($a_hosts as $hostent):
?>
<td>
<!– desencriptado –>
<?=fenydesencripta($hostent[‘password’], false)?>
</td>
<td>
<!– encriptado –>
<?=fenydesencripta(fenydesencripta($hostent[‘password’], false), true)?>
</td>
<!– …. ->

 

Y voila 🙂

(Visited 44 times, 1 visits today)