VPN to podstawa czyli jak postawić VPN na Raspberry PI

Internet jest tak podstawową rzeczą, że coraz więcej osób w ogóle nie zastanawia się nad kwestiami bezpieczeństwa. Problem jednak jest spory bo z internetu korzystamy praktycznie nonstop. Niestety często z dziwnych sieci w dziwnych miejscach. Jak konferencje, hotele czy kafejki. Wszystko jest ok do póki mamy wieloskładnikowe hasła do poczty czy innych ważnych serwisów albo przeglądamy przysłowiowego pudelka. Co jednak jeśli potrzebujemy zrobić coś co wymaga większego bezpieczeństwa? Ja korzystam z VPN-a. Nowoczesne smartfony bardzo dobrze sobie radzą z VPN-ami więc wystarczy kilka kliknięć i mamy wirtualnego kondomka.

VPN w routerze

Wiele poważniejszych routerów ma wbudowany serwer VPN. Wystarczy skonfigurować i używać. Problem jest tylko taki, ze trzeba mieć odpowiedni router, który niekoniecznie musi być tani. Nawet jeśli ten, który masz teraz ma opcję VPN server to następny niekoniecznie. Po co zawężać sobie możliwość wyboru routera. Ja proponuję zrobić własny VPN.

Własny VPN

Do zrobienia własnego serwera VPN będziemy potrzebować:

  • 1x Raspberry PI
  • 1x kabel sieciowy lub wifi tak aby malinka była widoczna w naszej domowej sieci
  • 1x karta sd bo na czyms trzeba to postawić
  • 1x Linux – taki do malinki 😉

Instalacja

Mając poprawnie działającą malinę wystarczy z poziomu cmder-a odpalić ssh


ssh -l <userName> <ip malinki np:192.168.1.2>

sprawdzamy czy system ma odpowiednie moduły:


sudo modprobe ppp-compress-18

jeśli nic się nie wyświetliło to (podobno) jest okej

dalej instalujemy pptpd


sudo apt-get install pptpd -y

PPTP to nie jest najlepszy najbezpieczniejszy i najwspanialszy VPN pod słońcem. W firmie nie wdrożyłbym go ale do celów domowych jest w zupełności wystarczający więc jedziemy dalej.

Trzeba to cudo skonfigurować czyli:


sudo nano /etc/pptpd.conf

i na końcu wrzucamy:


localip <ip malinki np.: 192.168.1.2>
remoteip <ip jakie dostaną klienci np.: 192.168.1.100-110>

następny plik pptpd-options


sudo nano /etc/ppp

i na końcu wrzucamy:


nobsdcomp

ms-dns <ip routera np.: 192.168.1.1>
noipx
mtu 1490
mru 1490

teraz najważniejsze czyli super tajne hasło


sudo nano /etc/ppp/chap-secrets

i wpisujemy:


# Secrets for authentication using CHAP
# client server secret IP addresses
<nazwa uzytkownika> * <hasło> *

Gwiazdki są potrzebne – bez nich nie działa. Wszystko rozdzielamy tabulatorami bo inaczej też nie działą (kocham białe znaki 😐 ).

Na koniec jeszcze


sudo nano /etc/sysctl.conf

i na końcu wrzucamy:


net.ipv4.ip_forward=1

Restart malinki i vpn powinien działać. (albo restart samej usługi sudo /etc/init.d/pptpd restart).

Teraz pozostaje tylko na routerze włączyć przekierowanie. Jeśli chcesz stawiać VPN to wiem że wiesz o co chodzi. Więc tylko dla formalności przekierowujemy port 1723 (lub zakres 1723-1723) na IP naszej malinki.

W tym momencie wystarczy w komórce wyłączyć WiFi i skonfiguroawć VPN na nasze IP (swoje IP sprawdzisz  tutaj https://www.whatismyip.com/) Jeśli wszystko jest dobrze skonfigurowane to się połączysz, jeśli się nie połączysz to nie 🙂

 

Zmienne IP

Co jak mam zmienne IP? Wiele routerów potrafi zarejestrować się w DynDnsie ale problem jest taki, że DynDns jest płatny. Niewiele ale płatny. Co gorze, różne routery różne dynamic dns-y wspierają. Więc znowu przy zmianie routera może się okazać, że trzeba by zmienić usługodawcę. Na szczęście można prościej. Niechaj nasza malinka ogarnie wszystko. Instalujemy DDClient-a


sudo apt-get install ddclient

 

DDClient potrafi obsłużyć całkiem sporo dostawców dynamic dns. Więc do wyboru do koloru. Ja zaczynałem dawno dawno temu z DynDnsem potem się zrobił płatny. Potem długi czas używałem właśnie przez DDClienta No-Ip ale oni co miesiąc wysyłają maila, żeby przedłużyć dzierżawę – bojąc się, że zapomnę kliknąć na czas co by skutkowało, że po zamknięciu konta akurat potrzebowałbym tego bezwzględnie przesiadłem się na freedns (http://freedns.afraid.org)

zatem moja konfiguracja DDClienta dla freedns:


sudo nano /etc/ddclient.conf


daemon=1m
timeout=10
use=web, web=checkip.dyndns.com/, web-skip='IP Address'

ssl=yes
protocol=freedns
server=freedns.afraid.org
login=<moj login>
password=<moje haslo>
<moja domena np.: dom.mooo.com>

Od teraz nie straszne nam zmienne IP, nie straszna nam zmiana routera. Mamy własny osobisty VPN. Co najlepsze, możemy go zabrać do kieszeni i postawić gdziekolwiek w 3 min (pamiętając jedynie o przekierowaniu tego 1 portu na routerze).

Koszty malinki są tak niskie, że można spokojnie żyć zgodnie z Single Responsibility Principle. 1 Serwer jedna odpowiedzialność, 1 malina = VPN-a i jesteśmy szczęśliwi i mocno niezależni.

 

 

 

Na ratunek Raspberry Pi

O Raspberry Pi dawno nie pisałem, projekt termometrów wisi w martwym punkcie – kable po chałupie trzeba poprzeciągać. Klejem na gorąco przymocować gdzie trza i wrócić do pisania softu. Tymczasem gdzieś po drodze w trakcie eksperymentów ucierpiał slot na kartę SD. Już szukałem gdzie można przelugować takie gniazdo gdy internet przyniósł natchnienie. Wystarczy ułamany plastik wyrównać, oskrobać i kropelką czy innym takim wynalazkiem przykleić kawałek np. karty kredytowej czy innej tego typu. U mnie padło na kartę do zbierania punktów na stacjach Shell. Kiedyś tankowałem u nich więcej, teraz nie mam po drodze więc karta leżała odłogiem – aż się okazało, że może przysłużyć się ludzkości.

raspberrypi

Po operacji Malinka działa miodzio malina.

 

Odczytywanie temperatury za pomocą LM75A i Raspberry Pi

Ostatnio opisywałem czujnik LM75A, który jest banalny do podłączenia do Raspberry Pi i który jest banalny do odczytu za pomocą prostego skryptu w pythonie. Dzisiaj wgryziemy się w kod:

Zaczniemy od tego co lubię najbardziej: KOD. Najszybciej zaczniemy wpisując w terminalu

nano temperature.py

i zaczniemy kodować (rozumiem, że i2c jest skonfigurowane):


import smbus

sensorAddress = 0x48
i2c = smbus.SMBus(1)

print i2c.read_word_data(sensorAddress,0)

Czyli po kolej: importujemy bibliotekę smbus (zainstalowaną wcześniej)
podajemy adres czujnika (i2cdetect –y 1 żeby sprawdzić czy mamy coś podpięte i pod jakim adresem)

tworzymy obiekt reprezentujący szynę i2c (w raspberry pi rev2 jako parametr podajemy 1, w rev1 0)

i odczytujemy temperaturę. Wychodzimy z edytora i uruchamiamy skrypt:

python temperature.py

i mamy odczyt. Banalnie prosto. 🙂

A jeśli dziwi Cię dlaczego ten odczyt jest taki dziwny to dlatego, że odczytaliśmy surową wartość w formie jakiej wypluł czujnik. To jak to jest kodowane o co oznacza pisałem ostatnio zatem kod parsujący temperaturę z LM75A:

Zatem dodajemy kawałek kodu, który parsuje wartość odczytaną i zwraca prawidłową temperaturę

def Decode(raw):
    tempA = raw & 0xFF
    tempB = (raw >> 8) & 0xFF
    temp = (tempA << 8) | tempB
    temp = temp >> 5
    return temp

def Parse(input):
    signBit = input >> 10
    if signBit > 0:
        negativeTemperature = input
        return (negativeTemperature * 0.125) - 256
    return input * 0.125

raw = i2c.read_word_data(sensorAddress,0)
temp = Decode(raw)
print Parse(temp)

czyli mamy dwie funkcje, Decode, która tak przestawia bity aby zgodnie z tym co ostatnio pisałem uzyskać prawidłową liczbę w pythonie oraz Parse, która odpowiednio przelicza to na nasze dobrze znane stopnie Andersa Celsiusa.

Po sieci krąży jeszcze jedne kod do odczytu temperatury z LM75A:

tempA = temp & 0xFF
tempB = (temp >> 8) & 0xFF
temp = (tempA  << 8) | tempB
temp = temp >> 5

r = temp >> 7
if (temp & 0x8000):
r = (~r & 0x1FF)
r = r - 1
r = -r
r = r / 2.0
return str(r)

ma on jednak małą wadę, zaokrągla odczyt do .5 więc tracimy na rozdzielczości czujnika i z .125 robi nam się 0.5 stopnia Wprawdzie w zastosowaniach domowych i meteo nie ma to wielkiego znaczenia to jednak piszę o tym, ponieważ jedna z pierwszych moich wersji bazowała na tym kodzie i zaokrąglała własnie do .5. Teraz znalazłem czas, żeby napisać to po swojemu i mam .125

Ostatnia sprawa to spięcie całości. Potrzebujemy połączyć kość LM75A z Malinką:

image

Łączymy piny:

LM75A Raspberry PI
1 (SDA) 2 (SDA)
2 (SCL) 3 (SCL)
4 (GND) 24 (Ground)
8 (VCC) 1(3V3 Power)
5 1 (3V3 Power)
6 1 (3V3 Power)
7 1 (3V3 Power)

Piny 5 6 7 możemy połączyć dowolnie z “plusem” lub “minusem” – w ten sposób ustalamy adres jednak należy pamiętać, że piny 5, 6 i 7 MUSZĄ BYĆ POŁĄCZONE.

Miłej zabawy a w następnym odcinku serii na warsztat weźmiemy ciśnienie ale dopiero w przyszłym tygodniu.

LM75A + i2c + Raspberry Pi czyli mierzymy temperaturę

Szerszy obraz czyli tzw. przydługi wstęp

Zainteresowanie szyną i2c spowodowane było moim lenistwem. Piec w domu nie ma termostatu a rozpalając go warto wiedzieć jaka jest temperatura żeby wiedzieć kiedy go zamknąć. Rozwiązanie? Czujnik temperatury w piwnicy – na piecu, najlepiej taki który będę mógł sprawdzać za pomocą telefonu. Dodatkowo dlaczego by nie mieć czujnika temperatury w każdym pokoju i w dodatku zapisywać je aby moc później oglądać jak te temperatury się zmieniają. Dostępne na rynku rozwiązania albo nie spełniają wszystkich założeń albo są mega drogie. Pod telewizorem leży malinka wiec dlaczego jej nie zaprzęgnąć do dodatkowej pracy. Idealny materiał na pet project. Wstępne założenia są takie czujnik temperatury w piwnicy, w sypialni i salonie oraz na zewnątrz – być może temperatura przy ziemi oraz na wysokości 2 metrów czyli tak jak to mierzą meteorolodzy (btw. nie ma czegoś takiego jak temperatura w/na słońcu. Prawidłowo mierzona temperatura powietrza jest dokonywana na wysokości 2m w klatce meteorologicznej zapewniającej cień. Nie mierzymy temperatury w/na „słońcu”). Wyszło 5, być może jeszcze w pokoju dzieci i może kuchni to daje 7. Po szybkiej analizie dostępnych możliwości okazało sie ze Lm75a nadaje sie najlepiej. Na jednej szynie i2c (to ważne bo dzięki temu cześć elektroniczna jest uproszczona do minimum) można podpisać 8 termometrów. Zakres mierzonej temperatury to -50 do 150 stopni. Dla mnie idealnie. Dokładność 2stopnie. Z jednej strony masakra a z drugiej – co mnie to obchodzi, to nie jest aparatura medyczna. Się skalibruje i odpowiednie poprawki w kodzie się zrobi. W zakresie domowym i zewnętrznym czujnik jest liniowy wiec nie ma stresu a pomiar temperatury w piecu wystarczy z dokładnością 5 stopni, aktualny bimetalowy wskaźnik i tak jest mocno orientacyjny.

Zatem na warsztat idzie kostka do odczytywania temperatury czyli LM75A. Idiotycznie prosta w użyciu i obsłudze kość pozwoli łatwo uzyskać zadowalające efekty i nie powinna stanowić większego problemu nawet dla początkujących elektroników. Dokumentacja techniczna znajduje się tutaj.

lm75-elememnty

Do zmontowania będą potrzebne LM75, dostępne na allegro i w przyzwoitych sklepach elektronicznych (na powyższej rycinie to te pajączki w woreczku antystatycznym) garść kondensatoró 10nF ceramicznych oraz płytki drukowane. Te ostatnie nie są obowiązkowe bo można zmontować wszystko na pająka albo jak to teraz modniej w 3D ale na allegro można dostać gotowe płytki SO8 która ułatwi pracę. Przydatny może być również kynar jeśli chcemy mieć więcej niż 1 czujnik. Przyda się również lutownica (lepiej oporowa niż transformatorowa) oraz podstawowe umiejętności z zakresu lutowania i wąchania kalafonii.

Technikalia

Kostka ma 8 wyjść. VCC to zasilanie. Malinka może zapewnić nam 3.3 lub 5V, kość wymaga zasilania w zakresie 2.8-5.5 więc 3.3 będzie ok (później będziemy się zajmować barometrem, który jest bardziej wybredny i dlatego skorzystam z 3.3). GND to masa – lub  minus zasilania. To załatwia zasilanie. SDA i SCL to szyna danych w I2C. Ponieważ całość podpinamy do Raspberry Pi, która ma rezystory podciągające to poza połączeniem VCC GND SDA i SCL mamy w pełni funkcjonalną szynę, która nić ponad to nie potrzebuje.

image

Teraz najciekawsza część. LM75 ma ustawiany adres a ustawiamy go za pomocą zwierania A0 A1 i A2 do VCC lub do GND. I2C pozwala podpiąć równolegle do 120 urządzeń więc żeby je rozróżnić od siebie –  z którym w danej chwili chcemy rozmawiać – należy je zaadresować. Adres jest ustalany przez producenta na etapie projektowania. W przypadku LM75 adres wygląda tak:

MSB LSB
1 0 0 1 A2 A1 A0

Co ważne, A0-A2 MUSZĄ być połączone albo z VCC albo z GND. Jeśli pozostawimy je wiszące to kość będzie się dziwnie zachowywać tzn. czasem będzie odpowiadać a czasem nie. Ustawiając adresy cudeńko możemy znaleźć pod adresami od 72 (0x48) do 79 (0x4F) – sprawdzimy to za pomocą komendy i2cdetect.

Zmontowana kość u mnie wygląda tak:

photo

Jak widać mistrzostwo we władaniu lutownicą nie jest jakoś specjalnie potrzebne, ważne żeby nie poparzyć się, nie ugotować kostki i nie pozwierać za dużo…. aha i nie oblizujemy grota lutownicy.

Temperatura

Kość jest samowystarczalna w tym sensie, że po ustawieniu adresu i dostarczeniu zasilania można czytać temperaturę bez jakiejś specjalnej kalibracji czy innych magicznych obrządków. Wystarczy odczytać odpowiedni rejestr (o tym jak, będzie w następnym wpisie), który zbudowany jest tak:

M S B y t e L S B y t e
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 X X X X X

D10 to znak czyli 0 temperatura dodatnia, 1 temperatura ujemna. D9 do D0 to nasza temperatura zapisana jako wartość całkowita – ofc zapisana binarnie. XXXXX są nie używane.

Dla fanów tdd trochę mięsa czyli przypadki testowe – ot wprost z dokumentacji:

11-bit binary

szenastkowo dziesiętnie wartość temperatury
01111111000 0x3F8 1016 +127.000 °C
01111110111 0x3F7 1015 +126.875 °C
01111110001 0x3F1 1009 +126.125 °C
01111101000 0x3E8 1000 +125.000 °C
00011001000 0x0C8 200 +25.000 °C
00000000001 0x001 1 +0.125 °C
00000000000 0x000 0 0.000 °C
11111111111 0x7FF -1 −0.125 °C
11100111000 0x738 -200 −25.000 °C
11001001001 0x649 -439 −54.875 °C
11001001000 0x648 -440 −55.000 °C

z wartości dziesiętnej na prawdziwą temperaturę przechodzimy tak:

dla wartości dodatniej czyli D10 = 0

(°C) = +(Temp) × 0.125 °C.

dla wartości ujemnych czyli D10 = 1

(°C) = −(pozostała część Temp) × 0.125 °C.

Wstępnie mamy omówiony pierwszy klocek układanki. Wiadomo dlaczego i czym chcę mierzyć temperaturę. W następnej części pokażę jak to to podpiąć do malinki oraz zaglądniemy do kodu który pozwoli na odczyt temperatury.

Raspberry Pi i szyna I2C

Jedną z wielkich zalet Rasbperry Pi jest to, że została wyposażona w ciekawy zestaw portów a jeden z nich to i2c. Jest to szyna, która pozwala na bardzo łatwą (potrzebuje 4 przewody) komunikację z innymi układami scalonymi, czujnikami czy wręcz całymi urządzeniami. Na rynku jest od lat i dlatego nie ma problemu znaleźć masę zabawek, które możemy wykorzystać.

Aby rozpocząć przygodę z i2c należy uruchomić i2c na malince.

sudo nano /etc/modules i dodajemy moduł i2c-dev

image

a następnie

sudo apt-get install i2c-tools
sudo apt-get install python-smbus

To doda nam narzędzia do i2c oraz bibliotekę smbus dla pythona, która przyda się do komunikacji.

Na koniec:

sudo adduser pi i2c

Po restarcie można już cieszyć się tym, że i2c działa. Szybka kontrola:

i2cdetect –y 1 i mamy:

image

i2cdetect pozwala odczytać adresy urządzeń podpiętych do szyny (w przypadku malinki rev2 –y 1, w przypadku rev1 –y 0). Na powyższej rycinie widać, że są podpięte 3 urządzenia o adresach 0x48, 0x4F u 0x77. Jeśli nic nie podepniemy, będzie pusto. Jednak jest to pierwszy krok, który pozwoli sprawdzić czy to to w ogóle u nas działa.

Szyna i2c pozwala podpiąć ponad setkę urządzeń. Każde z nich ma swój adres (niektóre mają konfigurowalny adres) który warto znać, żeby się z danym urządzeniem komunikować. Jak wcześniej pisałem, rycina pokazuje 3 takie urządzenia:

0x48 i 0x4F to termometry LM75A, w których 3 ostatnie bity adresu można ustawić, możemy zatem podpiąć 8 różnych termometrów. Szczegółowe dane techniczne znajdują się tutaj

0x77 to  BMP085 czyli czujnik temeratury i cisnienia atmosferycznego. Szczegółowe dane techniczne znajdują się tutaj.

W kolejnych postach pokażę jak podpiąć powyższe czujniki do malinki  i jak cokolwiek z nich odczytać a później pokażę prosty sposób na wypchnięcie danych na zewnątrz do google docs lub do własnej aplikacji webowej.

 

Aktualizacja:

Jeden z czytelników napisał, że potrzebował dopisać w pliku /etc/modules  linijkę i2c-bcm2708. Więc jeśli to co napisałem w Twoim przypadku to za mało  to może tego brakuje. W mojej malince wystarczyło wpisać i2c-dev ale może to wynika z faktu, że używam raspbmc a nie raspbiana. Dzięki Marek za uwagę.