Double NAT

Spesso mi trovo lontano dalla mia rete “casalinga” ed ho la necessita’ di dovermi collegare per le normali operazione di manutenzione e/o per accedere al NVR.

Ho Raspeberry Pi 3 perennemente collegato in VPN su un server esterno e tramite di esso posso collegarmi con alla  mia  sottorete.

Di seguito un disegno della topologia della mia rete

Sul Raspeberry Pi :

sysctl -w net.ipv4.ip_forward=1

iptables -A FORWARD -j ACCEPT
iptables -t nat -A PREROUTING -p tcp –dport 12345 -j DNAT –to 192.168.2.254:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.2.254 –dport 80 -s 10.100.10.22 -j SNAT –to-source 192.168.1.2

sudo iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –to 192.168.1.120:80
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.120 –dport 80 -s 10.100.10.22 -j SNAT –to-source 192.168.1.2

Telecamere sul rasp3

sudo iptables -t nat -A PREROUTING -p tcp –dport 37777 -s 10.100.100.0/24  -j DNAT –to 192.168.1.20
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.20 –dport 37777 -s 10.100.100.0/24 -j SNAT –to-source 192.168.1.2

Nota: --to-source va cambiato con 192.168.2.2 nel caso il rasp3 abbiamo solo ip 192.168.2.2

Tramite queste rules possiamo debuggare le rules di iptables

sudo iptables -t raw -A PREROUTING -p tcp -s 10.100.100.0/24 –dport 80 -j LOG
sudo iptables -t raw -A OUTPUT -p tcp –destination 192.168.2.0/24 –dport 80 -j LOG

iptables -t nat -I PREROUTING 1 -j LOG –log-level 7 –log-prefix “PREROUTING :

iptables -t nat -I POSTROUTING 1 -j LOG –log-level 7 –log-prefix “POSTROUTING : ” iptables -t nat -I OUTPUT 1 -j LOG –log-level 7 –log-prefix “NAT OUTPUT : “

On rasp3

route add -net 10.100.100.0/25 dev tun0

OpenVPN Python Firewall

Python Firewall

Da un mese a questa parte mi e’ capitato di controllare i logs del mio demone VPN (OpenVPN) e trovare “strani” messaggi tipo questo

an 29 19:32:22 openvpn[1715]: 87.162.209.63:43237 TLS Error: TLS handshake failed
Jan 29 19:32:22 openvpn[1715]: 87.162.209.63:43237 SIGUSR1[soft,tls-error] received, client-instance restarting
Jan 29 19:32:23 openvpn[1715]: 87.162.209.63:6235 TLS Error: TLS key negotiation failed to occur within 60 second

Una rapida ricerca su google sul codice di errore mi porta a pensare che qualcuno sta cercando di autenticarsi sul mio server usando un protocollo diverso rispetto a quello impostato.

La soluzione piu’ ovvia sarebbe quella di cambiare la porta su cui il demone VPN e’ in ascolto (port 1194), con una meno conosciuta… ma purtroppo questo non puo’ essere il mio caso perche’ alcuni miei client hanno tutte le porte bloccate tranne quella di default.

La mia soluzione e’ stata quella scrivere un piccolo script in python il quale ha il compito di leggere il file di log ogni ora (esattamente 12 minuti dopo ogni scoccare di ora)

12 * * * * python /home/unicondor/pythonFirewall/OpenVpnParser.py -s /var/log/openvpn > /home/unicondor/out.txt 2>&1

ed andare a prendere quelli IP che per 50 volta hanno provato ad autenticarsi sul server VPN.

Una volta avuta questa lista, possiamo procedere con l’aggiornare iptables e la chain di INPUT droppando tali ip

# iptables -A INPUT -s ip_to_block -j DROP

Lo script in python e’ disponibile al seguente indirizzo

https://github.com/flaviopace/pythonOpenVpnIpBlocker

Tmux e WeeChat – Scaricare da IRC senza avere la shell attiva

Da un pò di tempo ho riscoperto IRC e le sue enormi potenzialità.

Avevo il bisogno di un “muletto” che scaricasse per me i files da IRC senza il bisogno di tenere la shell aperta ed attiva. Per questo motivo ho installato sul mio raspberry due semplici programmi: tmux e weechat

Tmux 

Cosi’ come dice la sua wiki, e’ un terminal multiplex che permette di eseguire qualsiasi comando e lasciarlo in esecuzione senza che venga killato una volta che mi siete disconnessi dalla console (un po come accade con nohup, ma con la possibilita’ di ricollegarsi alla shell in un secondo momento).

Per fare un esempio, possiamo avviare l’esecuzione di un’applicazione dalla nostra workstation dell’ufficio, ed osservare gli effetti dell’esecuzione solo dopo essere ritornati a casa, anche dopo avere chiuso il terminale su cui l’esecuzione era iniziata. Al tempo stesso, possiamo far sì che più utenti si connettano simultaneamente allo stesso terminale, ed alla stessa sessione, pur utilizzando computer differenti: quest’altra caratteristica è nota come session sharing.

Installazione su debian e’ alquanto semplice

sudo apt-get install tmux

Weechat

E’ il miglior IRC chat client in circolazione. E’ davvero potentissimo e permette di personalizzare ogni suo aspetto

sudo apt-get install weechat

Una volta installati entrambi i programmi non dobbiamo far altro che iniziare una nuova sessione tmux

unicondor@raspberrypi:~ $ tumx

Adesso non dobbiamo far altro che avviare weechat in questa sessione virtuale di tmux e connetterci al nostro server irc

unicondor@raspberrypi:~ $ weechat

ed iniziare a collegarci al server

[unicondor(iwx)] /connect irc.arabaphoenix.net

Entrare in un canale

/join #arabafenice

Una volta che siete riuscito a collegarci al canale … e magari anche avviato il download tramite XDCC, potete fare il “detach” della sessione in modo tale che WeeChat continui con la sua esecuzione senza essere killato

Il Comando di Tmux per il detach e’ C-a d

dove (C-x means ctrl+x, M-x means alt+x)

Quindi bisogna premere il pulsate della tastiera “CTRL” e contemporaneamente il tasto “b”, ed in seguito il tasto “d”

Comandi utili di Tmux

start new:

tmux

start new with session name:

tmux new -s myname

attach:

tmux a  #  (or at, or attach)

attach to named:

tmux a -t myname

list sessions:

tmux ls

kill session:

tmux kill-session -t myname

Kill all the tmux sessions:

tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill

In tmux, hit the prefix ctrl+b (my modified prefix is ctrl+a) and then:

Reference:

https://github.com/tmux/tmux/wiki

https://weechat.org/

Rinominare File in Bulk usando una combinazione di comandi: ls, sed e mv

Ultimamente ho avuto la necessita’ di rinominare una serie di file in bulk.

Tali files erano all’interno di una cartella, la quale veniva usata dal demone samba per la condivisione nella mia rete.

Il problema che avevo era dovuto al fatto che samba mal supporta i file con i nomi troppo lunghi e per tale motivo, se si accede da remoto alla cartella, vediamo una sequenza di caratteri “strani” invece del loro nome originale

Supponiamo di avere un file del genere nella cartella usata da samba

XDCC|OceaN|NewS|26.Trailer.Film22.MD.HDCAM.x264-iND.mkv
XDCC|OceaN|NewS-Time44|26.Trailer.Film1.MD.HDRIP.x264-iND.avi

La stessa cartella, quando vista da remoto da un client samba appariva con nomi diversi come:

XOSHQU~F.mkv
XCKQJB~8.avi

 

Lo script e’ davvero semplice, ed usa una combinazione di tre comandi shell:

  • ls -> usato per scorrere la lista dei files nella cartella
  • sed -> usato per il replace del nome
  • xargs and mv -> usato per il rename effettivo del file

 

[code language=”bash”]
ls *| sed -e ‘p;s/[a-z;A-Z]*|[a-z;A-Z]*|[a-z;A-Z]*\([a-z;A-Z]*\|-[a-z;A-Z]*\)|[0-9]*.//g’ | xargs -n2 mv
[/code]

Se lanciato il comando precede avremo rinominato i file nella seguente maniera

Trailer.Film22.MD.HDCAM.x264-iND.mkv
Trailer.Film1.MD.HDRIP.x264-iND.avi

Permettendo a samba di mostrarli ai client remoti senza gli strani caratteri che abbiamo visto in precedenza.

Riferimenti:
http://www.oreilly.com/openbook/samba/book/ch05_04.html

Mappa attacchi DDOS RealTime

maps_attacchi_ddos
In rete si sente spesso parlare di attacchi informatici di tipo Distributed Denial-of-Service (DDoS). Tale tipo di attacco ha come obiettivo quello di “bloccare” un sistema informatico rendendolo incapace di erogare il servizio per cui è stato pensato

Questa mappa ci aiuta a visualizzare tali attacchi su una mappa, mostrandoci in Real-Time i paesi di origine e destinazione

Approfondimenti:
http://map.ipviking.com/
https://it.wikipedia.org/wiki/Denial_of_service
http://www.html.it/articoli/tecniche-gli-attacchi-dos-1/

Parser Python per pagine HTML

Python Parser HTML
Python Parser HTML in azione

Dopo (tanti) anni di studio ed un lavoro (precario) credo sia arrivata finalmente l’ora di iscrivermi all’albo degli Ingegneri, ma prima di farlo ho cercato di fare una piccola statistica su quanti ingegneri c’erano nella mia provincia (Potenza) e a quale tipo di specializzazione appartenessero.

Purtroppo lo strumento di ricerca del sito ( http://www.ordingpz.it/albo/Albolist.asp ) mette a disposizione dell’utente poche opzioni di ricerca, per tale motivo ho rispolverato la cara e vecchia libreria python Beautiful Soup per scrivere un piccolo script python il quale mi aiutasse ad effettuare il parsing di più pagine HTML e tirasse fuori i dati che mi interessavano.

Il sito in questione (http://www.ordingpz.it) ha una pagina web per ogni ingegnere iscritto all’albo. Tale pagina contiene i vari dettagli dell’ utente, compreso il campi che a me interessavano: “Settore” e “Specializzazione“.

Al seguente link è possibile avere un esempio reale del dettaglio dell’utente (l’ingegnere non è stato scelto a casa, ma è un mio amico con cui ha avuto il piacere di lavorare assieme).

http://www.ordingpz.it/albo/Alboview.asp?N__ISCR_=2714

Dalla sintassi dell’URL si capisce che ad ogni account è associato un ID (N__ISCR_) numerico univoco.

Per tale motivo il primo passo è stato quello di capire come estrapolare questi ID per poi andare a processare ogni singola pagina.

La prima parte dello script serve proprio a questo, a tirare fuori tutti gli ID dal sito.

Get ID

import urllib2
from bs4 import BeautifulSoup
import sys

f = open(‘IngPZAll.txt’, ‘w’)

url = “http://www.ordingpz.it/albo/Albolist.asp?pageno=1&t=Albo&RecPerPage=3000”
print url

try:
data = urllib2.urlopen(url).read()
except:
print url

soup = BeautifulSoup(data)

n = soup.findAll(“td”,{“width”:”100″})

#print n
numIscr = []

for i in n:
numIscr.append(i.div.string)

A questo punto la lista numIscr contiene tutti gli ID dell’albo degli Ingegneri di Potenza, adesso non ci resta che accedere alle singole pagine degli user e memorizzare tutte le informazioni che ci servono.

Il ciclo for può esterno non va altro che prendere tutti gli ID contenuti in numIscr , accedere alla pagina dell’utente ad esso associato e tramite BeautifulSoup effettuare il parsing della pagina HTML per tirare fuori le informazioni.

Parse HTML

[sourcecode language=”python”]
for i in range(len(numIscr)):
url = “http://www.ordingpz.it/albo/Alboview.asp?N__ISCR_=”+str(numIscr[i])
f.write(url+”\n”)
print “Parsing “+ str(i) + ” of ” + str(len(numIscr))
print url

try:
data = urllib2.urlopen(url).read()
except:
print url

soup = BeautifulSoup(data)
#print soup.prettify()
n = soup.findAll(“td” , “ewTableHeader”)

fields = []

for i in n:
fields.append(i.string.encode(‘ascii’,’ignore’))

n = soup.findAll(“div”)

values = [];

#print n
count = 0;

for i in n:
count=count+1;
#print count
if(i.string != None and count > 19):
#print i.string
values.append(i.string.encode(‘ascii’,’ignore’))

for i in range(len(values)):
try:
f.write(str(fields[i]+ “: “+values[i]).encode(‘utf-8’)+”\n”)
except:
print fields[i]+ “: “+values[i]

f.write(“\n”)

f.close()
[/sourcecode]

Nella lista fields saranno elencati tutti i campo della tabella (Ex. Nome, Cognome, Specializzazione ecc) ed in quella values tutti i valori dei campi prima citati. Lo step successivo è quello di scrivere tutte queste informazioni in un unico file per poi poter fare tutte le nostre statistiche in maniera semplice ed immediata.

Il file IngPZAll.txt è output dello script, ed avrà al suo interno il dettaglio di tutti gli ingegneri iscritti all’albo.

Output Example

[sourcecode language=”text”]
..
..
..
http://www.ordingpz.it/albo/Alboview.asp?N__ISCR_=2714
N Iscrizione: 2714
Cognome: MONACO
Nome: Pierpaolo
Luogo di Nascita: Potenza
Data di Nascita:
C.F.:
Indirizzo:
CAP:
Citt:
Provincia: PZ
Sezione: A
Settore: Civile ed Ambientale, Industriale, Dell’Informazione
N Iscrizione: 2714
Data Iscrizione: 04/01/2012
Specializzazione: Informatica
Sede Laurea: Roma
Data Laurea: 21/03/2011
Sede Abilitazione: Roma
Anno Abilitazione: 2011
Ordine di Provenienza: Potenza
Data Prima Iscrizione: 04/01/2012
..
..
[/sourcecode]

Ora con una semplice comando bash posso facilmente capire ciò che volevo…

[sourcecode language=”bash”]
unicondor@iMac:> grep -c “Specializzazione: Informatica” IngPZAll.txt
19
[/sourcecode]

Ecco l’informazione che cercavo, su 2506 iscritti all’albo solo 19 hanno come specializzazione Informatica 😀

Attach:

alboIngPzParser.py

IngPZAll.txt

GitHub Project:

https://github.com/flaviopace/SimplePythonHTMLParser

P.s. tutti i dati che trovate in questo articolo solo liberamente disponibili sul sito dell’albo degli Ingegneri di Potenza

Raspberry Pi: Eseguire vncserver all’avvio

Raspberry Pi

Finalmente è arrivato a casa il Raspberry Pi. Settimane di attesa per poter smanettare un pò vicino a questo fantastico “giocattolino”.

Assieme a mio fratello abbiamo cercato di installare subito vncserver, ma le soluzioni che si trovano online : running-vncserver-at-startup , hanno bisogno dell’avvio del server grafico per poter lanciare correttamente il demone di vncserver.

Per ovvirare a questa limitazione, la mia soluzione avvia il demone di vncserver tramite lo script di avvio: /etc/rc.local 

[sourcecode language=”bash”]
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi

#Start Vnc Server
export USER=pi
vncserver :1

exit 0

[/sourcecode]

Prima di lanciare il comando di avvio del server, ho dovuto esportare la variabile globale USER altrimenti il demone non riusciva a leggere correttamente i file di configurazione che avevo editato in /home/pi/.vnc e mi dava il seguente errore:

"Starting vncserver: Starting VNC server: 3: root vncserver: The USER
environments variable is not set"

Al primo avvio vi chiederà di inserire la password di accesso, poi la setterà in automatico ad ogni riavvio.

Il giorno che aspetti da molto…

Keep Calm And Study hard

Di solito, le persone normali si lasciano come ultimo esame universitario uno di quelli “semplici”. Uno di quelli con professori anzianotti, magari quasi alla pensione, che a mala pena ti ascoltano e che alla fine, qualsiasi cosa dirai, ti diranno: forse potevi fare di più, comunque può andare bene così.

Ma non noi… a noi piace soffrire fine alla fine, lo scegliamo con parsimonia tra quelli piu’ tosti. Scegliamo uno dei professori piu’ giovani dell’Ateneo, uno curioso, uno che ti chiede anche il perche’ dell’utilizzo di quel carattere invece che di un altro.

E’ inutile andare a cercare motivazioni particolari da ultimo esame…ormai ci conosciamo, non ci serviranno a nulla, e allora capita che le motivazioni dobbiamo andarle a cercare nei luoghi piu’ disparati: tra gli appunti che sbucano dalle lenzuola del letto, o gli evidenziatori aperti buttati sul divano, oppure semplicemente dal fatto che ormai sei diventato grande!. Lo devi ai tuoi genitori, lo devi a te stesso… lo devi al futuro che ti attende.

L’esame e’ uno di quelli tosti, il nome da solo incute timore: Ingegneria Del Software. Soprattutto per uno come me che predilige l’architettura dei calcolatori e si trova a suo agio cazzeggiando con i puntatori del C piuttosto che analizzare la fase di Requirements Engineering ( non chiedetemi di cosa si tratti, ancora lo devo capire).

Immagino Analisti svegliarsi al mattino e parlare con i Costumers per “elicitare” i requisiti, tavole rotonde di Developer che disquisiscono su come usare l’Integration Testing e se usare una metodologia Bottom-Up o Top-Down, miriade di persone che fanno la gara a chi effettua il Bug Report piu’ dettagliato possibile… credevo che questa gente esistesse solo nella fantasia di chi scrive questi libri, invece debbo ricredermi… di gente strana ce ne molta 😀

Alla fine ci devi trovare qualcosa di interessante, devi andare avanti… e per giunta cercando di prendere un buon voto. Un voto che potrebbe alzarti o abbassarti di un punto la tua media…questa maledetta media che ogni studente universitario ha calcolato almeno un centinaio di volte. Moltiplica il voto per i crediti, fai la media pesata ecc ecc… maledetta matematica, alla fine hai sempre ragione tu.

Un ultimo accenno devo dedicarlo al gruppo con cui ho passato il mio ultimo periodo universitario, mi hanno sopportato e supportato per molti esami :D. Da ognuno di loro ho appreso qualcosa, qualcosa che non trovi scritto nei manuali o sui libri, qualcosa che mi ha reso felice di aver fatto parte del loro gruppo…. del nostro gruppo!

Grazie ad Angela, Maddalena, Mario e Rita.

Si e’ fatto tardi, e’ ora di andare a dormire, domani e’ il giorno che aspettavo da molto…