Nachdem ich nun etwas Erfahrung mit meinem 3D Drucker sammeln konnte, bleibt es nicht aus, das Gerät in mein Heimnetzwerk aufzunehmen. Dazu habe ich den Raspberry Pi 3, den ich noch hatte mit einer IR-Camera und IR-LEDs ausgestattet. Mittels eines Reverse Proxies kann ich von überall auf den Drucker zugreifen und mir den Status anschauen.
Hier folgt die Einrichtung des Raspi inkl. des Druckservers Octoprint.
Einrichtung Betriebssystem
Zuerst habe ich ein Raspian Lite Image auf die MicroSD Karte kopiert. Damit ich ohne Bildschirm direkt einen SSH Server und eine Wireless Verbindung habe, werden auf der Karte noch zwei Dateien ergänzt.
ssh und wireless automatisch aktivieren
- Im FAT Filesystem eine Datei "ssh" anlegen
$ touch ssh
- Die Datei "wpa_supplicant.conf" anlegen und mit den WLAN Zugangsdaten füllen.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="XXXXXXXXXXXXX"
psk="XXXXXXXXXXXXX"
key_mgmt=WPA-PSK
}
Danach kann der Raspberry Pi gestartet werden und ist per SSH im WLAN erreichbar.
UTF-8 Umgebung
sudo apt install locales
sudo dpkg-reconfigure locales
# en_US.UTF-8
# de_DE.UTF-8
# Default: C.UTF-8
Anhängen an /etc/skel/.bashrc, /etc/skel/.profile, damit für neue Benutzer die Sprache de_DE.UTF-8 als Default gesetzt wird.
echo "export LC_ALL=de_DE.UTF-8" | sudo tee -a /etc/skel/.bashrc
echo "export LANG=de_DE.UTF-8" | sudo tee -a /etc/skel/.bashrc
echo "export LANGUAGE=de_DE.UTF-8" | sudo tee -a /etc/skel/.bashrc
echo "export LC_ALL=de_DE.UTF-8" | sudo tee -a /etc/skel/.profile
echo "export LANG=de_DE.UTF-8" | sudo tee -a /etc/skel/.profile
echo "export LANGUAGE=de_DE.UTF-8" | sudo tee -a /etc/skel/.profile
cp /etc/skel/.bash* /etc/skel/.profile ~
Anhängen an /root/.bashrc, /root/.profile, damit der root-User die Sprache C.UTF-8 als Default gesetzt wird.
echo "export LC_ALL=C.UTF-8" | sudo tee -a /root/.bashrc
echo "export LANG=C.UTF-8" | sudo tee -a /root/.bashrc
echo "export LANGUAGE=C.UTF-8" | sudo tee -a /root/.bashrc
echo "export LC_ALL=C.UTF-8" | sudo tee -a /root/.profile
echo "export LANG=C.UTF-8" | sudo tee -a /root/.profile
echo "export LANGUAGE=C.UTF-8" | sudo tee -a /root/.profile
- Neu anmelden (oder source ~/.bashrc)
- Beim root-User Spracheinstellungen mittels "sudo -i locale" prüfen. Beim aktuellen Benutzer mittels "locale".
Zeitzone einrichten
$ sudo dpkg-reconfigure tzdata
- Europe/Berlin
Konsole und Keyboard einrichten
$ sudo apt install console-setup console-data unicode-data
$ sudo dpkg-reconfigure console-data
- Tastaturbelegung aus der Gesamtliste wählen
- pc / qwertz / German / Standard / latin1 - no dead keys
$ sudo rm /etc/motd ; sudo touch /etc/motd
root-Passwort vergeben
$ sudo passwd
Hauptbenutzer anlegen und konfigurieren
Da ich den Default-User nicht behalten möchte, wird ein eigener User (hier: svenpaass) angelegt und der pi-User gelöscht.
$ sudo useradd -c "Sven Paaß" -m -U -G adm,tty,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi -s /bin/bash svenpaass
$ sudo passwd svenpaass
$ echo "svenpaass ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/010_svenpaass-nopasswd
$ sudo mkdir -p ~svenpaass/.ssh && sudo touch ~svenpaass/.ssh/authorized_keys
$ sudo chown -R svenpaass:svenpaass ~svenpaass/.ssh
$ sudo chmod 700 ~svenpaass/.ssh && sudo chmod 600 ~svenpaass/.ssh/authorized_keys
- Die Datei /home/svenpaass/.ssh/authorized_keys mit dem SSH-Public Key befüllen
Mit dem neuen User einloggen!
pi-Default User löschen
$ sudo userdel -r pi
$ sudo rm /etc/sudoers.d/010_pi-nopasswd
Firewall konfigurieren
$ sudo apt install iptables iptables-persistent
-
Die Regeln speichern (damit die rules-Dateien angelegt werden)
-
/etc/iptables/rules.v4
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
:SSH - [0:0]
# Multicast und Broadcasts
-A INPUT -m pkttype --pkt-type multicast -j ACCEPT
-A INPUT -m pkttype --pkt-type broadcast -j ACCEPT
# Rate limit ping requests
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 30/min --limit-burst 8 -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j DROP
# Accept established connections
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Accept all traffic on loopback interface
-A INPUT -i lo -j ACCEPT
# Drop packets declared invalid
-A INPUT -m conntrack --ctstate INVALID -j DROP
# SSH rate limiting
-A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j SSH
-A SSH -m recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
-A SSH -m recent --name sshbf --rttl --rcheck --hitcount 20 --seconds 1800 -j DROP
-A SSH -m recent --name sshbf --set -j ACCEPT
# Send TCP and UDP connections to their respective rules chain
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Reject dropped packets with a RFC compliant responce
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-rst
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
## TCP PORT RULES
# Multicast TCP
-A TCP -s 224.0.0.0/4 -j ACCEPT
-A TCP -d 224.0.0.0/4 -j ACCEPT
-A TCP -s 240.0.0.0/5 -j ACCEPT
# HA-Proxy
-A TCP -p tcp --dport 80 -j ACCEPT
-A TCP -p tcp --dport 443 -j ACCEPT
# Octoprint
-A TCP -p tcp --dport 1900 -j ACCEPT
# xrdp
-A TCP -p tcp --dport 3389 -j ACCEPT
# other
-A TCP -p tcp -j LOG
## UDP PORT RULES
# Multicast DNS
-A UDP -p udp -d 224.0.0.251/32 --sport 5353 --dport 5353 -j ACCEPT
# NTP
-A UDP -p udp --dport 123 -j ACCEPT
# systemd-resolv
-A UDP -p udp --dport 5355 -j ACCEPT
-A UDP -p udp --sport 5355 -j ACCEPT
# Dropbox LAN Sync
-A UDP -p udp --sport 17500 --dport 17500 -j ACCEPT
# other
-A UDP -p udp -j LOG
COMMIT
- /etc/iptables/rules.v6
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
:SSH - [0:0]
# Drop packets with RH0 headers
-A INPUT -m rt --rt-type 0 -j DROP
-A OUTPUT -m rt --rt-type 0 -j DROP
-A FORWARD -m rt --rt-type 0 -j DROP
# Rate limit ping requests
-A INPUT -p icmpv6 --icmpv6-type echo-request -m limit --limit 30/min --limit-burst 8 -j ACCEPT
-A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
# Accept established connections
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Accept all traffic on loopback interface
-A INPUT -i lo -j ACCEPT
# Drop packets declared invalid
-A INPUT -m conntrack --ctstate INVALID -j DROP
# SSH rate limiting
-A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j SSH
-A SSH -m recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
-A SSH -m recent --name sshbf --rttl --rcheck --hitcount 20 --seconds 1800 -j DROP
-A SSH -m recent --name sshbf --set -j ACCEPT
# Send TCP and UDP connections to their respective rules chain
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Reject dropped packets with a RFC compliant responce
-A INPUT -p udp -j REJECT --reject-with icmp6-adm-prohibited
-A INPUT -p tcp -j REJECT --reject-with icmp6-adm-prohibited
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
## TCP PORT RULES
# HA-Proxy
-A TCP -p tcp --dport 80 -j ACCEPT
-A TCP -p tcp --dport 443 -j ACCEPT
# Octoprint
-A TCP -p tcp --dport 1900 -j ACCEPT
# xrdp
-A TCP -p tcp --dport 3389 -j ACCEPT
# other
-A TCP -p tcp -j LOG
## UDP PORT RULES
# NTP
-A UDP -p udp --dport 123 -j ACCEPT
# Dropbox LAN Sync
-A UDP -p udp --sport 17500 --dport 17500 -j ACCEPT
# Bonjour Daemon
-A UDP -p udp --dport 5353 -j ACCEPT
# systemd-resolv
-A UDP -p udp --dport 5355 -j ACCEPT
-A UDP -p udp --sport 5355 -j ACCEPT
# other
-A UDP -p udp -j LOG
COMMIT
Die Firewall-Regeln aktivieren:
$ sudo systemctl enable netfilter-persistent
$ sudo systemctl restart netfilter-persistent
Fail2Ban installieren (Brute Force Attacken auf z.B. ssh Server abschwächen)
$ sudo apt install fail2ban
Hostname
- /etc/hostname
rpi
- /etc/hosts
127.0.1.1 rpi
APT Sources
- /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
$ sudo apt clean && sudo apt update && sudo apt upgrade
$ sudo apt install rpi-update
$ sudo rpi-update
$ sudo apt-get autoremove --purge && sudo apt-get clean
$ sudo reboot
Sonstige Tools
$ sudo apt install screen gnupg dirmngr
X-Server
$ sudo apt install xrdp xorgxrdp xserver-xorg-legacy mesa-utils guvcview raspberrypi-ui-mods rpi-chromium-mods gldriver-test lxpolkit
$ sudo dpkg-reconfigure xserver-xorg-legacy
# für jeden zulassen.
$ sudo sed -i 's/pi/svenpaass/g' /etc/polkit-1/localauthority.conf.d/60-desktop-policy.conf
Unnötige Pakete entfernen
$ sudo apt install deborphan
$ sudo apt autoremove --purge $(deborphan)
Desktop Tools
$ sudo apt install synaptic mate-terminal
Raspberry Hardware konfigurieren & Raspi Camera aktivieren
$ sudo raspi-config
3 -> Boot Options
B1 -> Desktop/CLI -> Console
B2 -> Wait for Network at Boot -> Yes
B3 -> Splash Screen -> Yes
5 -> Interfacing Options
P1 -> Camera -> Yes
P4 -> SPI -> Yes
P5 -> I2C -> Yes
P6 -> Serial
login shell over serial -> Yes
7 -> Advanced Options
A2 -> No
A3 -> Memory Split -> 144
A4 -> 0 Auto
A6 -> Pixel Doubling -> No
A7 -> GL Driver -> G1 GL (Full KMS)
8 -> Update
$ sudo reboot
GL Treiber Bug (https://www.raspberrypi.org/forums/viewtopic.php?t=200286)
echo "export DRAW_USE_LLVM=0" >> ~/.bashrc
echo "export DRAW_USE_LLVM=0" | sudo tee -a /etc/skel/.bashrc
Test der 3D Leistung / des GL-Treibers
- Mittels RDP verbinden
$ glxgears
$ glxinfo | grep '^OpenGL'
- Einstellungen -> Bildschirmschoner (ausschalten!)
- Einstellungen -> Appearance Settings
-> Desktop
-> Layout: No Image
-> Color: #96939E
-> Documents, Wastebasket, Mounted Disks
Hiermit habe ich ein Grundsystem mit grafischer Oberfläche, die ich bei Bedarf mittels Remote Desktop Verbindung erreichen kann.
Im zweiten Teil wird die Drucksoftware Octoprint installiert...