Μετατρέψτε το Raspberry Pi σας σε WiFi Access Point με Docker


Το άρθρο αυτό αποτελεί μέρος της σειράς Raspberry Pi Server, υποστηριζόμενο από την επίσημη αντιπροσωπία του Raspberry Pi στην Ελλάδα, το nettop.gr το οποίο με προμήθευσε με το Raspberry Pi 5 ώστε να δημιουργήσω περισσότερο περιεχόμενο για τις δυνατότητες και τα Project που μπορούν να τρέξουν self-hosted πάνω στο Raspberry Pi στα Ελληνικά. Ευχαριστώ πάρα πολύ το nettop.gr για την υποστήριξη!!!

Μετατρέψτε το Raspberry Pi σας σε WiFi Access Point με Docker

Σε αυτό το άρθρο θα δημιουργήσουμε μέσα σε ένα Docker Container ένα WiFi Access Point για το Raspberry Pi μας.

Ο οδηγός αυτός λειτουργεί σε όλα τα συστήματα όπου υποστηρίζεται το Docker εκτός των Raspberry Pi;

Φυσικά, μιας και είναι σε μορφή Container, ο οδηγός αυτός μπορεί να εφαρμοστεί σε κάθε υπολογιστή με τουλάχιστον 2 κάρτες δικτύου, με την μία από τις δύο να είναι ασύρματη και να υποστηρίζει AP Mode.

Για όποιον θέλει να μάθει τι είναι το Docker, οπού αποτελεί την μεγάλη “ναυαρχίδα” των Containers, υπάρχει ήδη στο Linux-User.gr ένας πολύ αναλυτικός οδηγός: , οπού εμπεριέχει αναλυτικότερες πληροφορίες σχετικά με τις τεχνολογίες αυτές.

Ας ξεκινήσουμε:

Η προσέγγιση που θα ακολουθήσουμε σε αυτό τον οδηγό θα είναι να διαθέτουμε σύνδεση στο διαδίκτυο ενσύρματα μέσω Ethernet (συσκευή eth0) και να δημιουργούμε ένα ασύρματο WiFi Access Point (συσκευή wlan0).

Γιατί να δημιουργήσουμε ένα επιπλέον WiFi Access Point;

  • Διότι το κύριο Access Point βρίσκεται αρκετά μακριά από τα υπόλοιπα συστήματά μας,
  • Διότι διαθέτουμε χώρους έξω από το κύριο κτήριο το οποίο διαθέτει σύνδεση στο διαδίκτυο είτε με Ethernet είτε μέσω Powerline,
  • Διότι θέλουμε να προσθέσουμε ένα ακόμη WiFi Access Point ώστε να μην “κουράζουμε” το κύριο Access Point ή επειδή διαθέτουμε περισσότερες ασύρματες συσκευές από αυτές όπου μπορεί να διαχειριστεί το κύριο Access Point αυτό.

Παρουσίαση του docker-ap:

To docker-ap αποτελεί ένα αποθετήριο με ένα Dockerfile και ένα bash script (wlanstart.sh), όπου στην πραγματικότητα δημιουργεί ένα image το οποίο περιλαμβάνει ένα Alpine Linux στο οποίο τρέχει ένα hostapd και ένας DHCP server ο οποίος δίνει IPs στις συσκευές όπου θα συνδέονται στο WiFi Access Point μας.
Η διαδικασία για να γίνει λειτουργικό είναι πάρα πολύ απλή.
Μάλιστα, δημιούργησα και ένα docker-compose αρχείο για όσους προτιμούν αυτές τις λύσεις για ευκολότερες αλλαγές/προσθήκες.

Aρχικά, κατεβάζουμε τα περιεχόμενα του αποθετήριου δίνοντας:

git clone https://github.com/offlinehacker/docker-ap.git

cd docker-ap

Χτίζουμε το docker-ap image δίνοντας:

docker build -t docker-ap .

Kαι δημιουργούμε το container δίνοντας:

docker run -i -t -e INTERFACE=wlan0 -e OUTGOINGS=eth0 --net host --privileged --name docker-ap --restart unless-stopped  docker-ap

Είτε δημιουργούμε ένα docker-compose.yml αρχείο:

nano docker-compose.yml

Και έπειτα κάνουμε copy paste τα εξής:

version: '3.8'

services:
  docker-ap:
    image: docker-ap
    container_name: docker-ap
    network_mode: host
    privileged: true
    restart: unless-stopped  
    environment:
      - INTERFACE=wlan0
      - OUTGOINGS=eth0
    tty: true
    stdin_open: true

Kαι το δημιουργούμε δίνοντας απο τερματικό ενώ βρισκόμαστε στον φάκελο όπου βρίσκεται το docker-compose.yml:

docker-compose up -d

Mε τις default ρυθμίσεις όπως τις έχει ορίσει ο δημιουργός του docker-ap:

  • Δημιουργείται ένα access point που λειτουργεί στους 2.4Ghz,
    Interface λειτουργίας το wlan0 και outgoing το eth0,
  • Χρησιμοποιεί έναν προεπιλεγμένο κωδικό πρόσβασης,
  • Χρησιμοποιεί για DNS της Google
  • Δίνει IPs της μορφής 192.168.254.xx

Φυσικά οι προεπιλεγμένες ρυθμίσεις αυτές μπορούν πολύ εύκολα να αλλάξουν κάνοντας τροποποιήσεις στο αρχείο wlanstart.sh:
Πιο συγκεκριμένα, οι αλλαγές πρέπει να πραγματοποιηθούν στις παρακάτω σειρές όπως αναφέρονται παρακάτω:

true ${INTERFACE:=wlan0} # Η συσκευή που θα γίνει το AP, ορίζεται στο docker-compose
true ${SUBNET:=192.168.254.0} # Το υποδίκτυο που επιθυμείτε να λειτουργεί
true ${AP_ADDR:=192.168.254.1} # Η διεύθυνση ΙΡ όπου θα έχει
true ${SSID:=docker-ap} # Το όνομα του Access Point όπου θέλουμε να δώσουμε
true ${CHANNEL:=11}  # Το κανάλι λειτουργίας, π.χ. προσωπικά το άλλαξα σε 6
true ${WPA_PASSPHRASE:=passw0rd} # Κωδικός πρόσβασης στο Access Point
true ${HW_MODE:=g} # Mode, θα αναλυθεί αναλυτικά στο επόμενο υποκεφάλαιο
true ${DRIVER:=nl80211} # Για Raspberry Pi να μείνει ακριβώς έτσι!
true ${HT_CAPAB:=[HT40-][SHORT-GI-20][SHORT-GI-40]}
true ${MODE:=host}

Ποιο HW Mode να επιλέξω;

Υπάρχουν πολλές επιλογέες όπου μπορούν να χρησιμοποιηθούν αντί του g, όπως:

  • a -> 802.11a: Χρησιμοποιεί τη ζώνη των 5 GHz.
  • b -> 802.11b: Χρησιμοποιεί τη ζώνη των 2.4 GHz.
  • g -> 802.11g: Χρησιμοποιεί τη ζώνη των 2.4 GHz και προσφέρει καλύτερες ταχύτητες σε σύγκριση με το 802.11b.
  • n -> 802.11n: Μπορεί να λειτουργήσει και στις δύο ζώνες των 2.4 GHz και 5 GHz και παρέχει βελτιωμένες ταχύτητες και εμβέλεια σε σύγκριση με το 802.11g.
  • ac -> 802.11ac: Χρησιμοποιεί κυρίως τη ζώνη των 5 GHz, προσφέροντας υψηλότερες ταχύτητες και χαμηλότερη καθυστέρηση σε σύγκριση με το 802.11n.

Που θα βρω τα ονόματα της ασύρματης και ενσύρματης κάρτας δικτύων μου;

Μπορούμε πολύ εύκολα να δώσουμε ifconfig και θα εμφανιστούν αναλυτικά όλες οι κάρτες δικτυών (πραγματικές ή εικονικές) όπου περιλαμβάνονται στο σύστημα μας.

Αλλαγή του DNS;

By default, το docker-ap χρησιμοποιεί τους DNS της Google, ωστόσο εμείς ενδεχομένως να θέλουμε να χρησιμοποιήσουμε κάποια εναλλακτική λύση είτε τον δικό μας DNS (π.χ. το Pihole μας).
Για να πραγματοποιηθεί αυτό, το μόνο που έχουμε να κάνουμε είναι πάλι στο wlanstart.sh να αλλάξουμε το:

option domain-name-servers 8.8.8.8, 8.8.4.4;

Στους DNS όπου επιθυμούμε εμείς! Για παράδειγμα, στην περίπτωσή μου το έχω αλλάξει σε:

option domain-name-servers 192.168.1.210, 1.1.1.1;

Και λειτουργεί απροβλημάτιστα!

ΠΡΟΣΟΧΗ: Για να πραγματοποιηθούν όλες οι αλλαγές/παραμετροποιήσεις όπου κάναμε παραπάνω, θα πρέπει να κάνουμε ξανά build το νέο image με τις νέες αλλαγές και έπειτα να “σβήσουμε” και να δημιουργήσουμε εκ νέου νέο container δίνοντας:

docker-compose down
docker-compose up -d

Και έτσι θα εφαρμοστούν οι αλλαγές όπου ορίσαμε!!!

Και τι κερδίσαμε δημιουργώντας WiFi Access Point ως Docker Container;

Όπως διαπιστώσαμε, η διαδικασία είναι εξαιρετικά απλή και μέσα σε ελάχιστα λεπτά έχουμε ένα λειτουργικό WiFi Access Point το οποίο:

  • Δεν επηρεάζει το υπόλοιπο σύστημα ως υποδομή,
  • Δεν χρειάζονται παραμετροποιήσεις στο κύριο server, πράγμα που μπορεί να επηρεάσει την ομαλή λειτουργία του υπόλοιπου server ή να δημιουργήσει/σπάσει άλλα δίκτυα που δουλεύουν ήδη ομαλά στον server σας,
  • Ανοίγει/κλείνει εξαιρετικά εύκολα μέσω των εντολών docker stop docker-ap , docker start docker-ap, συνεπώς μπορείτε να ενεργοποιείτε το WiFi Access Point σας όποτε εσείς επιθυμείτε και έπειτα να το απενεργοποιείτε,
  • Δεν κάνει overlap με άλλες υπηρεσίες που ενδεχομένως να τρέχετε στον server σας.
  • Οι επιπλέον παραμετροποιήσεις γίνονται πάρα πολύ εύκολα όπως δείξαμε παραπάνω.
  • Μπορούμε να φτιάξουμε πολλαπλές παραμετροποιήσεις για εναλλαγές ρυθμίσεων στο WiFi Access Point με πολλαπλά containers και να ενεργοποιούμε κάθε φορά αυτό με τις παραμετροποιήσεις όπου μας είναι απαραίτητο χωρίς να χρειάζεται να κάνουμε αλλαγές ( π.χ. ενεργοποίηση 5ghz Access Point μόνο όταν είναι απαραίτητο και μετά να τρέχουμε και πάλι το container με ρυθμίσεις για 2.4Ghz, ή να έχουμε ένα guest προσωρινό με διαφορετικές ρυθμίσεις με άλλο κωδικό πρόσβασης κτλπ.)

…and enjoy your new WiFi Access Point :slight_smile:

6 «Μου αρέσει»

Πολύ καλή η ιδέα και το άρθρο!
Θα χρειαστώ βέβαια αρκετό διάβασμα αφού μου αρέσει να καταλαβαίνω αυτά που φτιάχνω.
Θα ήθελα όμως να ξέρω και μερικά τεχνικά χαρακτηριστικά:
Θα δουλέψει σε RPi3 και RPi4? Πόση μνήμη χρειάζεται?
Πόσο χώρο θα καλύψει (τι εμβέλεια έχει δλδ). Υπάρχει τρόπος να του ‘‘φορτώσουμε’’ κεραία?

Σε ευχαριστώ πολύ. :slight_smile:

2 «Μου αρέσει»

Καλησπέρα,

Nαι, δουλεύει γενικά σε όλες τις συσκευές με Docker και κάρτες δικτύου όπου υποστηρίζουν AP mode.

Φυσικά, ενώνεις την κεραία που σε ενδιαφέρει στο Raspberry Pi σου, με ifconfig βλέπεις το όνομα της συσκευής σου, και το wlan0 το κάνεις αντικατάσταση αντί του wlan0 στο interface.

Σχετικά αμελητέα, containeers!!! :slight_smile:

2 «Μου αρέσει»

Ωραίο αυτό. Ευχαριστούμε

1 «Μου αρέσει»

Ναι, βολεύει απίστευτα. Γιατί στο migration που έκανα τώρα από Raspberry Pi 4 σε 5, λογω αλλαγής από dchpd σε networkmanager στο bookworm, μου έσπασε ο hostapd και δεν έβγαζα άκρη…

Με ένα container, τα ξεπέρασα τα προβλήματα.

2 «Μου αρέσει»