Redirecció del tràfic ETHernet d'una Estació sísmica spider CAP a unA ip VIRTUAL ZeroTier, accedint-hi via wifi amb una Raspberrypi

L'única manera de comunicar-se amb una estació sísmica Spider de Worldsensing és mitjançant el port Ethernet, emprant un ordinador amb una configuració de xarxa compatible amb els paràmetres de l'estació, que estigui en el mateix rang.

Per defecte les Spiders tenen definida una xarxa privada amb les següents característiques:

IP: 192.168.2.217
Mascara: 255.255.255.0
Gateway: 192.168.2.1

Cal configurar l'ordinador amb els mateixos valors de Mascara i Gateway, i un IP del mateix ordre, per exemple 192.168.2.50 .

El datalogger no té accés wifi i molts cops, en certs llocs aconseguir una IP pública és força complicat. Una solució per donar accés remot a les estacions sísmiques d'aquest tipus és emprar com a ordinador una placa RaspberryPi. No cal que sigui d'última generació, una Raspberrypi 2B o 3B és més que suficient.

Connectarem l'estació Spider al port ethernet (eth0) de la Raspberrypi, i a aquesta li configurarem la Wifi (wlan0) per a donar-li accés a internet. Per poder accedir a la Raspberry des de qualsevol lloc del món emprarem una xarxa virtual o Xarxa Definida per Software (SDN) com per exemple ZeroTier.


  • L'objectiu és re-dirigir tot el tràfic del port 80 eth0 de la Spider cap a la Xarxa Virtual ZeroTier (zt0), mitjançant les iptables de Linux.

Primer de tot cal disposar d'una placa Raspberrypi amb el sistema operatiu Raspbian recent i actualitzat, on fixarem una una xarxa ethernet (eth0) en el mateix rang de la Spider i els paràmetres de la wifi (wlan0) del lloc ha de funcionar.


1) Per tal de que la Raspberry no assigni IPs per dhcp al eth0, cal eliminar el fitxer /etc/dhcpcd.conf. Si cal li podem canviar el nom per no perdre'l:

pi@sismopi:~ $ sudo mv /etc/dhcpcd.conf /etc/dhcpcd.conf.BACK


2) Seguidament modificarem el fitxer /etc/network/interfaces per tal de fixar l'IP de eth0 amb un valor dins el mateix rang que la Spider :

pi@sismopi:~ $ sudo vi /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

# Start eth0 definition

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.50
netmask 255.255.255.0

# start wlan definition

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

i al fitxer /etc/wpa_supplicant/wpa_supplicant.conf hi introduïm les credencials de la xarxa wifi:

pi@sismopi:~ $ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=ES

network={
        ssid="LabSisCSIC"
        psk="xXqXqXqXx"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
        }


Arribats a aquest punt, dins de la xarxa local domèstica, hauriem de poder entrar a la Raspberrypi via wifi amb un ssh, i que la spider, connectada a eth0, respongui al fer un ping 192.168.2.217:

pi@sismopi:~ $ ping -c 2 192.168.2.217
PING 192.168.2.217 (192.168.2.217) 56(84) bytes of data.
64 bytes from 192.168.2.217: icmp_seq=1 ttl=128 time=0.691 ms
64 bytes from 192.168.2.217: icmp_seq=2 ttl=128 time=0.609 ms

--- 192.168.2.217 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1074ms
rtt min/avg/max/mdev = 0.609/0.650/0.691/0.041 ms

I alhora que la Raspberrypi vegi Internet, és adir que el ping al DNS de google també respongui:

pi@sismopi:~ $ ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=12.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=13.3 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 12.272/12.821/13.371/0.561 ms

3) A continuació anirem al nostre compte de ZeroTier Central i creem una xarxa Virtual ZeroTier amb un Network ID , on hi relacionarem tots els dispositius que ens calgui: PCs, Raspberrypi's, Telèfons, etc.


Per a instal·lar ZeroTier als diferents dispositius podem seguir les instruccions de qualsevol d'aquestes dues webs 1 o 2, bàsicament cal fer :

pi@sismopi:~ curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61' | gpg --import && if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi


I continuació verifiquem que funciona i ho activem definitivament:

pi@sismopi:~ sudo systemctl enable zerotier-one
pi@sismopi:~ sudo zerotier-cli status
pi@sismopi:~ sudo zerotier-cli join [Network ID]
pi@sismopi:~ sudo zerotier-cli listnetworks
pi@sismopi:~ sudo touch /var/lib/zerotier-one/networks.d/[Network ID].conf

4) Un com instal·lat ZeroTier a la Raspberrypi, la comanda ifconfig ha de respondre alguna cosa similar a això:

pi@sismopi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.50  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80:xxx:xxx:fe95:68f4  prefixlen 64  scopeid 0x20<link>
        ether b8:27:xx:xx:68:f4  txqueuelen 1000  (Ethernet)
        RX packets 9161  bytes 8523759 (8.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 152696  bytes 7817733 (7.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 160488  bytes 30404921 (28.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 160488  bytes 30404921 (28.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.43.206  netmask 255.255.255.0  broadcast 192.168.43.255
        inet6 fe80:xxx:xxx:fec0:3da1  prefixlen 64  scopeid 0x20<link>
        ether b8:27:xx:xx:3d:a1  txqueuelen 1000  (Ethernet)
        RX packets 22021  bytes 4385631 (4.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 34124  bytes 10242639 (9.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

zt0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 2800
        inet 10.xx.xx.xx  netmask 255.255.255.0  broadcast 10.xx.xx.255
        inet6 fe80::xxx:xxx:fe6a:acac  prefixlen 64  scopeid 0x20<link>
        ether 9a:ca:xx:6a:ac:ac  txqueuelen 1000  (Ethernet)
        RX packets 11302  bytes 894694 (873.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10359  bytes 8782461 (8.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

o, equivalentment, la comanda ip amb opció address dona:

pi@sismopi:~ $ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:xx:xx:68:f4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.50/24 brd 192.168.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:xx:xx:68f4/64 scope link
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:c0:3d:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.206/24 brd 192.168.43.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:xxxx:xxx:3da1/64 scope link
       valid_lft forever preferred_lft forever
4: zt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 9a:ca:xx:xx:ac:ac brd ff:ff:ff:ff:ff:ff
    inet 10.xxx.xx.xx/24 brd 10.xx.xx.255 scope global zto
       valid_lft forever preferred_lft forever
    inet6 fe80::98ca:xxx:xxx:acac/64 scope link
       valid_lft forever preferred_lft forever

És a dir , tenim correctament configurats els dispositius eth0 amb una IP fixa privada en el rang de la Spider, wlan0 rep una IP privada del router i es connecta a internet i zt0 ens assigna una IP pública-virtual.

5) L'últim pas és re-dirigir tot el tràfic del port 80 eth0 de l'estació sísmica Spider cap a la xarxa virtual ZeroTier per a fer-la visible per tots els dispositius agregats a aquesta xarxa SDN. Per a fer-ho, utilitzarem el protocol iptables del Linux.

M'he inspirat en aquests documents (2, 3 i 4) adaptant-ho a les nostres necessitats. Els pasos finals del document 2 (Enabling Your Server to Manage the Global Route i Managing Flows) trobo que no son necessaris pel nostre cas, així que no els implemento. Tampoc utilitzo el paquet dnsmasq com es diu al document 4.


  • Primer de tot hem de dir-li al kernel del SO Raspbian de la Raspberry que ha de permetre la re-direcció de ports (port forwarding).

Això s'aconsegueix modificant el fitxer /etc/sysctl.conf i fixant net.ipv4.ip_forward = 1 :

Si fem:

pi@sismopi:~ $ sudo sysctl net.ipv4.ip_forward 

Per defecte aquesta comanda respon: net.ipv4.ip_forward = 0.

Editem el fitxer /etc/sysctl.conf :

pi@sismopi:~ $ sudo vi /etc/sysctl.conf

i canviem o descomentem la línia a net.ipv4.ip_forward = 1

Un cop fet el canvi, cal fer actives i permanents les noves funcions del kernel:

pi@sismopi:~ $ sudo sysctl -p


  • A continuació hem d'instal·lar un paquet del Linux, que no ve per defecte i que ens permetrà guardar les regles noves iptables i fer-les permanents:


pi@sismopi:~ $ sudo apt-get install iptables-persistent 


  • Ara ja podem definir les noves regles de re-direccionament:
pi@sismopi:~ $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
pi@sismopi:~ $ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
pi@sismopi:~ $ sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -i zt0 -j DNAT --to 192.168.2.217:80

I un cop definides les guardem:

pi@sismopi:~ $ sudo netfilter-persistent save


Per verificar que està tot correcte, fem iptables-save que ha de respondre el següent:

pi@sismopi:~ $ sudo iptables-save
# Generated by iptables-save v1.6.0 on Tue Mar 10 10:40:04 2020
*mangle
:PREROUTING ACCEPT [185065:40113455]
:INPUT ACCEPT [170205:32205924]
:FORWARD ACCEPT [14858:7906857]
:OUTPUT ACCEPT [331757:61371856]
:POSTROUTING ACCEPT [346621:69280087]
COMMIT
# Completed on Tue Mar 10 10:40:04 2020
# Generated by iptables-save v1.6.0 on Tue Mar 10 10:40:04 2020
*nat
:PREROUTING ACCEPT [570:41123]
:INPUT ACCEPT [70:7401]
:OUTPUT ACCEPT [7687:1015148]
:POSTROUTING ACCEPT [2977:256946]
-A PREROUTING -i zt0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.2.217:80
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Tue Mar 10 10:40:04 2020
# Generated by iptables-save v1.6.0 on Tue Mar 10 10:40:04 2020
*filter
:INPUT ACCEPT [168328:31897158]
:FORWARD ACCEPT [1969:122016]
:OUTPUT ACCEPT [329524:61012725]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Mar 10 10:40:04 2020


Fet tot això, la estació sísmica Spider hauria de ser visible des de qualsevol dels dispositius de la Xarxa Virtual. Per a aquest grup d'ordinadors, l'estació serà accessible com qualsevol altre instrument amb un IP públic:

Per tant, podrem implementar-hi els scripts de descarrega de dades amb el programa wget de Linux, o els scripts de descàrrega de dades en Temps Pseudo-Real emprant les utilitats de Ringserver d'IRIS :

Agraïments:


Marc Español i Óscar Frías, pel seu suport informàtic destriant el gra de la palla ...

Jordi Díaz, per fer les primeres proves amb el primer prototip.

Dani Ruiz, per deixar-me tenir un trasto a casa seva. Un pongo del grans.