Raspberry Pi jako AP Client – Czyli… Jak za pomocą Raspberry Pi udostępnić internet z Wi-Fi po kablu

Zapewne dużej części osób, które zajmują się informatyką, zdarzyło się, że podczas np.: instalacji, reinstalacji systemu, trzeba było wgrać sterowniki/soft od karty Wi-Fi. Jednak, aby to zrobić trzeba było go pobrać z internetu, a nie mamy przy sobie kabla lub sprzęt jest bardzo daleko od naszego routera.

Co można zrobić w takim przypadku?

A gdyby tak… Połączyć się z Wi-Fi za pomocą Raspberry i udostępnić ten internet z Wi-Fi po kablu?

No właśnie tym zagadnieniem dzisiaj się zajmiemy, a mianowicie udostępnienie internetu z Wi-Fi, przez Raspberry Pi po kablu do np. innego komputera

Potrzebujemy do tego:

  • Trochę kabla RJ45 (sieciowy)
  • Raspberry Pi (może być nawet wersja 1)
  • Karta Wi-Fi kompatybilna z Raspberry Pi

aby było nam wygodniej (i trudniej podczas konfiguracji raspberry pi jednocześnie) uruchomimy sobie na raspberry Pi serwer DHCP, co pozwoli nam, że karta SD z tym systemem może sobie leżeć, a gdy tylko będzie taka potrzeba, to wsadzić do raspberry Pi i od razu z automatu komputer pobiera nam adres IP/maskę itp. (nie musimy wtedy pamiętać jakie IP to było, ani nic)

Zaczynamy!

Zaczynamy od tego, aby raspberry pi miał połączenie z Wifi, z tym zagadnieniem, akurat przenoszę was do innego artykułu na stronie: https://www.linuxsystems.ovh/problem-z-rozlaczaniem-sie-wi-fi-przez-raspberry/, w którym to już opisałem 🙂

Ustawiamy adres IP (spoza naszej sieci) do interfejsu LAN. W moim przypadku sieć Wi-Fi ma adresację 192.168.115.0/24 dlatego dla sieci LAN dla komputera za raspberry ustawię 192.168.9.1/24:

$ ip a a 192.168.9.1/24 dev eth0

Chociaż lepiej jest to zrobić poprzez zmianę w pliku /etc/dhcpd.conf , aby były one nawet po restarcie raspberry i dopisać tam:

interface eth0
static ip_address=192.168.9.1/24
static routers=192.168.9.1
static domain_name_servers=1.1.1.1

Teraz przechodzimy do instalacji i konfiguracji serwera dhcp

$ sudo apt update
$ sudo apt install isc-dhcp-server
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności       
Odczyt informacji o stanie... Gotowe
Następujące pakiety zostały zainstalowane automatycznie i nie są już więcej wymagane:
  libmicrodns0 rpi-eeprom-images
Aby je usunąć należy użyć "sudo apt autoremove".
The following additional packages will be installed:
  libirs-export161 libisccfg-export163 policycoreutils selinux-utils
Sugerowane pakiety:
  isc-dhcp-server-ldap
Zostaną zainstalowane następujące NOWE pakiety:
  isc-dhcp-server libirs-export161 libisccfg-export163 policycoreutils
  selinux-utils
0 aktualizowanych, 5 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.
Konieczne pobranie 488 kB/1 506 kB archiwów.
Po tej operacji zostanie dodatkowo użyte 6 093 kB miejsca na dysku.
Kontynuować? [T/n] y
Pobieranie:1 http://ftp.icm.edu.pl/pub/Linux/distributions/raspbian/raspbian buster/main armhf libisccfg-export163 armhf 1:9.11.5.P4+dfsg-5.1+deb10u1 [254 kB]
Pobieranie:2 http://ftp.icm.edu.pl/pub/Linux/distributions/raspbian/raspbian buster/main armhf libirs-export161 armhf 1:9.11.5.P4+dfsg-5.1+deb10u1 [234 kB]
Pobrano 488 kB w 1s (334 kB/s)        
Prekonfiguracja pakietów ...
Wybieranie wcześniej niewybranego pakietu libisccfg-export163.
(Odczytywanie bazy danych ... 155524 pliki i katalogi obecnie zainstalowane.)
Przygotowywanie do rozpakowania pakietu .../libisccfg-export163_1%3a9.11.5.P4+dfsg-5.1+deb10u1_armhf.deb ...
Rozpakowywanie pakietu libisccfg-export163 (1:9.11.5.P4+dfsg-5.1+deb10u1) ...
Wybieranie wcześniej niewybranego pakietu libirs-export161.
Przygotowywanie do rozpakowania pakietu .../libirs-export161_1%3a9.11.5.P4+dfsg-5.1+deb10u1_armhf.deb ...
Rozpakowywanie pakietu libirs-export161 (1:9.11.5.P4+dfsg-5.1+deb10u1) ...
Wybieranie wcześniej niewybranego pakietu isc-dhcp-server.
Przygotowywanie do rozpakowania pakietu .../isc-dhcp-server_4.4.1-2_armhf.deb ...
Rozpakowywanie pakietu isc-dhcp-server (4.4.1-2) ...
Wybieranie wcześniej niewybranego pakietu selinux-utils.
Przygotowywanie do rozpakowania pakietu .../selinux-utils_2.8-1+b1_armhf.deb ...
Rozpakowywanie pakietu selinux-utils (2.8-1+b1) ...
Wybieranie wcześniej niewybranego pakietu policycoreutils.
Przygotowywanie do rozpakowania pakietu .../policycoreutils_2.8-1_armhf.deb ...
Rozpakowywanie pakietu policycoreutils (2.8-1) ...
Konfigurowanie pakietu selinux-utils (2.8-1+b1) ...
Konfigurowanie pakietu policycoreutils (2.8-1) ...
selinux-autorelabel-mark.service is a disabled or a static unit, not starting it.
Konfigurowanie pakietu libisccfg-export163 (1:9.11.5.P4+dfsg-5.1+deb10u1) ...
Konfigurowanie pakietu libirs-export161 (1:9.11.5.P4+dfsg-5.1+deb10u1) ...
Konfigurowanie pakietu isc-dhcp-server (4.4.1-2) ...
Generating /etc/default/isc-dhcp-server...
Job for isc-dhcp-server.service failed because the control process exited with error code.
See "systemctl status isc-dhcp-server.service" and "journalctl -xe" for details.
invoke-rc.d: initscript isc-dhcp-server, action "start" failed.
● isc-dhcp-server.service - LSB: DHCP server
   Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
   Active: failed (Result: exit-code) since Thu 2020-07-23 21:09:01 CEST; 194ms ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1033 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=1/FAILURE)

lip 23 21:08:59 raspberrypi dhcpd[1046]: bugs on either our web page at www.isc.org or in the README file
lip 23 21:08:59 raspberrypi dhcpd[1046]: before submitting a bug.  These pages explain the proper
lip 23 21:08:59 raspberrypi dhcpd[1046]: process and the information we find helpful for debugging.
lip 23 21:08:59 raspberrypi dhcpd[1046]: 
lip 23 21:08:59 raspberrypi dhcpd[1046]: exiting.
lip 23 21:09:01 raspberrypi isc-dhcp-server[1033]: Starting ISC DHCPv4 server: dhcpdcheck syslog for diagnostics. ... failed!
lip 23 21:09:01 raspberrypi isc-dhcp-server[1033]:  failed!
lip 23 21:09:01 raspberrypi systemd[1]: isc-dhcp-server.service: Control process exited, code=exited, status=1/FAILURE
lip 23 21:09:01 raspberrypi systemd[1]: isc-dhcp-server.service: Failed with result 'exit-code'.
lip 23 21:09:01 raspberrypi systemd[1]: Failed to start LSB: DHCP server.
Przetwarzanie wyzwalaczy pakietu man-db (2.8.5-2)...
Przetwarzanie wyzwalaczy pakietu libc-bin (2.28-10+rpi1)...
Przetwarzanie wyzwalaczy pakietu systemd (241-7~deb10u4+rpi1)...

Podczas instalacji serwer DHCP nam zwrócił błąd, ale jest to „poprawne zachowanie”, ponieważ jeszcze go nie skonfigurowaliśmy… Co będziemy robili teraz, więc konfigurujemy i uruchamiamy serwer DHCP.

Najpierw zmieniamy aby nasłuchiwał tylko na IPv4, oraz na interfejsie eth0. Robimy to w pliku:

/etc/default/isc-dhcp-server

I zmieniamy dwie ostatnie linijki ( ostatnią linijkę komentujemy „#”, a w przedostatniej dopisujemy eth0):

INTERFACESv4="eth0"
#INTERFACESv6=""

Przechodzimy do edycji pliku: /etc/dhcp/dhcpd.conf i na samym końcu dodajemy tam takie linijki:

subnet 192.168.9.0 netmask 255.255.255.0 {
  range 192.168.9.10 192.168.9.20;
  option domain-name-servers 1.1.1.1;
  option routers 192.168.9.1;
  option broadcast-address 192.168.9.255;
  default-lease-time 600;
  max-lease-time 7200;
}

Musimy także zedytować plik konfiguracyjny systemd dotyczący isc-dhcp-server, aby uruchamiał się po usłudze dhcpcd, aby to zrobić tworzymy plik (jakimkolwiek edytorem – ja używam vim) w:

$ sudo vim /etc/systemd/system/isc-dhcp-server.service 

i wklejamy tam:

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/isc-dhcp-server
Description=LSB: DHCP server
Before=multi-user.target
Before=multi-user.target
#Before=multi-user.target
Before=graphical.target
After=remote-fs.target
After=network-online.target
After=slapd.service
After=nss-lookup.target
After=dhcpcd.service
Wants=network-online.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/isc-dhcp-server start
ExecStop=/etc/init.d/isc-dhcp-server stop

[Install]
WantedBy=multi-user.target

Teraz wydajemy komendę dotyczącą autostartu dla tej usługi poprzez komendę systemctl enable:

$ sudo systemctl enable isc-dhcp-server
Synchronizing state of isc-dhcp-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable isc-dhcp-server
Created symlink /etc/systemd/system/multi-user.target.wants/isc-dhcp-server.service → /etc/systemd/system/isc-dhcp-server.service.
$ 

Została nam jeszcze tylko konfiguracja firewalla (zaporę sieciową), aby dopuścić i maskować ruch z eth0 na wlan0:

$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Robimy tak, aby firewall z automatu dodawał tą linijkę podczas uruchamiania systemu (użyjemy do tego systemd).

Więc stworzymy nową usługę o nazwie customfirewall:

$ sudo vim /etc/systemd/system/customfirewall.service

wpisujemy tam:

[Unit]
After=networking.service

[Service]
ExecStart=/usr/local/bin/customfirewall.sh

[Install]
WantedBy=multi-user.target

Tworzymy plik:

$ sudo vim /usr/local/bin/customfirewall.sh

wpisujemy do niego:

#!/bin/bash

PATH=$PATH:/sbin

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Nadajemy uprawnienia do wykonywania:

sudo chmod 755 /usr/local/bin/customfirewall.sh

przeładowywujemy systemd i dajemy do autostartu customfirewall:

$ sudo systemctl daemon-reload
$ sudo systemctl enable customfirewall

Uruchamiamy ponownie raspberry w celu sprawdzenia czy wszystko wstanie poprawnie:

$ sudo reboot

podłączymy testowy komputer, który nie ma dostępu do internetu po Wi-Fi, połączymy go po kablu i sprawdźmy czy komputer ma dostęp do internetu.

UWAGA! Najlepiej najpierw podłączyć komputer, a później dopiero uruchomić raspberry. Chodzi o to, aby podczas uruchamiania się usług (w szczególności isc-dhcp-server) port eth0 był up i dostał IP, w innych przypadkach mogą występować problemy z uruchomieniem się tej usługi.

Jak widać dostał IP z klasy DHCP:

I także ruch leci przez raspberry Pi do globalnego IP i działa:

Jak widzimy dostęp jest, a więc możemy mieć taką awaryjną kartę Wi-Fi w swoim domu.

Mam nadzieje, że artykuł się przydał i zapraszam do jego komentowania