Pi 4 w/1GB of RAM is $30 https://www.adafruit.com/product/4295, which is ~the same price as buying older models.
Pi 4 has dual-band WiFi
Debian on Raspberry Pi
https://wiki.debian.org/RaspberryPi
https://wiki.debian.org/RaspberryPiImages
Actual images and instructions https://raspi.debian.net/. gwolf makes them, a Tor person!
Before first boot
The pi-init.sh
script in gitolite:arduino/pi-playbooks.git
does what is needed, assuming you have the image from above. What follows is some notes that were being taken while writing it.
Generate host SSH keys
# sudo is necessary if the pi's etc/ssh directory is owned by root
cd /path/to/piroot/etc/ssh
sudo ssh-keygen -t rsa -f ssh_host_rsa_key -C '' -P ''
sudo ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -C '' -P ''
sudo ssh-keygen -t ed25519 -f ssh_host_ed25519_key -C '' -P ''
Configure internet
See /etc/network/interfaces.d/*
If only Ethernet is desired, then everything should work fine as-is.
If WiFi, then edit wlan0
to have the SSID and password. As of Debian 10 and the being generated by gwolf today, it should look like
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid A multi-word SSID need not quotes
wpa-psk ThePassword
Use ifup/ifdown.
Pubkey auth for root
# Make sure you are root or chown everything done here to root
cd /path/to/piroot/root
mkdir .ssh
chmod 700 !$
cd !$
touch authorized_keys
chmod 600 !$
# Put the pubkey into authorized_keys. Using the key on horsehead in Decembmer 2020:
echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPjlOza4cGtHbh1P6c1x/BVd4G0TImR2i1u7uvGHsyXb arduino@horsehead' >> authorized_keys
On first boot
The majority of the repo gitolite:arduino/pi-playbooks.git
handles this stuff.
Packages
To create a pi that acts as a hotspot/captive portal (so that you are forced to its web interface and can configure it or whatever), the key packages you need are:
- nginx
- dnsmasq
- hostapd
Nginx for the webserver, obviously.
Dnsmasq resolves all DNS requests to the Pi's IP, which means when a device looks for a captive portal, e.g. with a request to http://captiveportal.example.com, they notice they didn't get what they expected and prompt the user to "login" using the pi's webserver.
Hostapd ... idk exactly how it does what it does, and I feel like I could have configured the WiFi interface myself, as I think that's all else that's needed. Regardless, it configures the WiFi interface to be an access point and sets the SSID, channel, etc.
No iptables or ipv4.ip_fowarding changes needed.
See the pi-playbooks repo for more details, but I wrote a very simple flask website that gets wifi creds from a web form. nginx and gunicorn were used, though neither are required I don't think. Not for something this simple.
Vestigial notes
Other packages to make sure are installed and configured: dnsmasq, hostapd. /etc/dnsmasq.conf (root:root 644) and /etc/hostapd/hostapd.conf (root:root 644)
net.ipv4.ip_forwarding does not seem to be needed.
Resolving all DNS requests to the pi's IP does seem to be needed. /etc/dnsmasq.conf
should have address=/#/192.168.33.1
in it.
iptables rules do not seem to be needed.
/etc/network/interfaces.d/wlan0 root:root 600
Had to unmask hostapd before starting it.
This was the last webpage that I needed: https://www.cyberciti.biz/faq/debian-ubuntu-linux-setting-wireless-access-point/
TODO
Figure out the Pi's IP.
Run ansible playbook that does a bunch of stuff like update packages, install new packages, configure tor.