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...

Next Post Previous Post