Archivo de la categoría: node

«Mapear» accesos al servidor I

Jugando con node se me ocurrió que debería pintar el origen de los accesos al servidor de Norsip. Por el momento lo he limitado a los puertos 21,22 y 80.

(Instrucciones para un servidor debian/ubuntu el resto… pos… eso…)

 

Iptables

Primero necesitamos datos, los vamos a sacar de iptables, para ello añadiremos 3 nuevas reglas a iptables (solo guardamos conexiones nuevas):

# LOG SSH
iptables -A INPUT -p tcp -m tcp -m state --dport 22 --state NEW -j LOG --log-prefix "[IPTABLES " --log-level 4
# LOG WWW
iptables -A INPUT -p tcp -m tcp -m state --dport 80 --state NEW -j LOG --log-prefix "[IPTABLES " --log-level 4
# LOG FTP
iptables -A INPUT -p tcp -m tcp -m state --dport 21 --state NEW -j LOG --log-prefix "[IPTABLES " --log-level 4

Ahora necesitamos que estos logs vayan a un archivo específico del sistema: crearemos un fichero netlog.log en /var/log/ y le damos los permisos adecuados.

touch /var/log/netlog.log
chmod 600 /var/log/netlog.log
chown root:adm /var/log/netlog.log

 

Syslog

Y ahora necesitamos que los eventos de iptables se redirijan a este fichero, por lo crearemos un filtro en syslog:

cd /etc/rsyslog.d/
nano 21-iptables.conf

Con este contenido

# Guardar todos los mensajes que comiencen por [IPTABLES en el fichero de antes
:msg,startswith,"[IPTABLES" /var/log/netlog.log
# y no procesar mas estos mensajes, para que no vayan a otros logs
& ~

Guardamos con Ctrl+X Y y listo, ahora reiniciamos syslog:

sudo service rsyslog restart

Y deberemos empezar a ver logs:

Sep 27 17:14:48 h kernel: [IPTABLES IN=eth0 OUT= MAC=02:00:97:50:89:4c:10:f3:11:10:50:68:08:00 SRC=2.139.235.246 DST=151.80.137.76 LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=19984 DF PROTO=TCP SPT=55592 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
Sep 27 17:15:03 h kernel: [IPTABLES IN=eth0 OUT= MAC=02:00:97:50:89:4c:10:f3:11:19:bf:68:08:00 SRC=2.139.235.246 DST=151.80.137.76 LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=20271 DF PROTO=TCP SPT=55593 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
Sep 27 17:15:03 h kernel: [IPTABLES IN=eth0 OUT= MAC=02:00:97:50:89:4c:10:f3:11:19:bf:68:08:00 SRC=2.139.235.246 DST=151.80.137.76 LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=20270 DF PROTO=TCP SPT=55594 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0

Segunda parte: https://blog.norsip.com/2017/09/27/mapear-accesos-al-servidor-ii/

Mini #smartSantander

Iberobotics

Con el objetivo de escenificar un pequeño #smartSantander para echar un cable a Iberobotics en el Nautilus Lab nos hemos puesto manos a la obra, hemos hecho un sensor bastante simple que mide la intensidad lumínica con una LDR y una Arduino Ethernet, un «servidor» con una Raspberry Pi B y Node.js  y un demostrador básico con otra Arduino Ethernet y un servo que hace las veces de indicador.

No nos hemos complicado mucho: cada 100mS el sensor mide la intensidad y envía al servidor un comando «guardar sensor 0 valor».
A su vez nuestro indicador envía también cada 100mS al servidor una solicitud «recoger sensor 0» por la que el servidor le devuelve el valor de la intensidad, que adapta al recorrido del servo y muestra.

Aquí abajo os dejamos el código de las 3 aplicaciones, por si queréis echar un vistazo 🙂

-Sensor de luminosidad:

Sensor de luminosidad mini #smartSantander

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
IPAddress ip(192,168,1,21);

// initialize the library instance:
EthernetClient cliente;

char serverName[] = "192.168.1.37";

void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);

  Serial.println("Pidiendo IP por DHCP...");
  if (!Ethernet.begin(mac)) {
    Serial.println("Falló, la ponemos por defecto.");
    Ethernet.begin(mac, ip);
  }
  Serial.print("IP Local:");
  Serial.println(Ethernet.localIP());
  connectToServer();
}

int nSensor=0; // Que sensor tenemos
void loop() {
  int sensorValue;
  sensorValue = analogRead(A0); // Leemos el valor
  Serial.println(sensorValue);
  analogWrite(9, sensorValue*2); // Representamos el valor en la intensidad de un led

  if (cliente.connected()) { // Si estamos conectados al servidor
    cliente.print('g'); // Enviamos el comando de guardar
    cliente.print(nSensor); // Enviamos el número de sensor
    cliente.println(sensorValue); // Enviamos el valor que hemos leído del sensor
    cliente.stop(); // Desconectamos
  } else { // Si no estamos conectados
    connectToServer();
  }
  delay(100);
}

void connectToServer() {
  Serial.println("Conectamos con el servidor");
  if (cliente.connect(servidor, puertoServidor)) {
      Serial.println("conectados...");
  } else {
    delay(1500);
    Serial.println("esperamos...");
  }
}

 

-Servidor «nube» de mini #smartSantander:

Servidor "nube" mini #smartSantander

 

// Load the TCP Library
var net = require('net');

var datos=[0,0,0,0,0];

//Start a TCP Server
net.createServer(function (socket) {
	// Identify this client
	socket.name = socket.remoteAddress + ":" + socket.remotePort ;
	console.log(getDateTime() + ">" + socket.name+" <Hola>");
	socket.on('data', function (data) {
		try {
			data=''+data;
			var orden=data.substr(0,1);
			var nSensor=parseInt(data.substr(1, 1));
			var valor=parseInt(data.substr(2));
			switch (orden) {
				case '?':
					console.log(getDateTime() + ">" + socket.name+" >> Nos piden datos del sensor " + nSensor);
					socket.write(String.fromCharCode(datos[nSensor]+32));
					break;
				case 'g':
					console.log(getDateTime() + ">" + socket.name+" >> Nos envian datos del sensor " + nSensor + ": "+ valor);
					datos[nSensor]=valor;
					break;
				default:
					console.log(getDateTime() + ">" + socket.name+" >> Comando desconocido: " + data);
					break;
			}
		} catch (e) {
			console.log(getDateTime() + ">> Error");
			console.log(e);
		}
		//socket.end();
	});

	socket.on('end', function () {
		console.log(getDateTime() + ">" + socket.name+" <Adios>");
	});
}).listen(8081);

console.log(getDateTime() + ">" + "Escuchando...");

function getDateTime() {

    var date = new Date();

    var hour = date.getHours();
    hour = (hour < 10 ? "0" : "") + hour;

    var min  = date.getMinutes();
    min = (min < 10 ? "0" : "") + min;

    var sec  = date.getSeconds();
    sec = (sec < 10 ? "0" : "") + sec;

    var year = date.getFullYear();

    var month = date.getMonth() + 1;
    month = (month < 10 ? "0" : "") + month;

    var day  = date.getDate();
    day = (day < 10 ? "0" : "") + day;

    return day+'/'+month+'/'+year + " " + hour + ":" + min + ":" + sec;

}

-Demostrador:

Demostrador mini #smartSantander

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>

Servo servo;

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
IPAddress ip(192,168,1,20);

// initialize the library instance:
EthernetClient cliente;

char servidor[] = "192.168.1.37";
int puertoServidor=8081;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  servo.attach(9);

  // attempt a DHCP connection:
  Serial.println("Pidiendo IP por DHCP...");
  if (!Ethernet.begin(mac)) {
    // if DHCP fails, start with a hard-coded address:
    Serial.println("Falló, la ponemos por defecto.");
    Ethernet.begin(mac, ip);
  }
  Serial.print("IP Local:");
  Serial.println(Ethernet.localIP());
  connectToServer();
  servo.write(180);
}

int nSensor=0; // Que número de sensor nos interesa
void loop() {
  if (cliente.connected()) { // Si estamos conectados
    Serial.println("Pedimos datos...");
    cliente.print('?'); // Comando para pedir datos
    cliente.print(nSensor); // Enviamos el número de sensor del que queremos los datos
    delay(100); // Esperamos un poco
    if (cliente.available()) { // Comprobamos si hay datos disponibles
      // leemos el dato
      int inChar = cliente.read();
      int valor=(inChar-32)*4; // Adaptamos el dato (0-40) al rango de nuestro servo (0-180)
      Serial.print("Valor:");
      Serial.println(valor);
      servo.write(180-valor); // Lo mandamos al servo
    }
    cliente.stop(); // Cerramos la conexión
  } else { // No estamos conectados
    connectToServer(); // Nos conectamos
  }
  delay(100);
}

void connectToServer() {
  Serial.println("Conectamos con el servidor");
  if (cliente.connect(servidor, puertoServidor)) {
      Serial.println("conectados...");
  } else {
    delay(1500);
    Serial.println("esperamos...");
  }
}