4G IoT: Difference between revisions

From RevSpace
Jump to navigation Jump to search
(Created page with " == Raspberry Pi met 4G == De Pi is verbonden met internet via een goedkoop 4G-abonnement, want ik heb thuis geen vaste internetverbinding meer. === SSH-toegang === Omdat i...")
 
(Eerst eten, straks verder)
Line 1: Line 1:
== Projectbeschrijving ==
* Thuisnetwerk gebaseerd op een Raspberry Pi met een draadloze internetverbinding. Geen vaste lijn, geen losse router.
* Bediening op afstand via SSH (want de S in IoT staat voor security!)
* Verwarming instellen per vertrek
* Remote de verwarming aanzetten, want een klokthermostaat werkt niet als je niet vooraf weet wanneer je naar huis gaat
* Extreme energiebesparing: slaapkamer kunnen verwarmen zonder verplicht ook de woonkamer te moeten verwarmen
* Raspberry Pi met 4G-module gekregen, dus ik heb niet hoeven zoeken naar geschikte onderdelen :)
* Geen IPv6 want te veel onderdelen die dat niet ondersteunen
Deze pagina heb ik gemaakt omdat er mensen waren die geïnteresseerd waren in hoe je zoiets doet. Aangezien ik alles al werkend heb, kan het zijn dat ik dingen vergeten ben hier te documenteren. Deze pagina is dus niet bedoeld als complete howto of tutorial, maar meer een verzameling losse stukjes configuratie ter inspiratie.


== Raspberry Pi met 4G ==
== Raspberry Pi met 4G ==


De Pi is verbonden met internet via een goedkoop 4G-abonnement, want ik heb thuis geen vaste internetverbinding meer.
=== 4G/LTE ===
 
Een USB-4G-module (SIM7100E) met een simkaart (simpel.nl, 2 GB/maand voor 7,50 €/maand) voor de internetverbinding. Ik heb eerst de pincode van de simkaart af gehaald om eindeloos drama te voorkomen.
 
Het makkelijkst is om de module gewoon altijd zelf de verbinding te laten maken:
 
    qmicli -d /dev/cdc-wdm0 --wds-set-autoconnect-settings=enabled
 
Verder gewoon een interface configureren en een NAT-router van het doosje maken:
 
    # ergens in /etc/network/interfaces
    auto wwan0
    iface wwan0 inet dhcp
        pre-up /usr/local/bin/wacht-op-data
        post-up iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
 
Bij het booten is de dataverbinding nog niet klaar. Vandaar dit scriptje dat daar op wacht:
 
    #!/bin/sh
    # /usr/local/bin/wacht-op-data
    while ! (qmicli -d /dev/cdc-wdm0 --wds-get-packet-service-status | grep connected); do
        echo "Wacht op gprs/umts/lte..."
        sleep 1
    done


=== SSH-toegang ===
=== SSH-toegang ===
Line 8: Line 43:
Omdat inkomende verbindingen niet kunnen, gebruik ik autossh voor een uitgaande verbinding met een port forward van buiten naar binnen.
Omdat inkomende verbindingen niet kunnen, gebruik ik autossh voor een uitgaande verbinding met een port forward van buiten naar binnen.


<code>
    adduser autossh
adduser autossh
    su - autossh
su - autossh
    ssh-keygen
ssh-keygen
    cat .ssh/*pub | ssh tau@mijnvpsje.ergens.example.com 'cat >> .ssh/authorized_keys'
cat .ssh/*pub | ssh tau@mijnvpsje.ergens.example.com 'cat >> .ssh/authorized_keys'
</code>


Om dataverkeer te besparen, protocol-niveau keepalives gebruiken omdat je daarvan wel de interval kunt configureren:
Om dataverkeer te besparen, protocol-niveau keepalives gebruiken omdat je daarvan wel de interval kunt configureren:
<code>
 
# /home/autossh/.ssh/config
    # /home/autossh/.ssh/config
ServerAliveInterval 180
    ServerAliveInterval 180
TCPKeepAlive no
    TCPKeepAlive no
</code>


Systemd unit voor automatisch starten:
Systemd unit voor automatisch starten:
<code>
# /etc/systemd/system/autossh.service


[Unit]
    # /etc/systemd/system/autossh.service
Description=AutoSSH tunnel service
    [Unit]
After=network.target
    Description=AutoSSH tunnel service
    After=network.target
   
    [Service]
    Type=simple
    User=autossh
    ExecStart=/usr/bin/autossh tau@mijnvpsje.ergens.example.com -tt -N -R2220:127.0.0.1:22
    Restart=always
    RestartSec=60
   
    # voorkomt dat ie stopt als de eerste verbinding mislukt
    Environment="AUTOSSH_GATETIME=0"
   
    [Install]
    WantedBy=multi-user.target
 
Systemd schudden tot ie doet wat je wilt:


[Service]
    systemctl daemon-reload
Type=simple
    systemctl enable autossh
User=autossh
    systemctl start autossh
ExecStart=/usr/bin/autossh tau@mijnvpsje.ergens.example.com -tt -N -R2220:127.0.0.1:22
Restart=always
RestartSec=60


# voorkomt dat ie stopt als de eerste verbinding mislukt
Handige config om vanaf m'n laptop met 1 commando (ssh tau) via de vps op de raspberry pi in te loggen:
Environment="AUTOSSH_GATETIME=0"


    # ergens in /home/juerd/.ssh/config op mijn laptop
    Host tau
        User root
        Hostname 127.0.0.1
        Port 2220
        ProxyJump mijnvpsje.ergens.example.com


[Install]
Ja, ik werk als root. Lijkt me niet onzinnig op een device met maar 1 functie :)
WantedBy=multi-user.target
</code>


<code>
=== DHCP-server ===
systemctl daemon-reload
systemctl enable autossh
systemctl start autossh
</code>


<code>
Om rechtstreeks LAN-dingen eraan te hangen zonder nog een router nodig te hebben (immers, deze raspberry pi is nu zelf al een router), is een DHCP-server handig. DNSMasq is meteen ook een DNS-server en enorm makkelijk in gebruik.
# ergens in /home/juerd/.ssh/config op mijn laptop


Host tau
Enfin, eerst de netwerkinterface instellen zodat er iets te binden valt:
    User root
    Hostname 127.0.0.1
    Port 2220
    ProxyJump mijnvpsje.ergens.example.com
</code>


Ja, ik werk als root. Lijkt me niet onzinnig op een device met maar 1 functie :)
    # ergens in /etc/network/interfaces
    auto eth0
    iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0
 
En dan nog even 2 regels uncommenten:
 
    # ergens in /etc/dnsmasq.conf
    bind-interfaces
    dhcp-range=192.168.0.50,192.168.0.150,12h

Revision as of 18:47, 28 October 2018

Projectbeschrijving

  • Thuisnetwerk gebaseerd op een Raspberry Pi met een draadloze internetverbinding. Geen vaste lijn, geen losse router.
  • Bediening op afstand via SSH (want de S in IoT staat voor security!)
  • Verwarming instellen per vertrek
  • Remote de verwarming aanzetten, want een klokthermostaat werkt niet als je niet vooraf weet wanneer je naar huis gaat
  • Extreme energiebesparing: slaapkamer kunnen verwarmen zonder verplicht ook de woonkamer te moeten verwarmen
  • Raspberry Pi met 4G-module gekregen, dus ik heb niet hoeven zoeken naar geschikte onderdelen :)
  • Geen IPv6 want te veel onderdelen die dat niet ondersteunen

Deze pagina heb ik gemaakt omdat er mensen waren die geïnteresseerd waren in hoe je zoiets doet. Aangezien ik alles al werkend heb, kan het zijn dat ik dingen vergeten ben hier te documenteren. Deze pagina is dus niet bedoeld als complete howto of tutorial, maar meer een verzameling losse stukjes configuratie ter inspiratie.

Raspberry Pi met 4G

4G/LTE

Een USB-4G-module (SIM7100E) met een simkaart (simpel.nl, 2 GB/maand voor 7,50 €/maand) voor de internetverbinding. Ik heb eerst de pincode van de simkaart af gehaald om eindeloos drama te voorkomen.

Het makkelijkst is om de module gewoon altijd zelf de verbinding te laten maken:

   qmicli -d /dev/cdc-wdm0 --wds-set-autoconnect-settings=enabled

Verder gewoon een interface configureren en een NAT-router van het doosje maken:

   # ergens in /etc/network/interfaces
   auto wwan0
   iface wwan0 inet dhcp
       pre-up /usr/local/bin/wacht-op-data
       post-up iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE
       post-up echo 1 > /proc/sys/net/ipv4/ip_forward

Bij het booten is de dataverbinding nog niet klaar. Vandaar dit scriptje dat daar op wacht:

   #!/bin/sh
   # /usr/local/bin/wacht-op-data
   while ! (qmicli -d /dev/cdc-wdm0 --wds-get-packet-service-status | grep connected); do
       echo "Wacht op gprs/umts/lte..."
       sleep 1
   done

SSH-toegang

Omdat inkomende verbindingen niet kunnen, gebruik ik autossh voor een uitgaande verbinding met een port forward van buiten naar binnen.

   adduser autossh
   su - autossh
   ssh-keygen
   cat .ssh/*pub | ssh tau@mijnvpsje.ergens.example.com 'cat >> .ssh/authorized_keys'

Om dataverkeer te besparen, protocol-niveau keepalives gebruiken omdat je daarvan wel de interval kunt configureren:

   # /home/autossh/.ssh/config
   ServerAliveInterval 180
   TCPKeepAlive no

Systemd unit voor automatisch starten:

   # /etc/systemd/system/autossh.service
   [Unit]
   Description=AutoSSH tunnel service
   After=network.target
   
   [Service]
   Type=simple
   User=autossh
   ExecStart=/usr/bin/autossh tau@mijnvpsje.ergens.example.com -tt -N -R2220:127.0.0.1:22
   Restart=always
   RestartSec=60
   
   # voorkomt dat ie stopt als de eerste verbinding mislukt
   Environment="AUTOSSH_GATETIME=0"
   
   [Install]
   WantedBy=multi-user.target

Systemd schudden tot ie doet wat je wilt:

   systemctl daemon-reload
   systemctl enable autossh
   systemctl start autossh

Handige config om vanaf m'n laptop met 1 commando (ssh tau) via de vps op de raspberry pi in te loggen:

   # ergens in /home/juerd/.ssh/config op mijn laptop
   Host tau
       User root
       Hostname 127.0.0.1
       Port 2220
       ProxyJump mijnvpsje.ergens.example.com

Ja, ik werk als root. Lijkt me niet onzinnig op een device met maar 1 functie :)

DHCP-server

Om rechtstreeks LAN-dingen eraan te hangen zonder nog een router nodig te hebben (immers, deze raspberry pi is nu zelf al een router), is een DHCP-server handig. DNSMasq is meteen ook een DNS-server en enorm makkelijk in gebruik.

Enfin, eerst de netwerkinterface instellen zodat er iets te binden valt:

   # ergens in /etc/network/interfaces
   auto eth0
   iface eth0 inet static
       address 192.168.0.1
       netmask 255.255.255.0

En dan nog even 2 regels uncommenten:

   # ergens in /etc/dnsmasq.conf
   bind-interfaces
   dhcp-range=192.168.0.50,192.168.0.150,12h