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.