Raspberry Pi 4 von der Einrichtung bis zum Produktiv-Server

Diese Anleitung soll helfen einen produktiven Webserver auf dem Raspberry Pi 4 4GB RAM einzurichten. Ich werde diesen Server verwenden um in PHP / Mysql Websites bzw. Apps zu entwickeln. Die Einrichtung des Apache2 soll kompatibel mit meinem "real Servern" werden! Ziel ist es: "Aplikation entwickeln -> testen -> läuft -> hochladen -> fertig"! Der PI wird ausschließlich per Console bedient und eingerichtet nicht benutzte Ressourcen werden deaktiviert!
Es gibt 1000 und 1 Tutorial im WWW wie man was mit dem PI machen kann. Das was ich hier niederschreibe habe ich getestet ... also sollte es halbwegs funktionieren. Naja, zumindest erweckt es den Anschein ;o)! Sollte Ihr über Fehler stolpern, oder sonstige Verbesserungen vorschlagen wollen: dann bitte hier nachfragen bzw. melden deutsches Raspberry Forum dort finden sich bestimmt Mitglieder die helfen können!

OK: Rechtsxchreibfehler ich meinte Rechtschreibfehler die gibt es hier! Ich schreibe den Quelltext nieder... ich muss es lesen können. Naja, vieleicht findet sich ja ein Linguist der die Sache korrigiert - gerne per PN.

  1. PI Vorbereitung OK ;o)
    1. Image auf SD-Karte spielen
    2. Image für den Erststart am Pi vorbereiten
    3. Pi für das Netzwerk einrichten
    4. Abbild der SD-Karte sichern
  2. PI mobiler Hotspot mit virtuellen Interface OK ;o)
  3. PI Debug Proxy Http & Https OK ;o)
  4. Pi Webserver Apache / Php / Mysql OK ;o)
  5. Pi DNS Server einrichten - Dnsmasq OK ;o)
  6. PI bindfs / WEB Verzeichnisse / Rechte / Hosts / SSL OK ;o)
    1. Neue Website Anlegen - Befehle
  7. PI Samba einrichten OK ;o)
  8. Pi Node JS / Yarn / Git OK ;o)
  9. Pi Domain PHP-Template / Bulma CSS / Gulp OK ;o)
  10. PI Optimierung RAM / Hardware OK ;o)
  11. PI Fine Tuning Mysql / mod rewrite / memcache experimentell ;o>
  12. PI Nginx - Reverse Proxy / Build Nginx OK ;o)
  13. PI Iptables - Firewall OK ;o)
  14. PI USB einbinden OK ;o)
Warum Abbild sichern?
ich habe mir angewöhnt bei der Einrichtung nach jedem erfolgreichen Schritt ein Abbild (datum_was_kann_der_PI.img) von der SD-Karte auf meinen Rechner zu spiegeln. Ich benutze dafür eine kleine Karte (8GB) somit geht es relativ schnell (ca. 8 - 12 Minuten). Sollte etwas beim nächsten Step der Einrichtung nicht so funktionieren wie gewollt, greife ich einfach auf das letzte funktionierende Abbild zurück.

Vorbereitung

Programme die benötigt werden!

hier die Download-Quellen:

Step 1. a) Image auf SD-Karte spielen

  • Software auf SD-Karte kopieren
Win32 Disk Imager Fehler
Fehler beim Versuch, das Volumen zu sperren. Fehler 5:Zugriff verweigert.

Lösung

  • Win32 Disk Imager mit Adminrechten starten
  • Laufwerk wird verwendet - USB Laufwerk auswerfen und wieder verbinden

Step 1 b.) Image für den Erststart am Pi vorbereiten

  • SSH Einrichten / die Datei ssh auf der SD-Karte anlegen
  • Wlan Schnittstelle Einrichten / die Datei wpa_supplicant.conf editieren und abspeichern
a.) erstelle eine Datei SSH (ohne Endung!) auf der SD-Karte [i] ohne keine SSH Verbindung möglich!
copy console
Microsoft Windows [Version 10.0.18362.175] (c) 2019 Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\ich>k: K:\>copy nul "ssh" 1 Datei(en) kopiert. K:\>
b.) Wlan Schnittstelle einrichten [i] hier die korrekten Zugangsdaten eintragen PI baut Verbindung zum vorhandenen Wlan auf!
					
copy console
Microsoft Windows [Version 10.0.18362.175] (c) 2019 Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\ich>k: K:\> ( echo ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev echo update_config=1 echo country=DE echo # Network Setting Wlan0 AUF echo network={ echo scan_ssid=1 echo ssid="eigenen WLAN Namen hier eintragen" echo psk="eigenes WLAN Passwort hier eintragen" echo key_mgmt=WPA-PSK echo } echo # Network Setting Wlan0 ENDE ) > wpa_supplicant.conf | notepad wpa_supplicant.conf K:\>
In Windows Notepad bearbeiten und auf SD-Karte speichern (wpa_supplicant.conf)

c.) PI mit eingerichteter Karte starten!

Das Netzwerk

Programme die benötigt werden!

hier die Download-Quellen:

Step 1 c.)Pi für das Netzwerk einrichten

  • Pi im Netzwerk per SSH ansprechen
  • PI mit der Konsole konfigurieren
Netzwerk Scan
mit Kitty verbinden
Benutzer: pi Passwort: raspberry
Alles auf den neusten Stand bringen
copy console
sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade && sudo apt-get autoremove && sudo apt-get autoclean
einen Reboot ausführen
copy console
sudo reboot
Alles Ok? mit diesen Befehlen kann man prüfen
copy console
sudo grep -i -e fail -e error -e corrupt /var/log/syslog sudo grep -Ei 'warn|fail|error|debug|firmware|missing|not found|fault|conflict|corrupt|disable|support|not available' /var/log/syslog sudo journalctl -p 3 -xb sudo dmesg
copy console
sudo poweroff
Abbild sichern ! ;o)

Step 1 d.) Abbild der SD-Karte sichern

  • PI Runterfahren (sudo poweroff)
  • Karte entnehmen
  • Win32 Disk Imager Abbild sichern

PI Wissen die Grundlagen!

hier ein paar Quellen:

Step 2.)WLAN Repeater einrichten

Es gibt mehrere Möglichkeiten das Netzwerkverhalten des PI einzurichten! Diese Anleitung basiert auf Systemd andere Netzwerkdienste werden deaktiviert!
Der hier aufgezeigte Weg ermöglicht dem PI sich per Wlan oder Kabel mit dem eigenen Netz zu verbinden. Zum Testen meiner Anwendung richte ich einen virtuellen Wlan Hotspot ein. Somit ist es möglich sich mit verschiedenen Endgeräten (Iphone, Android, PC usw..) mit dem (Test)-Wlanpunkt zu verbinden und die entwickelte Aplikation zu testen. Sollte die Aplikation für eine Vertriebsplattform (App Store) freigegeben werden ist es auch möglich über dem Mitmproxy einen Debug zu fahren. Der Proxy kann "HTTPS Verbindungen" im Klartext darstellen.

hostapd = Access-Points einrichten
copy console
sudo apt install -y hostapd sudo systemctl unmask hostapd sudo systemctl enable hostapd
copy console
sudo systemctl mask networking.service sudo systemctl mask dhcpcd.service sudo systemctl disable systemd-networkd-wait-online.service sudo systemctl mask systemd-networkd-wait-online.service sudo systemctl disable avahi-daemon.service sudo systemctl mask avahi-daemon.service sudo mv /etc/network/interfaces /etc/network/interfaces.bak sudo sed -i '1i resolvconf=NO' /etc/resolvconf.conf

Was macht sudo systemctl mask?
systemctl start , systemctl stop : Startet (stoppt) die fragliche Einheit sofort ; systemctl enable , systemctl disable : markiert (unmarkiert) die Unit für Autostart beim Booten (in einer Unit-spezifischen Weise, beschrieben im Abschnitt [Install] ); systemctl mask , systemctl unmask : verbietet (erlaubt) alle Versuche, die fragliche Einheit zu starten (entweder manuell oder als Abhängigkeit von einer anderen Einheit, einschließlich der Abhängigkeiten des Standard-Boot-Ziels). Beachten dass die Markierung für den Autostart in Systemd implementiert wird, indem eine künstliche Abhängigkeit vom Standard-Boot-Ziel zur betreffenden Einheit hinzugefügt wird, sodass "Maske" auch das Autostarten nicht zulässt.
Was macht sudo sed -i '1i resolvconf=NO' /etc/resolvconf.conf?
fügt "resolvconf=NO" an den Anfang der Datei /etc/resolvconf.conf
siehe: cat /etc/resolvconf.conf
Was macht sudo mv /etc/network/interfaces /etc/network/interfaces.bak?
entfernt die Datei /etc/network/interfaces durch Umbennung in /etc/network/interfaces.bak

# systemd-networkd-wait-online.service
# https://askubuntu.com/questions/972215/a-start-job-is-running-for-wait-for-network-to-be-configured-ubuntu-server-17-1
				
	root@raspberrypi:~# systemd-analyze blame
      2min 287ms systemd-networkd-wait-online.service
         32.189s apt-daily-upgrade.service
         31.343s apt-daily.service
          6.814s hciuart.service
          5.185s rc-local.service
# avahi-daemon.service
# https://wiki.ubuntuusers.de/Avahi/		  
		  
					
copy console
sudo systemctl enable systemd-networkd.service sudo systemctl enable systemd-resolved.service sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Was macht sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf?
erstellt einen symbolischen Link damit resolv.conf auch von anderen gefunden wird




copy console
sudo chmod 600 /etc/hostapd/hostapd.conf sudo sed -i 's/^#DAEMON_CONF=.*$/DAEMON_CONF="\/etc\/hostapd\/hostapd.conf"/' /etc/default/hostapd

Was macht sudo sed -i 's/^#DAEMON_CONF=... ?
entfernt das führende zeichen # in der Datei siehe: cat /etc/default/hostapd

copy console
sudo bash -c 'cat > /etc/hostapd/hostapd.conf <<EOF interface=ap0 driver=nl80211 ssid=PI-Server country_code=DE hw_mode=g channel=6 auth_algs=1 wpa=2 wpa_passphrase=network1234 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP EOF'

Was macht sudo bash -c 'cat > /etc/hostapd/hostapd.conf?
erstellt einen Zugangspunkt für das wlan! Der PI wird "Router" und ist erreichbar unter:

 ssid=PI-Server 
 wpa_passphrase=network1234 
 

copy console
sudo systemctl --full edit hostapd.service

Was macht sudo systemctl --full edit hostapd.service?
Systemctl ist ein Kommandozeilenwerkzeug für systemd. Systemctl bietet ebenfalls die Möglichkeit bestehende Unit-Dateien zu bearbeiten. Um die ganze Unit-Datei zu bearbeiten dient die Option --full.

systemctl edit --full UNITNAME 
Es wird der hostapd-Service *After=network.target deaktiviert!
aus After=network.target wird #After=network.target (ausdokumentiert mit Raute)
über Strg + X, Y und Enter abspeichern.

copy console
sudo systemctl edit hostapd.service

sudo systemctl edit hostapd.service?
öffnet die Datei jetzt das einfügen:

[Unit]
Wants=wpa_supplicant@wlan0.service

[Service]
ExecStartPre=/sbin/iw dev wlan0 interface add ap0 type __ap
ExecStopPost=-/sbin/iw dev ap0 del

copy console
sudo bash -c 'cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF country=DE ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="bestehender_Wlan_Zugangspunkt" psk="bestehendes_Wlan_Passwort" key_mgmt=WPA-PSK } EOF'

was macht bash -c 'cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF....?
Hier wird das bestehende Netzwerk in die Datei wpa_supplicant-wlan0.conf eingefügt. Du Kannst auch einen Scan durchführen:

sudo iwlist wlan0 scan | grep ESSID
überprüfen ob eine Verbindung aufgebaut wurde
sudo iwconfig wlan0

copy console
sudo chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf sudo systemctl disable wpa_supplicant.service sudo systemctl enable wpa_supplicant@wlan0.service

Was macht sudo chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf?
Setzt die Rechte von wpa_supplicant-wlan0.conf auf -rw-------

		User	Group	Other
Read		Yes	No	No 
Write		Yes	No	No 
Execute		No	No	No 

copy console
sudo systemctl edit wpa_supplicant@wlan0.service

Hier muss folgendes rein:

[Unit]
BindsTo=hostapd.service
After=hostapd.service

[Service]
ExecStartPost=/sbin/iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE
  • -t Auswahl einer Tabelle (filter, nat, mangle);
  • nat Diese Tabelle ist für alle Arten von Adress-Umsetzungen oder Port-Forwarding verantwortlich und besteht aus den Chains PREROUTING, OUTPUT und POSTROUTING. Die in dieser Tabelle befindlichen Chains werden für jedes erste Paket einer neuen Verbindung aufgerufen und führen entsprechende Änderungen an den Port- oder IP-Nummern der Pakete durch.
  • -A Anfügen einer neuen Regel am Ende einer Chain/Tabelle
  • -D Löschen einer Regel aus einer Chain/Tabelle
  • POSTROUTING Hier gehen nochmals alle Pakete, die geroutet worden sind, durch (auch lokal erzeugte Pakete). Hier werden Angaben über die Herkunft eines Paketes verändert, wie:
    - Quell-IP-Adresse
    - Masquerading (Sonderform von Quell-IP-Änderung)
  • -o [!] Spezifiziert die Schnittstelle, durch die das Paket gehen wird. Endet der Name mit einem "+", so werden alle Schnittstellen, die mit dem vorangehenden Namen beginnen, getestet.
  • wlan0 Schnittstelle
  • -j Bestimmt, was nach Erfüllung der vorher spezifizierten Regel passieren soll. Fehlt dieser Parameter, hat die zugrunde liegende Regel keine Auswirkung.
  • MASQUERADE Dieses geroutete Paket bekommt als Absende-Adresse die IP-Nummer und einen beliebigen Port des ausgehenden Interfaces. Damit lassen sich bei Wählverbindungen mit nur einer IP-Adresse mehrere Rechner über einen Router an nur eine Wählverbindung koppeln. Beim Löschen des Interfaces mit der "Leih-IP Nummer" werden alle gemerkten Daten vergessen.

Bei allen folgenden Einträgen DNS-Auflösung anpassen!
DNS=192.168.0.1 8.8.8.8 
Muster: 
es wird von links nach rechts aufgelöst ... 
Namenserver(DNS) = Router(192.168.0.1) Google(8.8.8.8) 
copy console
sudo bash -c 'cat > /etc/systemd/network/08-wlan0.network <<EOF [Match] Name=wlan0 [Network] IPForward=yes # If you need a static ip address toggle commenting next three lines (example) DHCP=yes #Address=192.168.10.60/24 #Gateway=192.168.10.1 # Optional: if you want to connect to your own DNS server, set it here (example) DNS=192.168.0.1 8.8.8.8 EOF'

Was macht sudo bash -c 'cat > /etc/systemd/network/08-wlan0.network <<EOF...?
öffnet die Konfig-Datei 08-wlan0.network und fügt den Inhalt ein.
beachte das Verzeichnis: /etc/systemd/network/ kann mehrere ".network" , ".netdev" und ".link" Dateien enthalten. Die Abfolge des Einlesens erfolgt entsprechend der Namensgebung 01-wlan0.network dann 02-wlan0.network dann 03-eth0.network usw.

copy console
sudo bash -c 'cat > /etc/systemd/network/12-ap0.network <<EOF [Match] Name=ap0 [Network] Address=192.168.4.1/24 DHCPServer=yes [DHCPServer] # If you want to connect to your own DNS server, set its ip address here DNS=192.168.0.1 8.8.8.8 EOF'

Was macht sudo bash -c 'cat > /etc/systemd/network/12-ap0.network <<EOF ...?
Neben dem Interfaces wlan0 wird ein weieres Interfaces ap0 angelegt.
“AP-Modus”: Die WLAN-Schnittstelle ap0 ist virtuell und dient dem späteren Testen und Analysieren.

copy console
sudo bash -c 'cat > /etc/systemd/network/01-eth.network <<EOF [Match] Name=e* [Network] # to use static IP (with your settings) toggle commenting the next 8 lines. #Address=192.168.50.60/24 DNS=192.168.0.1 8.8.8.8 #[Route] #Gateway=192.168.50.1 #Metric=10 DHCP=yes [DHCP] RouteMetric=10 EOF'

was macht sudo bash -c 'cat > /etc/systemd/network/01-eth.network <<EOF....?
Hier wird das Netzwerk (Kabel) für systemd eingerichtet

copy console
sudo reboot

Wenn alles gut gelaufen ist stehen jetzt folgende Netzwerkmerkmale zur Verfügung:

  • lo: Loopback-Interface. Das ist die virtuelle Netzwerkkarte die für lokale Verbindungen auf die IP-Adresse 127.0.0.1
  • wlan0: mit Zugansdaten zum eigenen Wlan-Netz
  • eth0: Kabelgebundenes Netzwerk zum PI
  • ap0: Hotspot
root@raspberrypi:/etc/systemd/network# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:18:e9:69 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.44/24 brd 192.168.0.255 scope global dynamic eth0
       valid_lft 2521sec preferred_lft 2521sec
    inet6 2a02:2455:ae6:4c00:dea6:32ff:fe18:e969/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 1143117sec preferred_lft 538317sec
    inet6 fe80::dea6:32ff:fe18:e969/64 scope link
       valid_lft forever preferred_lft forever
3: wlan0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:18:e9:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.42/24 brd 192.168.0.255 scope global dynamic wlan0
       valid_lft 2528sec preferred_lft 2528sec
    inet6 fe80::dea6:32ff:fe18:e96a/64 scope link
       valid_lft forever preferred_lft forever
4: ap0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:18:e9:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.1/24 brd 192.168.4.255 scope global ap0
       valid_lft forever preferred_lft forever
    inet6 fe80::dea6:32ff:fe18:e96a/64 scope link
       valid_lft forever preferred_lft forever

copy console
sudo poweroff
Abbild sichern ! ;o)

Quellen zum Artikel

Step 3) Mitmproxy - Netzwerk-Monitoring

  • Mitmproxy is a free and open source interactive HTTPS proxy.
  • Netzwerk-Verkehr aufzeichnen und auswerten
Kurz gesagt wird ein "Man-in-the-Middle-(Angriff)" auf dem eigenen virtuellen Wlanpunkt ap0 gefahren, um sich in die Netzwerk-Kommikation einzuklinken und ein debuggen zu ermöglichen.

Mitmproxy Basiswissen

Ab hier experimentell d.h. wer Fehler findet bitte hier posten -> deutsches Raspberry Forum
Der Proxy dient zum Analysieren von Applikationen (Websites, Apps usw.). Es Kann der sämtlicher Datenverkehr mitgelesen werden... Um auch Anwendungen zu beobachten, die mit ihren Servern über eine gesicherte HTTPS-Verbindung kommunizieren, bietet der Mitmproxy ein eigenes Root-Zertifikat an, das sich auf iPad, iPhone, Windows, Android installieren lässt. Um dieses eimalig zu installieren müsst ihr bei laufender Proxy-Verbindung lediglich die Adresse mitm.it aufrufen.
sudo apt-get install python3-pip
copy console
sudo apt-get install python3-pip
copy console
sudo apt-get update && sudo apt-get upgrade sudo apt-get install python3-pip sudo apt-get install libssl-dev sudo pip3 install --upgrade pip sudo pip3 install mitmproxy
Schick alles durchgelaufen ohne Fehler....

Download-Quellen :: tls_passthrough.py und copy to /home/pi/

  • tls_passthrough.py
    https://github.com/mitmproxy/mitmproxy/blob/master/examples/complex/tls_passthrough.py
copy console
cd /home/pi/ wget https://raw.githubusercontent.com/mitmproxy/mitmproxy/master/examples/complex/tls_passthrough.py






copy console
sudo bash -c 'cat > /home/pi/start_mitmweb.sh <<EOF #!/bin/bash #mitmweb --mode transparent --web-port 9090 --web-iface 0.0.0.0 &>> /var/log/mitmweb.log mitmweb -s /home/pi/tls_passthrough.py --mode transparent --set showhost=true --web-port 9090 --web-iface 0.0.0.0 &>> /var/log/mitmweb.log EOF'
					
					
					
					
copy console
sudo bash -c 'cat > /etc/systemd/system/mitmweb.service <<EOF [Unit] Description=mitmweb service # After=network.target BindsTo=hostapd.service After=hostapd.service [Service] Type=simple User=root ExecStart=/home/pi/start_mitmweb.sh Restart=on-failure RestartSec=5 ################## # iptables laden # ################## ExecStartPost=/sbin/iptables -A FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT ExecStartPost=/sbin/iptables -A FORWARD -i ap0 -o eth0 -j ACCEPT ExecStartPost=/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ExecStartPost=/sbin/iptables -t nat -A PREROUTING -i ap0 -p tcp --dport 443 -j REDIRECT --to-port 8080 ExecStartPost=/sbin/iptables -t nat -A PREROUTING -i ap0 -p tcp --dport 80 -j REDIRECT --to-port 8080 ExecStopPost=-/sbin/iptables -D FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT ExecStopPost=-/sbin/iptables -D FORWARD -i ap0 -o eth0 -j ACCEPT ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ExecStopPost=-/sbin/iptables -t nat -D PREROUTING -i ap0 -p tcp --dport 443 -j REDIRECT --to-port 8080 ExecStopPost=-/sbin/iptables -t nat -D PREROUTING -i ap0 -p tcp --dport 80 -j REDIRECT --to-port 8080 [Install] WantedBy=multi-user.target EOF'
copy console
sudo systemctl daemon-reload
copy console
sudo systemctl enable mitmweb.service
copy console
sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 0 <----?
copy console
sudo sysctl -w net.ipv4.ip_forward=1
copy console
sudo bash -c 'cat > /home/pi/clean_iptables.sh <<EOF #!/bin/bash # clean old iptables sudo iptables -F sudo iptables -X sudo iptables -t nat -F sudo iptables -t nat -X sudo iptables -t mangle -F sudo iptables -t mangle -X EOF' sudo /bin/bash /home/pi/clean_iptables.sh
copy console
chmod a+x /home/pi/clean_iptables.sh
copy console
reboot

Um den Proxy nutzen zu können muss ein Zertifikat installiert werden!

gehe zu : mitm.it dann Iphone Einstellungen Allgemein /Info

Console das habe ich gebraucht :

ip a				// IP-Adresse prüfen 
ip r				// Standard-Gatway bzw. die Default-Route
netstat -ta			//Active Internet connections
arp -a				// Dies zeigt die Ethernet-Adressen
netstat -r			// Kernel IP routing table
netstat -antu			// TCP- und UDP-Verbindungen anzeigen
iptables -L			// List 
iptables -nvx -L		// List more
wpa_cli status			// Status  wlan0 

# LOG Löschen
cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

# https://forum-raspberrypi.de/forum/thread/44138-mitmproxy/#post390897

systemd-analyze dump			// Kommandozeilenwerkzeug -> Danke an rpi444 
ps aux | grep -ie mitmweb		// wo ist der Proxy ?
ps ax | grep mitm			// welche PID?
kill PID			// AUS 
netstat -lnp | grep ':8080 '	// Listen?
# iptables -L INPUT
# iptables -L FORWARD
# iptables -L OUTPUT
# iptables -L

// NAT rules
# iptables -t nat -L

Other table options:
# iptables -t filter -L
# iptables -t raw -L
# iptables -t security -L
# iptables -t mangle -L
# iptables -t nat -L

Pass the --line-numbers option:
# iptables -t nat -L --line-numbers -n



root@raspberrypi:~# lsof -i TCP:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     374 root    3u  IPv4  12759      0t0  TCP *:ssh (LISTEN)
sshd     374 root    4u  IPv6  12761      0t0  TCP *:ssh (LISTEN)
sshd    1570 root    3u  IPv4  21012      0t0  TCP 192.168.4.1:ssh->DESKTOP-880SJGG.pi-dhcp:40891 (ESTABLISHED)
sshd    1595   pi    3u  IPv4  21012      0t0  TCP 192.168.4.1:ssh->DESKTOP-880SJGG.pi-dhcp:40891 (ESTABLISHED)
sshd    1632 root    3u  IPv4  21193      0t0  TCP 192.168.4.1:ssh->DESKTOP-880SJGG.pi-dhcp:41151 (ESTABLISHED)
sshd    1642   pi    3u  IPv4  21193      0t0  TCP 192.168.4.1:ssh->DESKTOP-880SJGG.pi-dhcp:41151 (ESTABLISHED)
sshd    1819 root    3u  IPv4  25209      0t0  TCP 192.168.4.1:ssh->DESKTOP-880SJGG.pi-dhcp:41566 (ESTABLISHED)
sshd    1829   pi    3u  IPv4  25209      0t0  TCP 192.168.4.1:ssh->DESKTOP-880SJGG.pi-dhcp:41566 (ESTABLISHED)



root@raspberrypi:~# networkctl status -a
● 1: lo
       Link File: n/a
    Network File: n/a
            Type: loopback
           State: carrier (unmanaged)
         Address: 127.0.0.1
                  ::1

● 2: eth0
       Link File: n/a
    Network File: /etc/systemd/network/01-eth.network
            Type: ether
           State: routable (configured)
            Path: platform-fd580000.genet
          Driver: bcmgenet
      HW Address: dc:a6:32:18:e9:69
         Address: 192.168.0.65
                  fe80::dea6:32ff:fe18:e969
         Gateway: 192.168.0.1 (AVM Audiovisuelles Marketing und Computersysteme GmbH)
             DNS: 192.168.0.1
                  8.8.8.8
             NTP: 192.168.0.1

● 3: wlan0
       Link File: n/a
    Network File: /etc/systemd/network/08-wlan0.network
            Type: wlan
           State: routable (configured)
            Path: platform-fe300000.mmcnr
          Driver: brcmfmac
      HW Address: dc:a6:32:18:e9:6a
         Address: 192.168.0.66
                  fe80::dea6:32ff:fe18:e96a
         Gateway: 192.168.0.1 (AVM Audiovisuelles Marketing und Computersysteme GmbH)
             DNS: 192.168.0.1
                  8.8.8.8
             NTP: 192.168.0.1

● 4: ap0
       Link File: n/a
    Network File: /etc/systemd/network/12-ap0.network
            Type: wlan
           State: routable (configured)
            Path: platform-fe300000.mmcnr
          Driver: brcmfmac
      HW Address: dc:a6:32:18:e9:6a
         Address: 192.168.4.1
                  192.168.4.2
                  192.168.4.3
                  fe80::dea6:32ff:fe18:e96a
















Proxy von der Console bedienen / Debuggen

copy console
root@raspberrypi:/var/log# ps ax | grep mitm 333 ? Ss 0:00 /bin/bash /home/pi/start_mitmweb.sh 338 ? Sl 1:18 /usr/bin/python3 /usr/local/bin/mitmweb --mode transparent --web-port 9090 --web-iface 0.0.0.0 1367 pts/0 S+ 0:00 grep mitm root@raspberrypi:/var/log# kill 333 root@raspberrypi:/var/log# ps ax | grep mitm 1371 pts/0 S+ 0:00 grep mitm
ok es läuft kein WEB Prozess mehr ;o) dann kann es losgehen
Hier die Regeln:
copy console
sudo /bin/bash /home/pi/clean_iptables.sh sudo iptables -A FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i ap0 -o eth0 -j ACCEPT sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -t nat -A PREROUTING -i ap0 -p tcp --dport 443 -j REDIRECT --to-port 8080 sudo iptables -t nat -A PREROUTING -i ap0 -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo mitmproxy -s /home/pi/tls_passthrough.py --mode transparent --set showhost=true --console-layout horizontal
usage: mitmproxy [options]

optional arguments:
  -h, --help            show this help message and exit
  --version             show version number and exit
  --options             Show all options and their default values
  --commands            Show all commands and their signatures
  --confdir PATH        Path to the mitmproxy config directory
  --set option[=value]  Set an option. When the value is omitted, booleans are
                        set to true, strings and integers are set to None (if
                        permitted), and sequences are emptied. Boolean values
                        can be true, false or toggle.
  -q, --quiet           Quiet.
  -v, --verbose         Increase log verbosity.
  --mode MODE, -m MODE  Mode can be "regular", "transparent", "socks5",
                        "reverse:SPEC", or "upstream:SPEC". For reverse and
                        upstream proxy modes, SPEC is host specification in
                        the form of "http[s]://host[:port]".
  --no-anticache
  --anticache           Strip out request headers that might cause the server
                        to return 304-not-modified.
  --no-showhost
  --showhost            Use the Host header to construct URLs for display.
  --rfile PATH, -r PATH
                        Read flows from file.
  --scripts SCRIPT, -s SCRIPT
                        Execute a script. May be passed multiple times.
  --stickycookie FILTER
                        Set sticky cookie filter. Matched against requests.
  --stickyauth FILTER   Set sticky auth filter. Matched against requests.
  --save-stream-file PATH, -w PATH
                        Stream flows to file as they arrive. Prefix path with
                        + to append.
  --no-anticomp
  --anticomp            Try to convince servers to send us un-compressed data.
  --console-layout {horizontal,single,vertical}
                        Console layout.
  --no-console-layout-headers
  --console-layout-headers
                        Show layout component headers

Proxy Options:
  --listen-host HOST    Address to bind proxy to.
  --listen-port PORT, -p PORT
                        Proxy service port.
  --no-server, -n
  --server              Start a proxy server. Enabled by default.
  --ignore-hosts HOST   Ignore host and forward all traffic without processing
                        it. In transparent mode, it is recommended to use an
                        IP address (range), not the hostname. In regular mode,
                        only SSL traffic is ignored and the hostname should be
                        used. The supplied value is interpreted as a regular
                        expression and matched on the ip or the hostname. May
                        be passed multiple times.
  --tcp-hosts HOST      Generic TCP SSL proxy mode for all hosts that match
                        the pattern. Similar to --ignore, but SSL connections
                        are intercepted. The communication contents are
                        printed to the log in verbose mode. May be passed
                        multiple times.
  --upstream-auth USER:PASS
                        Add HTTP Basic authentication to upstream proxy and
                        reverse proxy requests. Format: username:password.
  --proxyauth SPEC      Require proxy authentication. Format: "username:pass",
                        "any" to accept any user/pass combination, "@path" to
                        use an Apache htpasswd file, or
                        "ldap[s]:url_server_ldap:dn_auth:password:dn_subtree"
                        for LDAP authentication.
  --no-rawtcp
  --rawtcp              Enable/disable experimental raw TCP support. TCP
                        connections starting with non-ascii bytes are treated
                        as if they would match tcp_hosts. The heuristic is
                        very rough, use with caution. Disabled by default.
  --no-http2
  --http2               Enable/disable HTTP/2 support. HTTP/2 support is
                        enabled by default.

SSL:
  --certs SPEC          SSL certificates of the form "[domain=]path". The
                        domain may include a wildcard, and is equal to "*" if
                        not specified. The file at path is a certificate in
                        PEM format. If a private key is included in the PEM,
                        it is used, else the default key in the conf dir is
                        used. The PEM file should contain the full certificate
                        chain, with the leaf certificate as the first entry.
                        May be passed multiple times.
  --no-ssl-insecure
  --ssl-insecure, -k    Do not verify upstream server SSL/TLS certificates.

Client Replay:
  --client-replay PATH, -C PATH
                        Replay client requests from a saved file. May be
                        passed multiple times.

Server Replay:
  --server-replay PATH, -S PATH
                        Replay server responses from a saved file. May be
                        passed multiple times.
  --no-server-replay-kill-extra
  --server-replay-kill-extra
                        Kill extra requests during replay.
  --no-server-replay-nopop
  --server-replay-nopop
                        Don't remove flows from server replay state after use.
                        This makes it possible to replay same response
                        multiple times.

Replacements:
  --replacements PATTERN, -R PATTERN
                        Replacement patterns of the form
                        "/pattern/regex/replacement", where the separator can
                        be any character. May be passed multiple times.

Set Headers:
  --setheaders PATTERN, -H PATTERN
                        Header set pattern of the form
                        "/pattern/header/value", where the separator can be
                        any character. May be passed multiple times.

Filters:
  See help in mitmproxy for filter expression syntax.

  --intercept FILTER    Intercept filter expression.
  --view-filter FILTER  Limit the view to matching flows.
copy console
sudo poweroff
Abbild sichern ! ;o)

Step 4.) Pi Webserver Apache / Php / Mysql

  • Einrichtung Apache Webserver, PHP 7 und die Datenbanksoftware MariaDB
  • Einrichtung PHPmyAdmin

Quellen

copy console
sudo apt-get update && sudo apt-get upgrade sudo apt-get -y install mariadb-server mariadb-client
copy console
mysql -u root
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set plugin='' where User='root';
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> exit
copy console
sudo apt-get -y install apache2 sudo apt-get -t buster -y install php7.3 php7.3-mysql php7.3-curl php7.3-gd php7.3-zip php7.3-fpm php7.3-cli php7.3-opcache php7.3-json php7.3-mbstring php7.3-xml libapache2-mod-php7.3 sudo a2enmod proxy_fcgi setenvif sudo a2enconf php7.3-fpm sudo systemctl restart apache2
Was macht sudo systemctl enable apache2.service -> Start des Apache beim Hochfahren
copy console
sudo systemctl enable apache2.service
Mal sehen ob phpmyadmin verfügbar ist! [i] Hier ein paar Informationen zum Umgang mit dem Paketmanagement!
Quelle: https://www.debian.org/doc/manuals/debian-reference/ch02.de.html
apt-Syntax aptitude-Syntax apt-get/apt-cache-Syntax Beschreibung
apt update aptitude update apt-get update Aktualisieren der Paket-Metadaten
apt install foo aptitude install foo apt-get install foo Installieren der Installationskandidat-Version von "foo" inklusive seiner Abhängigkeiten
apt upgrade aptitude safe-upgrade apt-get upgrade Installieren der Installationskandidat-Version aller installierten Pakete, ohne irgendwelche anderen Pakete zu entfernen
apt full-upgrade aptitude full-upgrade apt-get dist-upgrade Installieren der Installationskandidat-Version aller installierten Pakete und Entfernen anderer Pakete, falls nötig
apt remove foo aptitude remove foo apt-get remove foo Entfernen des Pakets "foo" bei gleichzeitiger Erhaltung seiner Konfigurationsdateien
apt autoremove Nicht verfügbar apt-get autoremove Entfernen aller automatisch installierten, nicht mehr benötigten Pakete
apt purge foo aptitude purge foo apt-get purge foo Vollständiges Entfernen des Pakets "foo" und Löschung seiner Konfigurationsdateien
apt clean aptitude clean apt-get clean Vollständiges Leeren des lokalen Depots heruntergeladener Paketdateien
apt autoclean aptitude autoclean apt-get autoclean Leeren des lokalen Depots heruntergeladener Paketdateien für veraltete Pakete
apt show foo aptitude show foo apt-cache show foo Anzeigen von detaillierten Informationen über das Paket "foo"
apt search <regex> aptitude search <regex> apt-cache search <regex> Suchen nach Paketen, auf die der reguläre Ausdruck <regex> zutrifft
Nicht verfügbar aptitude why <regex> Nicht verfügbar Erklären, warum die Pakete, auf die der reguläre Ausdruck <regex> zutrifft, installiert werden sollen
Nicht verfügbar aptitude why-not <regex> Nicht verfügbar Erklären, warum die Pakete, auf die der reguläre Ausdruck <regex> zutrifft, nicht installiert werden sollen
Nicht verfügbar aptitude search '~i!~M' apt-mark showmanual Händisch installierte Paket auflisten
copy console
apt search phpmyadmin
ok ist da ;o)
root@raspberrypi:~# apt search phpmyadmin
Sorting... Done
Full Text Search... Done
adminer/stable 4.7.1-1 all
  Web-based database administration tool

phpliteadmin/stable 1.9.7.1-2 all
  web-based SQLite database admin tool

phpliteadmin-themes/stable 1.9.7.1-2 all
  web-based SQLite database admin tool - themes

phpmyadmin/stable 4:4.6.6-5 all
  MySQL web administration tool
copy console
apt show phpmyadmin
dann sehen wir uns das mal an
root@raspberrypi:~# apt show phpmyadmin
Package: phpmyadmin
Version: 4:4.6.6-5
Priority: optional
Section: web
Maintainer: Thijs Kinkhorst 
Installed-Size: 25.0 MB
Depends: php, php-cli, php-mysql | php-mysqli, php-json, php-mbstring, php-xml, perl, debconf (>= 0.5) | debconf-2.0, libjs-sphinxdoc (>= 1.0), dbconfig-mysql | dbconfig-no-thanks | dbconfig-common (<< 2.0.0), php-php-gettext | php-gettext (<= 1:7.0), php-phpseclib (>= 2.0), ucf (>= 0.28)
Recommends: apache2 | lighttpd | httpd, php-curl, php-gd, php-bz2, php-zip, php-tcpdf
Suggests: default-mysql-server | virtual-mysql-server, www-browser
Homepage: https://www.phpmyadmin.net/
Download-Size: 3,913 kB
APT-Sources: http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
Description: MySQL web administration tool
 This package allows administering of MySQL or MariaDB with a web interface.
 .
 It allows administrators to:
  - browse through databases and tables;
  - create, copy, rename, alter and drop databases;
  - create, copy, rename, alter and drop tables;
  - perform table maintenance;
  - add, edit and drop fields;
  - execute any SQL-statement, even multiple queries;
  - create, alter and drop indexes;
  - load text files into tables;
  - create and read dumps of tables or databases;
  - export data to SQL, CSV, XML, Word, Excel, PDF and LaTeX formats;
  - administer multiple servers;
  - manage MySQL users and privileges;
  - check server settings and runtime information with configuration hints;
  - check referential integrity in MyISAM tables;
  - create complex queries using Query-by-example (QBE), automatically
    connecting required tables;
  - create PDF graphics of database layout;
  - search globally in a database or a subset of it;
  - transform stored data into any format using a set of predefined
    functions, such as displaying BLOB-data as image or download-link;
  - manage InnoDB tables and foreign keys;
 and is fully internationalized and localized in dozens of languages.
apt-get install phpmyadmin
copy console
apt-get install phpmyadmin
hmmmm ... installiert mir php7.1 und ein Fehler gibt es noch gratis dazu
also phpmyqdmin verlangt nach leeres Root Passwort -> ich hatte bevor ich phpmyadmin instaliert habe sudo mysql_secure_installation ausgeführt!
copy console
mysql -u root -p use mysql; update user set password=PASSWORD('') where user='root'; flush privileges; quit
copy console
sudo mysql_secure_installation
Root Passwort merken!
Set root password? [Y/n] y
New password: networkmysql
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
copy console
reboot
Status prüfen
root@raspberrypi:~# systemctl status mysql.service
● mariadb.service - MariaDB 10.3.15 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-08-30 12:33:42 BST; 4min 59s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 355 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
  Process: 367 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 378 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   &&
  Process: 491 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
  Process: 494 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
 Main PID: 443 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 32 (limit: 4915)
   Memory: 78.5M
   CGroup: /system.slice/mariadb.service
           └─443 /usr/sbin/mysqld
prüfe-> http://192.168.0.44/phpmyadmin/
update 20.11.2019 - enable HEADERS modules
<filesmatch "^(impressum|datenschutz)\.php$">
header set x-robots-tag "noindex, nofollow"
</filesmatch>
internal-server-error-htaccess
copy console
cd /etc/apache2/mods-available sudo a2enmod headers /etc/init.d/apache2 restart
copy console
sudo poweroff
Abbild sichern ! ;o)

Step 5.) DNS Server einrichten

  • DNS - dnsmasq :: Der Pi spricht über Port 53

Quellen

copy console
apt-get update && sudo apt-get upgrade apt-get install nmap apt-get install dnsutils
Der Pi soll diese Domain bzw. IP als Namenserver auf Port 53 auflösen können!
192.168.4.10 ausgedacht-domain.pi
mcedit /etc/hosts
root@raspberrypi:~# cat  /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi
192.168.4.10    ausgedacht-domain.pi
ip address add 192.168.4.10/28 dev ap0
copy console
ip address add 192.168.4.10/28 dev ap0
systemd-resolve lauscht schon auf port 53 geht nicht wenn wir auf diesen Port dnsmasq legen wollen !
root@raspberrypi:~# sudo netstat -tulpn | grep 53
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      265/systemd-resolve
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      265/systemd-resolve
tcp6       0      0 :::5355                 :::*                    LISTEN      265/systemd-resolve
udp        0      0 127.0.0.53:53           0.0.0.0:*                           265/systemd-resolve
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           288/avahi-daemon: r
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           265/systemd-resolve
udp6       0      0 :::53273                :::*                                288/avahi-daemon: r
udp6       0      0 :::5353                 :::*                                288/avahi-daemon: r
udp6       0      0 :::5355                 :::*                                265/systemd-resolve
copy console
mcedit /etc/systemd/resolved.conf
root@raspberrypi:~# cat /etc/systemd/resolved.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details

[Resolve]
#####################
###### dnsmasq ######
DNS=127.0.0.1
DNSStubListener=no
#####################
#####################

#FallbackDNS=
#Domains=
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=allow-downgrade
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes
nameserver 127.0.0.53 passt!
root@raspberrypi:~# sudo systemctl status  systemd-resolved
● systemd-resolved.service - Network Name Resolution
   Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/systemd-resolved.service.d
           └─resolvconf.conf
   Active: active (running) since Mon 2019-09-02 11:26:16 BST; 11s ago
     Docs: man:systemd-resolved.service(8)
           https://www.freedesktop.org/wiki/Software/systemd/resolved
           https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
           https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
  Process: 1726 ExecStartPost=/bin/sh -c [ ! -e /run/resolvconf/enable-updates ] || echo "nameserver 127.0.0.53" | /sbin/resolvconf -a systemd-resolved (code=
 Main PID: 1724 (systemd-resolve)
   Status: "Processing requests..."
    Tasks: 1 (limit: 4915)
   Memory: 1.2M
   CGroup: /system.slice/systemd-resolved.service
           └─1724 /lib/systemd/systemd-resolved

Sep 02 11:26:16 raspberrypi systemd[1]: Starting Network Name Resolution...
Sep 02 11:26:16 raspberrypi systemd-resolved[1724]: Positive Trust Anchors:
Sep 02 11:26:16 raspberrypi systemd-resolved[1724]: . IN DS 19036 8 2 49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5
Sep 02 11:26:16 raspberrypi systemd-resolved[1724]: . IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d
Sep 02 11:26:16 raspberrypi systemd-resolved[1724]: Negative trust anchors: 10.in-addr.arpa 16.172.in-addr.arpa 17.172.in-addr.arpa 18.172.in-addr.arpa 19.172
Sep 02 11:26:16 raspberrypi systemd-resolved[1724]: Using system hostname 'raspberrypi'.
Sep 02 11:26:16 raspberrypi systemd[1]: Started Network Name Resolution.
lines 2-24/24 (END)

reboot
root@raspberrypi:~# sudo netstat -tulpn | grep 53
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      266/systemd-resolve
tcp6       0      0 :::5355                 :::*                    LISTEN      266/systemd-resolve
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           276/avahi-daemon: r
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           266/systemd-resolve
udp6       0      0 :::5353                 :::*                                276/avahi-daemon: r
udp6       0      0 :::5355                 :::*                                266/systemd-resolve
service avahi-daemon aus!
copy console
sudo service avahi-daemon stop sudo systemctl mask avahi-daemon.service
dnsmasq install
copy console
sudo apt-get install dnsmasq
root@raspberrypi:~# sudo systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-09-02 11:37:35 BST; 55s ago
 Main PID: 803 (dnsmasq)
    Tasks: 1 (limit: 4915)
   Memory: 1.3M
   CGroup: /system.slice/dnsmasq.service
           └─803 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local

Sep 02 11:37:35 raspberrypi systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server...
Sep 02 11:37:35 raspberrypi dnsmasq[795]: dnsmasq: syntax check OK.
Sep 02 11:37:35 raspberrypi dnsmasq[803]: started, version 2.80 cachesize 150
Sep 02 11:37:35 raspberrypi dnsmasq[803]: DNS service limited to local subnets
Sep 02 11:37:35 raspberrypi dnsmasq[803]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect
Sep 02 11:37:35 raspberrypi dnsmasq[803]: read /etc/hosts - 6 addresses
Sep 02 11:37:35 raspberrypi systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
lines 1-16/16 (END)
root@raspberrypi:~# sudo netstat -tulpn | grep 53
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      266/systemd-resolve
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      803/dnsmasq
tcp6       0      0 :::5355                 :::*                    LISTEN      266/systemd-resolve
tcp6       0      0 :::53                   :::*                    LISTEN      803/dnsmasq
udp        0      0 0.0.0.0:53              0.0.0.0:*                           803/dnsmasq
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           266/systemd-resolve
udp6       0      0 :::53                   :::*                                803/dnsmasq
udp6       0      0 :::5355                 :::*                                266/systemd-resolve
copy console
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.bak sudo mcedit /etc/dnsmasq.conf
Hier ein paar Bemerkungen zum Verständnis!
In der Datei /etc/systemd/network/12-ap0.network haben wir folgendes zu stehen:
[Match]
Name=ap0
[Network]
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
# If you want to connect to your own DNS server, set its ip address here
DNS=192.168.0.1 8.8.8.8
mit diesen Einstellungen erfolgt die Zuweisung der Netzwerkkonfiguration an Clients durch den vorhandenen DHCPServer. Da wir jedoch mit Hilfe von Dnsmasq im IP Bereich 192.168.4.1/24 einen "eigenen" DNS und DHCP Service aufbauen wollen müssen wir hier die Einstellung von systemd auf DHCPServer=no ändern. Die IP Einstellungen von ap0 (unsere virtuelle Wlan Schnittstelle) können wir so belassen. Für die Weiterleitung hatten wir Iptables eingerichtet.
sudo iptables -A FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i ap0 -o eth0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Quellen

root@raspberrypi:~# ip a
......
4: ap0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:18:e9:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.1/24 brd 192.168.4.255 scope global ap0
       valid_lft forever preferred_lft forever
    inet6 fe80::dea6:32ff:fe18:e96a/64 scope link
       valid_lft forever preferred_lft forever
Die Einstellung "dhcp-host=dc:a6:32:18:e9:6a,192.168.4.1" bindet die IP an die MAC! Muss angepasst werden:
# Dnsmasq als DNS-Server für andere Rechner im lokalen Netz
# Möchte man den DNS-Server auch für andere Rechner im lokalen Netz nutzen, dann muss man Dnsmasq dazu bringen,
# dass es auch an der Netzwerkschnittstelle nach DNS-Abfragen lauscht.
# Damit die Clients wissen, wie sie den DNS-Server finden, muss der Rechner, auf dem Dnsmasq läuft,
# dann mit einer statischen Adresse versehen sein.

listen-address=127.0.0.1
listen-address=192.168.4.1

no-resolv

# Google's nameservers, for example
server=8.8.8.8
server=8.8.4.4


# Zwischenspeicher Größe
cache-size=500

# Prüfen ;o)
# nmap -F 192.168.4.1
# sudo lsof -i -P -n | grep LISTEN
# sudo netstat -tulpen | grep dnsmasq


# Only listen to routers' LAN NIC.  Doing so opens up tcp/udp port 53 to
# localhost and udp port 67 to world:
interface=ap0


# Optionally set a domain name
domain=pi-dhcp

# Set default gateway
dhcp-option=3,0.0.0.0

# Set DNS servers to announce
dhcp-option=6,0.0.0.0

# If your dnsmasq server is also doing the routing for your network,
# you can use option 121 to push a static route out.
# x.x.x.x is the destination LAN, yy is the CIDR notation (usually /24), 
# and z.z.z.z is the host which will do the routing.
dhcp-option=121,192.168.4.0/24,192.168.4.1

# Dynamic range of IPs to make available to LAN PC and the lease time. 
# Ideally set the lease time to 5m only at first to test everything works okay before you set long-lasting records.
dhcp-range=192.168.4.50,192.168.4.100,12h

# If you’d like to have dnsmasq assign static IPs to some clients, bind the LAN computers
# NIC MAC addresses:
# ANPASSEN !
dhcp-host=dc:a6:32:18:e9:6a,192.168.4.1
DNS raus (#) und DHCPServer auf no
root@raspberrypi:~# cat  /etc/systemd/network/12-ap0.network
[Match]
Name=ap0
[Network]
Address=192.168.4.1/24
DHCPServer=no
[DHCPServer]
# If you want to connect to your own DNS server, set its ip address here
# DNS=0.0.0.0 192.168.0.1 8.8.8.8
copy console
reboot
nach dem Reboot müssen wir die IP nochmals zuweisen siehe cat /etc/hosts
....
192.168.4.10    ausgedacht-domain.pi
.....
copy console
ip address add 192.168.4.10/28 dev ap0

root@raspberrypi:~# nmap -F 192.168.4.1
Starting Nmap 7.70 ( https://nmap.org ) at 2019-09-03 09:25 BST
Nmap scan report for 192.168.4.1
Host is up (0.000082s latency).
Not shown: 96 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
53/tcp   open  domain
80/tcp   open  http
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 1.96 seconds
root@raspberrypi:~#  cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.1
nameserver 192.168.0.1
nameserver 8.8.8.8
# Too many DNS servers configured, the following entries may be ignored.
nameserver 195.234.128.139
nameserver 195.234.128.140
nameserver 2a02:2457:30c:101::11
nameserver 2a02:2457:30c:101::12
root@raspberrypi:~# dig -x ausgedacht-domain.pi

; <<>> DiG 9.11.5-P4-5.1-Raspbian <<>> -x ausgedacht-domain.pi
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 55919
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;pi.ausgedacht-domain.in-addr.arpa. IN  PTR

;; AUTHORITY SECTION:
in-addr.arpa.           3412    IN      SOA     b.in-addr-servers.arpa. nstld.iana.org. 2019082861 1800 900 604800 3600

;; Query time: 41 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Sep 03 09:30:32 BST 2019
;; MSG SIZE  rcvd: 130

root@raspberrypi:~# dig -t ns ausgedacht-domain.pi

; <<>> DiG 9.11.5-P4-5.1-Raspbian <<>> -t ns ausgedacht-domain.pi
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58226
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;ausgedacht-domain.pi.          IN      NS

;; Query time: 47 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Sep 03 09:30:55 BST 2019
;; MSG SIZE  rcvd: 49

root@raspberrypi:~# ping ausgedacht-domain.pi
PING ausgedacht-domain.pi (192.168.4.10) 56(84) bytes of data.
64 bytes from ausgedacht-domain.pi (192.168.4.10): icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from ausgedacht-domain.pi (192.168.4.10): icmp_seq=2 ttl=64 time=0.098 ms
64 bytes from ausgedacht-domain.pi (192.168.4.10): icmp_seq=3 ttl=64 time=0.091 ms
64 bytes from ausgedacht-domain.pi (192.168.4.10): icmp_seq=4 ttl=64 time=0.097 ms
^C
--- ausgedacht-domain.pi ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 112ms
rtt min/avg/max/mdev = 0.091/0.104/0.132/0.019 ms

# Hier ein paar Sachen die ich brauche aber nicht unbedingt notwendig sind 
nmap		// nmap das Taschenmesser für Netzwerk
nmap -F 192.168.4.1		// mal sehen was offen ist Portscan 
# sudo lsof -i -P -n | grep LISTEN
# sudo netstat -tulpen | grep dnsmasq


sudo systemctl restart systemd-resolved
sudo systemctl status systemd-resolved
sudo systemctl stop systemd-resolved

sudo systemctl restart dnsmasq
sudo systemctl status dnsmasq
sudo systemctl stop dnsmasq

dnsutils		// dig Namensauflösung 
# Um eine Reverse-Lookup-Abfrage durchzuführen, benutzt man die -x Option:
dig -x ausgedacht-domain.pi
#Um den NS-Record anzuzeigen, benutzt man die -t ns Optionen:
dig -t ns ausgedacht-domain.pi
Abbild sichern ! ;o)

Step 5.) Verzeichnisse einrichten

  • Strukturen schaffen

Quellen

  • Einen Root-Server mit WordPress einrichten
    https://it-learner.de/einen-root-server-mit-wordpress-einrichten-und-betreiben-in-10-teilen/
  • Firewall einrichten
    https://www.webhosterwissen.de/know-how/eigener-webserver-nginx/tutorial-nginx-php-mysql-auf-ubuntu-18-04-installieren/
  • bindfs
    https://fullstackdevelopment.de/linux/286/ultimative-loesung-des-problems-der-nutzerrechte-in-var-www-html/
Wir legen einen neuen User für das www an!

Dieser User erhält automatisch über bindfs bzw. /etc/fstab immer die gleichen Rechte wie www-data, somit bleibt das Webverzeichnis immer "Rechtegleich" egal ob php was schreibt oder wir was rumschreiben ;o) das Verzeichnis befindet sich in /home/web/www ... Das Home-Verzeichnis zeigt auf dem Webserver...

adduser: web 
passw: web 
copy console
sudo chown -R www-data:www-data /var/www/ sudo find /var/www -type d -exec chmod g+s {} +
copy console
sudo su adduser web apt-get -y install bindfs mkdir -p /home/web/www chown web:web /home/web/www chmod 755 /home/web/www mcedit /etc/fstab
ADD line bindfs#/var/www /home/web/www fuse force-user=web,force-group=web,create-for-user=www-data,create-for-group=www-data,create-with-perms=0755,chgrp-ignore,chown-ignore,chmod-ignore 0 0
root@raspberrypi:~# cat /etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=b0af69a2-01  /boot           vfat    defaults          0       2
PARTUUID=b0af69a2-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
###### web user ######
bindfs#/var/www /home/web/www fuse force-user=web,force-group=web,create-for-user=www-data,create-for-group=www-data,create-with-perms=0755,chgrp-ignore,chown-ignore,chmod-ignore 0 0
mount /home/web/www
copy console
mount /home/web/www mcedit /etc/rc.local
root@raspberrypi:~# cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s
" "$_IP"
fi
####### web #####
 mount /home/web/www &
exit 0
IMPORTANT : Now, to write in /var/www as www-data user, you must use the web user and access /var/www threw /home/web/www
copy console
echo "<?php phpinfo();" > /home/web/www/html/phpinfo.php
prüfe-> http://192.168.4.1/phpinfo.php
Überlegung -> beste Struktur zum Entwickeln von Websites

Seiten werden local auf dem PI entwickelt. Wir verfügen über einen DNS-Server der es uns ermöglicht DNS Auflösungen zu manipulieren. Bevor der DNS Server von Google abgefragt wird läuft die DNS Anfrage über unsere Zuweisungen. Somit sollte es möglich eine einfache Regel zu formulieren.

 
Alles was ein www. im Domainnamen hat ist online!
Alles was ohne aufgelöst wird befindet sich local auf dem Pi!

Cool ;o)! - über entsprechende RewriteRule kann man das sauber trennen und selbst die *.js bekommen davon nichts mit... also wenn ich in der *.js einen link auf www.domain.de setze formuliere ich eine RewriteRule die nach domain.de (local) auflöst und brauche im gesamten Quelltext nichts ändern! Somit kann ich so programmieren wie es eigentlich für das www gedacht ist.
Virtuell Hosts können per Namen, Ip bzw. Port angelegt werden. Meine Struktur ist beim Entwickeln immer die gleiche Beispiel diese Seite:
Im Verzeichnis "src" findet das Coden statt ich im Verzeichnis "dist" liegt der optimierte Quelltext zum hochladen. Bilder, CSS, JS werden per Node Js & Co. optimiert und zur Istzeit von Src nach dist "verlagert". Da die Struktur gleichbleibend ist sollte das Apache Modul vhost_alias greifen.

root@raspberrypi:~# apachectl -M
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php7_module (shared)
 proxy_module (shared)
 proxy_fcgi_module (shared)
 reqtimeout_module (shared)
 setenvif_module (shared)
 status_module (shared)

gibt es nicht ;o( muss ich nachsehen wie ich das einrichte

copy console
sudo a2enmod vhost_alias systemctl restart apache2

ok jetzt brauchen wir ein paar Test Domains

copy console
mkdir -p /home/web/www/html/{domain1.de,domain2.de,domain3.com,domain4.net}/{src,dist}
root@raspberrypi:/home/web/www/html# ls -laR
.:
total 40
drwxr-sr-x 6 web web  4096 Sep  3 12:31 .
drwxr-sr-x 3 web web  4096 Sep  3 12:28 ..
drwxr-sr-x 4 web web  4096 Sep  3 12:37 domain1.de
drwxr-sr-x 4 web web  4096 Sep  3 12:37 domain2.de
drwxr-sr-x 4 web web  4096 Sep  3 12:37 domain3.com
drwxr-sr-x 4 web web  4096 Sep  3 12:37 domain4.net
-rw-r--r-- 1 web web 10701 Aug 30 11:02 index.html
-rwxr-xr-x 1 web web    17 Sep  3 11:07 phpinfo.php

./domain1.de:
total 16
drwxr-sr-x 4 web web 4096 Sep  3 12:37 .
drwxr-sr-x 6 web web 4096 Sep  3 12:31 ..
drwxr-sr-x 2 web web 4096 Sep  3 12:37 dist
drwxr-sr-x 2 web web 4096 Sep  3 12:37 src

./domain1.de/dist:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain1.de/src:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain2.de:
total 16
drwxr-sr-x 4 web web 4096 Sep  3 12:37 .
drwxr-sr-x 6 web web 4096 Sep  3 12:31 ..
drwxr-sr-x 2 web web 4096 Sep  3 12:37 dist
drwxr-sr-x 2 web web 4096 Sep  3 12:37 src

./domain2.de/dist:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain2.de/src:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain3.com:
total 16
drwxr-sr-x 4 web web 4096 Sep  3 12:37 .
drwxr-sr-x 6 web web 4096 Sep  3 12:31 ..
drwxr-sr-x 2 web web 4096 Sep  3 12:37 dist
drwxr-sr-x 2 web web 4096 Sep  3 12:37 src

./domain3.com/dist:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain3.com/src:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain4.net:
total 16
drwxr-sr-x 4 web web 4096 Sep  3 12:37 .
drwxr-sr-x 6 web web 4096 Sep  3 12:31 ..
drwxr-sr-x 2 web web 4096 Sep  3 12:37 dist
drwxr-sr-x 2 web web 4096 Sep  3 12:37 src

./domain4.net/dist:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..

./domain4.net/src:
total 8
drwxr-sr-x 2 web web 4096 Sep  3 12:37 .
drwxr-sr-x 4 web web 4096 Sep  3 12:37 ..
root@raspberrypi:~#  cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi

###########################
###### test vhost #########
192.168.4.2 domain1.de domain1.de
192.168.4.3 domain2.de domain2.de
192.168.4.4 domain3.com domain3.com
192.168.4.5 domain4.net domain4.net

Jetzt bekommt jede Domain noch eine IP zugewiesen
copy console
ip address add 192.168.4.2/28 dev ap0 ip address add 192.168.4.3/28 dev ap0 ip address add 192.168.4.4/28 dev ap0 ip address add 192.168.4.5/28 dev ap0
Dann machen wir einen Scan und prüfen ob sich die localen Domains auflösen lassen ...
Noch ein Test ist ohne www local ?
root@raspberrypi:~# ping www.domain2.de
ping: www.domain2.de: Temporary failure in name resolution
root@raspberrypi:~# ping www.domain1.de
PING www.domain1.de (62.116.130.8) 56(84) bytes of data.
64 bytes from redirect.domain-robot.org (62.116.130.8): icmp_seq=1 ttl=55 time=38.8 ms
64 bytes from redirect.domain-robot.org (62.116.130.8): icmp_seq=2 ttl=55 time=38.5 ms
64 bytes from redirect.domain-robot.org (62.116.130.8): icmp_seq=3 ttl=55 time=35.1 ms
64 bytes from redirect.domain-robot.org (62.116.130.8): icmp_seq=4 ttl=55 time=36.4 ms
^C
--- www.domain1.de ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 35.050/37.189/38.802/1.550 ms
root@raspberrypi:~# ping domain1.de
PING domain1.de (192.168.4.2) 56(84) bytes of data.
64 bytes from domain1.de (192.168.4.2): icmp_seq=1 ttl=64 time=0.133 ms
64 bytes from domain1.de (192.168.4.2): icmp_seq=2 ttl=64 time=0.099 ms
64 bytes from domain1.de (192.168.4.2): icmp_seq=3 ttl=64 time=0.095 ms
^C
--- domain1.de ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 51ms
rtt min/avg/max/mdev = 0.095/0.109/0.133/0.017 ms
Passt ;o) soweit alles ... Jetzt wird der virtuel Host eingerichtet -> Nein wird er noch nicht ... Es wird überlegt was ich will und was meine Entwicklungsoberfläche können muss.
Überlegung -> beste Struktur zum Administrieren

Seiten werden local auf dem PI entwickelt. Der Pi steht oder liegt irgendwo herrum und es bildet sich eine Staubschicht auf seiner Oberfläche... Das Arbeiten und Einrichten neuer Seiten sollte so einfach wie Möglich sein. Bald läuft Samba hier auf dem PI und die Console kann aus bleiben.
Ok... die Config des Apache muss ins Webverzeichnis. Htacces Regeln schlucken mit jeden Aufruf Resourcen die auch im "real live" fehlen. Hm, der Pi ist mit seiner Hardware ein Zwerg im Vergleich zum echten Webserver und das ist auch gut so. Was hier entwickelt wird und mit entsprechenden Stresstests nicht aussteigt läuft draußen 10 bis ... (werde ich testen) mal so schnell. Wir werden "schnelle Seiten" bauen welche zur Ist Zeit nicht benötigten Speicher RAM freigeben. Wir schleppen nicht ein Gerüst von Variablen (Ramfresser) bis zur Auslieferung der Html Seite rum. Cool ;o) Google wird sein Pagespeed Tool neu skalieren müssen ... bei 100 ist ja bekanntlich Schluss. Das war ein kleiner Ausblick. Festzuhalten ist:

 
Alles was mit Apache Einstellungen oder sonstige Einstellungen (SSl, Zugangsdaten, Dokus) muss ins Webverzeichnis

ok dann gehts los
copy console
mkdir -p /home/web/www/html/{domain1.de,domain2.de,domain3.com,domain4.net}/{src,dist,zugang,ssl,apache,doku}
Apache Ports
 
root@raspberrypi:~# cat  /etc/apache2/ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>
root@raspberrypi:~# sudo netstat -tulpn | grep apache
tcp6       0      0 :::80                   :::*                    LISTEN      463/apache2
Hm, der Apache lauscht auf Port 80 unter tcp6 wo ist tcp 80 und SSL ist auch noch nicht in Betrieb?
schalten wir ersteinmal SSL an ..
copy console
a2enmod ssl systemctl restart apache2
schon besser Port 443 und 80 lauschen
root@raspberrypi:~# sudo netstat -tulpn | grep apache
tcp6       0      0 :::443                  :::*                    LISTEN      1195/apache2
tcp6       0      0 :::80                   :::*                    LISTEN      1195/apache2
Kann ja doch Tcp? egal dann funktioniert das eben halt mal so mit tcp und tcp6
warum das so ist keine Ahnung muss ich mal nachlesen
root@raspberrypi:~# wget http://127.0.0.1/ -O /dev/null
--2019-09-04 08:20:09--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10701 (10K) [text/html]
Saving to: ‘/dev/null’

/dev/null                    100%[============================================>]  10.45K  --.-KB/s    in 0s

2019-09-04 08:20:09 (73.4 MB/s) - ‘/dev/null’ saved [10701/10701]

root@raspberrypi:~# wget http://[::1]/ -O /dev/null
--2019-09-04 08:20:41--  http://[::1]/
Connecting to [::1]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10701 (10K) [text/html]
Saving to: ‘/dev/null’

/dev/null                    100%[============================================>]  10.45K  --.-KB/s    in 0s

2019-09-04 08:20:41 (63.3 MB/s) - ‘/dev/null’ saved [10701/10701]

Quellen

IncludeOptional-Direktive
Beschreibung:		Includes other configuration files from within the server configuration files
Syntax:			IncludeOptional file-path|directory-path|wildcard
Kontext:		Serverkonfiguration, Virtual Host, Verzeichnis
Status:			Core
Modul:			core
Kompatibilität:	Available in 2.3.6 and later. Not existent file paths without wildcards do not cause SyntaxError after 2.4.30
Ok, wir können also eigene "Virtual Host Datei" includieren und das ganze mit auch mit Wildcard
copy console
mcedit /etc/apache2/conf-available/webpi-virtuell-host.conf
Globale Virtual Host Datei lauscht auf Port 80
Die /etc/apache2/conf-available/webpi-virtuell-host.conf greift global 
sobald wir eine neue Domain im Verzeichnis:
/home/web/www/html/ 
anlegen! 
To-Do: "systemctl reload apache2" & "apachectl configtest" muss noch ein kleines PHP / ExE Script geschrieben werden ...

Was macht UseCanonicalName ?

UseCanonicalName On | Off | DNS
On - Der Server nimmt den Name aus der Direktive ServerName (default)
Off - Der ServerName wird aus den gesendeten Informationen des Clients ermittelt, sendet dieser keine ausreichenden Informationen wird auf den Inhalt von ServerName zurückgegriffen
DNS - Bei DNS startet der Server einen "Reverse DNS Lookup" der IP-Adresse um den Domainname herrauszufinden.

root@raspberrypi:~# cat /etc/apache2/conf-available/webpi-virtuell-host.conf

###########################
## Defaults Hosts - V.01 ##
###########################

UseCanonicalName Off

####################################################
##              UseCanonicalName Off              ##
## ServerName wird aus Clients ermittelt          ##
####################################################

<VirtualHost _default_:80>
####################################################
##           _default_:80 =                       ##
## lausche an alle IPs auf Port 80                ##
####################################################

    VirtualDocumentRoot /home/web/www/html/%0/dist/
	
####################################################
###            Path aus alias_module             ###
### %0 = Gesamter Host-Header = domain1.de       ###
####################################################
    
	ServerName %0
	
####################################################
## schicke Logs geht bestimmt noch besser        ###
####################################################

	LogFormat "%V (Intranet host: %h) %{X-Forwarded-For}i %l %u %t \"%r\" %s %b" vcommon
     CustomLog /var/log/apache2/access.log vcommon

    <Directory "/home/web/www/html/*/dist">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
########################################
## überschreiben dieser conf erlauben ##
########################################
          Require all granted
    </Directory>
</VirtualHost>

###########################################
### hier werden unsere *.conf includiert ##
###########################################

IncludeOptional /home/web/www/html/*/apache/*.conf
copy console
a2enconf webpi-virtuell-host.conf systemctl reload apache2 apachectl configtest
Verzeichnis -> /etc/apache2/conf-available
sudo a2enconf NAME_DER_DATEI.conf # Aktivieren der Konfiguration
sudo a2disconf NAME_DER_DATEI.conf # Deaktivierung 
root@raspberrypi:~# apachectl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
erweckt den Anschein zu funktionieren .... weiter gehts ...

ok, jetzt noch den Fehler raus using 127.0.1.1. Set the 'ServerName'
copy console
mcedit /etc/apache2/conf-available/servername.conf
root@raspberrypi:~# cat  /etc/apache2/conf-available/servername.conf
ServerName localhost
copy console
echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.conf sudo a2enconf servername sudo service apache2 reload
root@raspberrypi:~# apachectl configtest
Syntax OK
mcedit /home/web/www/html/domain1.de/dist/index.php
root@raspberrypi:/home/web/www/html/domain1.de/dist# cat index.php
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
phpinfo();
?>
Test1 -> domain1.de/index.php?test
Test2 -> domain2.de/index.php?test
copy console
mcedit /home/web/www/html/domain4.net/apache/domain4.conf
root@raspberrypi:~# cat /home/web/www/html/domain4.net/apache/domain4.conf
<VirtualHost 192.168.4.5:80>
  Redirect 301 / http://www.google.de
</VirtualHost>
copy console
sudo service apache2 reload
Test3 -> domain4.net -> 301 Weiterleitung Tante Google

Die locale conf /home/web/www/html/domain4.net/apache/domain4.conf leitet per 301 weiter :: so soll es sein!


ich hatte noch ein wenig mehr getestet ;O)
root@raspberrypi:~# apache2ctl -S
VirtualHost configuration:
192.168.4.5:80         domain4.net (/home/web/www/html/domain4.net/apache/domain4.conf:1)
192.168.4.2:80         %0 (/home/web/www/html/domain1.de/apache/domain1.conf:1)
*:80                   is a NameVirtualHost
         default server %0 (/etc/apache2/conf-enabled/webpi-virtuell-host.conf:12)
         port 80 namevhost %0 (/etc/apache2/conf-enabled/webpi-virtuell-host.conf:12)
         port 80 namevhost %0 (/home/web/www/html/domain2.de/apache/domain2.conf:2)
         port 80 namevhost localhost (/etc/apache2/sites-enabled/000-default.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex mpm-accept: using_defaults
Mutex watchdog-callback: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33

/etc/apache2/apache2.conf		Startpunkt - Grundkonfiguration
/etc/apache2/httpd.conf			benutzerspezifische Konfiguration
/etc/apache2/ports.conf			überwachte Ports, normalerweise Port 80 oder für SSL 443
/etc/apache2/conf.d/*			weitere Konfigurationsdateien
/etc/apache2/mods-available/		verfügbare Erweiterungsmodule
/etc/apache2/mods-enabled/*.conf	Links auf aktive Erweiterungsmodule
/etc/apache2/conf-available/		verfügbare Konfigurationsdateien
/etc/apache2/conf-enabled/*.conf	Links auf aktive Konfigurationsdateien
/etc/apache2/sites-available/		verfügbare Websites (virtuelle Hosts)
/etc/apache2/sites-enabled/*.conf	Links auf aktive Websites (Aktivierte Hosts)
/etc/apache2/envvars			Umgebungsvariablen für das Init-Script

a2ensite  = Modul aktivieren
a2dissite  = Modul deaktivieren

a2ensite neue-seite.de			Virtuelle Seite aktivieren:
service apache2 reload			Konfigurationsdatei von Apache neu laden
/etc/init.d/apache2 restart		Apache2 Dienst neu starten

SSL auf PI einrichten

Quellen

copy console
sudo apt install libnss3-tools
root@raspberrypi:/home/ssl#
copy console
wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.0/mkcert-v1.4.0-linux-arm chmod +x mkcert sudo mv mkcert /usr/local/bin
copy console
cd /home/web/www/html/domain1.de/ssl sudo mkcert -cert-file domain1.de 'domain1.de'
root@raspberrypi:/home/ssl# cd /home/web/www/html/domain1.de/ssl
root@raspberrypi:/home/web/www/html/domain1.de/ssl# sudo mkcert domain1.de 'domain1.de'
Using the local CA at "/root/.local/share/mkcert" ✨

Created a new certificate valid for the following names 📜
 - "domain1.de"
The certificate is at "domain1.de" and the key at "./domain1.de-key.pem" ✅
copy console
mcedit /home/web/www/html/domain1.de/apache/ssl_domain1.conf
root@raspberrypi:/home/web/www/html/domain1.de/ssl# cat /home/web/www/html/domain1.de/apache/ssl_domain1.conf

UseCanonicalName Off

<IfModule ssl_module>
<VirtualHost *:443>


    VirtualDocumentRoot /home/web/www/html/%0/dist/
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

    SSLCertificateFile /home/web/www/html/domain1.de/ssl/domain1.de.pem
    SSLCertificateKeyFile /home/web/www/html/domain1.de/ssl/domain1.de-key.pem
    BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0


    <Directory "/home/web/www/html/*/dist">
    SSLOptions +StdEnvVars
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
        Require all granted
    </Directory>
</VirtualHost>
</IfModule>
prüfe-> https://domain1.de

Step 5 a) Website - Schnelleinrichtung

Schnelleinrichtung Übersicht
mkdir -p /home/web/www/html/webserver.pi/{src,dist,nginx,zugang,ssl,apache,doku}
Abbild sichern ! ;o)

Step 6.) Samba einrichten

  • Samba :: Der Pi wird sichtbar
Bevor ich weiter mache ein paar Überlegungen:

Wir binden den Sambaservice an unserer virtuellen Schnittstelle apt0 dieser Schnittstelle haben wir über die MAC eine feste IP vergeben. Egal in welchen Netwerk der PI sich befindet Samba ist immer über 192.168.4.1 erreichbar. Als Nutzer verwenden wir den User "web" dieser hat entsprechende Berechtigungen zum Schreiben siehe: Pi Verzeichnisse Um beim Hochfahren des PI Samba zu starten müssen die Service angepasst werden. Im Verzeichnis [web-security] können wir ausführbare PHP Scripte ablegen ... To-Do vieleicht schreibe ich noch kleines Admininterface

Quellen

copy console
sudo apt-get install samba samba-common smbclient
Fehler beim Install :: keine Ahnung was das bedeutet :: erstmal festgehalten
Samba is not being run as an AD Domain Controller: Masking samba-ad-dc.service Please ignore the following error about deb-systemd-helper not finding those services. (samba-ad-dc.service masked) Created symlink /etc/systemd/system/multi-user.target.wants/nmbd.service → /lib/systemd/system/nmbd.service. Failed to preset unit: Unit file /etc/systemd/system/samba-ad-dc.service is masked. /usr/bin/deb-systemd-helper: error: systemctl preset failed on samba-ad-dc.service: No such file or directory Created symlink /etc/systemd/system/multi-user.target.wants/smbd.service → /lib/systemd/system/smbd.service.
Samba Server läuft -> prüfen
copy console
service smbd status service nmbd status
vorhandene conf umbennen -> neue anlegen
copy console
mv /etc/samba/smb.conf /etc/samba/smb.conf_sicher mcedit /etc/samba/smb.conf
Das muss rein
root@raspberrypi:~# cat  /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
netbios name = Pi_Samba
security = user
bind interfaces only = yes
# interfaces = lo ap0
interfaces = 192.168.4.1


[web]
comment = WebPI
path = /home/web/www/html
browsable =yes
writable = yes
guest ok = yes
read only = no
force user = web


[web-security]
comment = security
path = /home/web/
browsable =yes
writable = yes
guest ok = yes
read only = no
force user = web
copy console
systemctl edit --full nmbd.service
Wir müssen den nmbd.service Service anpassen = Wann beim Boot starten...
[Unit]
Description=Samba NMB Daemon
Documentation=man:nmbd(8) man:samba(7) man:smb.conf(5)
# Wants=network-online.target
# After=network.target network-online.target
After=hostapd.service

[Service]
Type=notify
NotifyAccess=all
PIDFile=/var/run/samba/nmbd.pid
EnvironmentFile=-/etc/default/samba
ExecStart=/usr/sbin/nmbd --foreground --no-process-group $NMBDOPTIONS
ExecReload=/bin/kill -HUP $MAINPID
LimitCORE=infinity


[Install]
WantedBy=multi-user.target
copy console
systemctl edit --full smbd.service
Wir müssen den smbd.service Service anpassen = Wann beim Boot starten
[Unit]
Description=Samba SMB Daemon
Documentation=man:smbd(8) man:samba(7) man:smb.conf(5)
#Wants=network-online.target
#After=network.target network-online.target nmbd.service winbind.service
After=hostapd.service nmbd.service winbind.service


[Service]
Type=notify
NotifyAccess=all
PIDFile=/var/run/samba/smbd.pid
LimitNOFILE=16384
EnvironmentFile=-/etc/default/samba
ExecStartPre=/usr/share/samba/update-apparmor-samba-profile
ExecStart=/usr/sbin/smbd --foreground --no-process-group $SMBDOPTIONS
ExecReload=/bin/kill -HUP $MAINPID
LimitCORE=infinity


[Install]

copy console
sudo service smbd restart sudo service nmbd restart
Passwort und Benutzer merken! -> Windows fragt dannach
copy console
sudo smbpasswd -a web
root@raspberrypi:~#  netstat -tulpn | egrep "samba|smbd|nmbd|winbind"
tcp        0      0 192.168.4.1:139         0.0.0.0:*               LISTEN      463/smbd
tcp        0      0 192.168.4.1:445         0.0.0.0:*               LISTEN      463/smbd
udp        0      0 192.168.4.255:137       0.0.0.0:*                           338/nmbd
udp        0      0 192.168.4.1:137         0.0.0.0:*                           338/nmbd
udp        0      0 0.0.0.0:137             0.0.0.0:*                           338/nmbd
udp        0      0 192.168.4.255:138       0.0.0.0:*                           338/nmbd
udp        0      0 192.168.4.1:138         0.0.0.0:*                           338/nmbd
udp        0      0 0.0.0.0:138             0.0.0.0:*                           338/nmbd
Der Befehl cut -d: -f1 /etc/passwd zeigt euch alle Benutzer des Systems an.
Der Befehl cat /etc/group zeigt euch alle Gruppen an. Dahinter seht ihr jeweils, welche Benutzer drin stecken.
copy console
reboot
Abbild sichern ! ;o)

Step 7.) Nodejs Yarn install

  • Node Js :: Der Pi bekommt Node
Bevor ich weiter mache ein paar Überlegungen:

Yarn – eine Alternative zu npm! Das Besondere an Yarn ist seine Art, Abhängigkeiten zu verwalten. Yarn durchläuft die Registry zuerst rekursiv und legt die Abhängigkeit für bestimmte Versionen in einem Lockfile ab.

Quellen

copy console
cd /home/pi curl -sL https://deb.nodesource.com/setup_12.x | bash - apt-get install -y nodejs
Yarn install
copy console
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update && sudo apt-get install yarn yarn -v
copy console
yarn global add yarn
copy console
apt-get install git
Abbild sichern ! ;o)

Step 9.) Speicher-Platz schaffen

  • Samba :: Der Pi bekommt Platz
Bevor ich weiter mache ein paar Überlegungen:

Life up 43,800 Hours - Steht jedenfalls auf der Verpackung - wir werden sehen! To-Do Backup... habe noch keine Möglichkeit gefunden Mysql bzw. Maria Db im Livebetrieb zu spiegeln...

Zwischen 45 - 48 MB/s das ist gut aber nicht sehr gut .....
sudo raspi-config
copy console
sudo raspi-config
Einfach den Anweisungen folgen!
Device         Boot  Start       End   Sectors  Size Id Type
/dev/mmcblk0p1        8192    532480    524289  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      540672 250085375 249544704  119G 83 Linux
Den Grafik Speicher von 64MByte für die GPU auf 32 MByte reduzieren wir nutzen nur console und brauchen jedes RAM... 16 funktioniert nicht!
Abbild sichern ! ;o) Dauert jetzt ca. 30 Minuten

Step 10.) PHP Template / Bulma / Gulp

  • GIT Clone :: Pi nimmt Arbeit auf
Bevor ich weiter mache ein paar Überlegungen:

Ab jetzt wird es produktiv ....

Der PI ist jetzt so eingerichtet wie ich es wollte!

Hier geht es um die Entwicklung hochperformanter Websites. JS / CSS / Bilder Datein werden zur Istzeit auf Größe = Ladezeiten durch eingebundene Nodejs Ressourcen optimiert und stehen im Verzeichnis "dist" für den uplaod auf dem Webserver Server bereit. Alle verwendete Ressourcen sind "up to date" es wird gulp-babel v8 (gulpfile.babel.js & .babelrc) verwendet = ES6

-----------------------------------------------------------
-- Für das was ich hier niedergeschrieben habe kann ich  --
-- keine Garantie geben noch Support leisten, sorry  ;o) --
-----------------------------------------------------------
									

Quellen

Wir richten uns eine Script für IP und Domains ein !
copy console
mcedit /etc/rc.local
Das muss rein
root@raspberrypi:~# cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s
" "$_IP"
fi

#########################
##     web mounten     ##
#########################

 mount /home/web/www &

#########################
## Domains / Ips       ##
#########################

/bin/sleep 5 && php /home/web/www/domains/domain-ip-web-route.php

exit 0
copy console
mkdir -p /home/web/www/domains mcedit /home/web/www/domains/domain-ip-web-route.php
das muss rein:
copy console
<?php ################################################################# ## Ver 0.1 Domain Route Script ## ## /home/web/www/domains/domain-ip-web-route.php ## ## ## ## ## ## Es wird beim Start mit /etc/rc.local geladen ## ## Es liegt per Samba im Verzeichnis ## ## \192.168.4.1\web-security\www\domains ## ## mit Console im Verzeichnis ## ## cd /home/web/www/domains/ ## ################################################################# $my_domains = array(); $my_domains['192.168.4.2']['Beschreibung'] = ' ################################################################# ## Name: default-web.pi Adresse: 192.168.4.2 Datum 06-09.2019 ## ## Kurz Beschreibung: Diese Domain dient als Vorlage ## ################################################################# '; $my_domains['192.168.4.2']['route'] = '192.168.4.2 default-web.pi default-web.pi'; $my_domains['192.168.4.3']['Beschreibung'] = " ################################################################# ## Name: exemple.de Adresse: 192.168.4.3 Datum 06-09.2019 ## ## Kurz Beschreibung: dient zum Test der Auflösung interner ## ## Domains exemple.de = local / www.exemple.de = WWW ## ################################################################# "; $my_domains['192.168.4.3']['route'] = '192.168.4.3 test.de test.de'; $lines = file('/etc/hosts'); exec("ip -4 -o addr show ap0 ", $ip_add_array); // debug print_r($ip_add); foreach ($my_domains as $ip_add => $val_array) { if (!empty($val_array['route'])) { // Muster inet 192.168.4.1/24 " if (!preg_grep("~inet " . $ip_add . "/28~", $ip_add_array)) { $cmd = 'ip address add ' . $ip_add . '/28 dev ap0'; exec($cmd); } if (!preg_grep("/^" . $val_array['route'] . "/", $lines)) { file_put_contents('/etc/hosts', str_replace("\r", "", "\n" . trim($val_array['Beschreibung']) . "\n" . trim($val_array['route'])), FILE_APPEND); } } } ?>
/etc/hosts Leer ?
root@raspberrypi:~# cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi
copy console
reboot
Die hosts ok?
root@raspberrypi:~# cat  /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi



#################################################################
## Name: default-web.pi Adresse: 192.168.4.2 Datum 06-09.2019  ##
## Kurz Beschreibung: Diese Domain dient als Vorlage           ##
#################################################################
192.168.4.2 default-web.pi default-web.pi
#################################################################
## Name: exemple.de Adresse: 192.168.4.3     Datum 06-09.2019  ##
## Kurz Beschreibung: dient zum Test der Auflösung interner    ##
## Domains exemple.de = local / www.exemple.de = WWW           ##
#################################################################
192.168.4.3 test.de test.de
ip Adressen da?
root@raspberrypi:~# ip addr show ap0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
192.168.4.1
192.168.4.2
192.168.4.3
Unser Server läuft?
root@raspberrypi:~# sudo systemctl status apache2.service
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-09-06 12:58:22 BST; 16min ago
     Docs: https://httpd.apache.org/docs/2.4/
  Process: 420 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 472 (apache2)
    Tasks: 6 (limit: 4915)
   Memory: 15.4M
   CGroup: /system.slice/apache2.service
           ├─472 /usr/sbin/apache2 -k start
           ├─474 /usr/sbin/apache2 -k start
           ├─478 /usr/sbin/apache2 -k start
           ├─487 /usr/sbin/apache2 -k start
           ├─488 /usr/sbin/apache2 -k start
           └─489 /usr/sbin/apache2 -k start

Die Ip von default-web.pi zeigt auf 192.168.4.2 ?
root@raspberrypi:~# ping default-web.pi
PING default-web.pi (192.168.4.2) 56(84) bytes of data.
64 bytes from default-web.pi (192.168.4.2): icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from default-web.pi (192.168.4.2): icmp_seq=2 ttl=64 time=0.095 ms
64 bytes from default-web.pi (192.168.4.2): icmp_seq=3 ttl=64 time=0.082 ms
^C
--- default-web.pi ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 94ms
rtt min/avg/max/mdev = 0.082/0.103/0.132/0.021 ms
Kann der Pi die Namen auflösen ?
wenn nicht nochmals rebooten
root@raspberrypi:~# dig default-web.pi

; <<>> DiG 9.11.5-P4-5.1-Raspbian <<>> default-web.pi
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26055
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;default-web.pi.                        IN      A

;; ANSWER SECTION:
default-web.pi.         0       IN      A       192.168.4.2

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Sep 06 14:35:22 BST 2019
;; MSG SIZE  rcvd: 59

root@raspberrypi:~# dig test.de

; <<>> DiG 9.11.5-P4-5.1-Raspbian <<>> test.de
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13667
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.de.                       IN      A

;; ANSWER SECTION:
test.de.                0       IN      A       192.168.4.3

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Sep 06 14:35:34 BST 2019
;; MSG SIZE  rcvd: 52
Warum testet der das alles?

Das Script domain-ip-web-route.php ist eben erst entstanden ;o) Also Beta

Ok wir richten jetzt das Template auf default-web.pi ein...

Regeln um online zu sein ohne mitmproxy Proxy
root@raspberrypi:~# sudo /bin/bash /home/pi/clean_iptables.sh
root@raspberrypi:~# sudo iptables -A FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
root@raspberrypi:~# sudo iptables -A FORWARD -i ap0 -o eth0 -j ACCEPT
root@raspberrypi:~# sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
copy console
sudo systemctl edit wpa_supplicant@wlan0.service
Das muss rein

[Unit]
BindsTo=hostapd.service
After=hostapd.service

[Service]
ExecStartPost=/sbin/iptables -A FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
ExecStartPost=/sbin/iptables -A FORWARD -i ap0 -o eth0 -j ACCEPT
ExecStartPost=/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ExecStartPost=/sbin/iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

ExecStopPost=-/sbin/iptables -D FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
ExecStopPost=-/sbin/iptables -D FORWARD -i ap0 -o eth0 -j ACCEPT
ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE

copy console
sudo systemctl reload-or-restart wpa_supplicant@wlan0.service sudo systemctl disable mitmweb.service

Quellen

wichtigste Befehle
sudo systemctl reload-or-restart wpa_supplicant@wlan0.service
sudo systemctl status wpa_supplicant@wlan0.service
systemctl is-enabled  wpa_supplicant@wlan0.service
systemctl show wpa_supplicant@wlan0.service -p Conflicts


sudo systemctl stop mitmweb.service
sudo systemctl disable mitmweb.service // Aus start entfernen 
sudo systemctl status mitmweb.service
systemctl is-enabled  mitmweb.service
Ausdokumentieren der IP Regeln

root@raspberrypi:~# cat /etc/systemd/system/mitmweb.service
[Unit]
 Description=mitmweb service
# After=network.target
BindsTo=hostapd.service
After=hostapd.service

 [Service]
 Type=simple
 User=root
 ExecStart=/home/pi/start_mitmweb.sh
 Restart=on-failure
 RestartSec=5
##################
# iptables laden #
##################

###ExecStartPost=/sbin/iptables -A FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
###ExecStartPost=/sbin/iptables -A FORWARD -i ap0 -o eth0 -j ACCEPT
###ExecStartPost=/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ExecStartPost=/sbin/iptables -t nat -A PREROUTING -i ap0 -p tcp --dport 443 -j REDIRECT --to-port 8080
ExecStartPost=/sbin/iptables -t nat -A PREROUTING -i ap0 -p tcp --dport 80 -j REDIRECT --to-port 8080

###ExecStopPost=-/sbin/iptables -D FORWARD -i eth0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
###ExecStopPost=-/sbin/iptables -D FORWARD -i ap0 -o eth0 -j ACCEPT
###ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ExecStopPost=-/sbin/iptables -t nat -D PREROUTING -i ap0 -p tcp --dport 443 -j REDIRECT --to-port 8080
ExecStopPost=-/sbin/iptables -t nat -D PREROUTING -i ap0 -p tcp --dport 80 -j REDIRECT --to-port 8080
 [Install]
 WantedBy=multi-user.target
copy console
reboot
ok, wir haben den Proxy erstmal rausgenommen und können ihn jederzeit per:
sudo systemctl reload-or-restart mitmweb.service
wieder starten... Unser Test : http://192.168.4.1:9090/#/flows?e=true
dann wieder ausschalten: systemctl stop mitmweb.service
copy console
cd /home/web/www/html git clone https://github.com/netwurm/default-web.pi.git

Unter https://github.com/netwurm/default-web.pi.git findet ihr ein Template von Netwurm ;o)

root@raspberrypi:/home/web/www/html#  git clone https://github.com/netwurm/default-web.pi.git
Cloning into 'default-web.pi'...
remote: Enumerating objects: 110, done.
remote: Counting objects: 100% (110/110), done.
remote: Compressing objects: 100% (98/98), done.
remote: Total 110 (delta 5), reused 104 (delta 5), pack-reused 0
Receiving objects: 100% (110/110), 571.03 KiB | 1.17 MiB/s, done.
Resolving deltas: 100% (5/5), done.
root@raspberrypi:/home/web/www/html# dir
default-web.pi  index.html  phpinfo.php
root@raspberrypi:/home/web/www/html# cd default-web.pi/
root@raspberrypi:/home/web/www/html/default-web.pi#
copy console
sudo apt-get install libtool automake autoconf nasm reboot
libwebp - install
copy console
apt-get update && sudo apt-get upgrade apt-get install -y gcc make autoconf automake libtool libjpeg-dev libpng-dev mkdir -p /home/libwebp cd /home/libwebp wget storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.3.tar.gz tar -zxvf libwebp-1.0.3.tar.gz cd libwebp-1.0.3 ./configure
.......
config.status: executing libtool commands
configure:
WebP Configuration Summary
--------------------------

Shared libraries: yes
Static libraries: yes
Threading support: yes
libwebp: yes
libwebpdecoder: no
libwebpdemux: yes
libwebpmux: no
libwebpextras: no

Tools:
cwebp : yes
  Input format support
  ====================
  JPEG : yes
  PNG  : yes
  TIFF : no
  WIC  : no
dwebp : yes
  Output format support
  =====================
  PNG  : yes
  WIC  : no
GIF support : no
anim_diff   : no
gif2webp    : no
img2webp    : no
webpmux     : no
vwebp       : no
webpinfo    : no
SDL support : no
vwebp_sdl   : no
copy console
make make install
copy console
apt-get install locate updatedb
root@raspberrypi:/home/libwebp/libwebp-1.0.3# cwebp
cwebp: error while loading shared libraries: libwebpdemux.so.2: cannot open shared object file: No such file or directory
Fix error
copy console
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib echo $LD_LIBRARY_PATH echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib" >> ~/.bashrc
ok läuft ...
root@raspberrypi:~# cwebp
Usage:

   cwebp [options] -q quality input.png -o output.webp

where quality is between 0 (poor) to 100 (very good).
Typical value is around 80.

Try -longhelp for an exhaustive list of advanced options.
root@raspberrypi:~# locate /bin/cwebp
/usr/local/bin/cwebp

root@raspberrypi:~# cwebp -longhelp
Usage:
 cwebp [-preset <...>] [options] in_file [-o out_file]

If input size (-s) for an image is not specified, it is
assumed to be a PNG, JPEG, TIFF or WebP file.

Options:
  -h / -help ............. short help
  -H / -longhelp ......... long help
  -q  ............. quality factor (0:small..100:big), default=75
  -alpha_q  ......... transparency-compression quality (0..100),
                           default=100
  -preset  ....... preset setting, one of:
                            default, photo, picture,
                            drawing, icon, text
     -preset must come first, as it overwrites other parameters
  -z  ............... activates lossless preset with given
                           level in [0:fast, ..., 9:slowest]

  -m  ............... compression method (0=fast, 6=slowest), default=4
  -segments  ........ number of segments to use (1..4), default=4
  -size  ............ target size (in bytes)
  -psnr  .......... target PSNR (in dB. typically: 42)

  -s   ......... input size (width x height) for YUV
  -sns  ............. spatial noise shaping (0:off, 100:max), default=50
  -f  ............... filter strength (0=off..100), default=60
  -sharpness  ....... filter sharpness (0:most .. 7:least sharp), default=0
  -strong ................ use strong filter instead of simple (default)
  -nostrong .............. use simple filter instead of strong
  -sharp_yuv ............. use sharper (and slower) RGB->YUV conversion
  -partition_limit  . limit quality to fit the 512k limit on
                           the first partition (0=no degradation ... 100=full)
  -pass  ............ analysis pass number (1..10)
  -crop     .. crop picture with the given rectangle
  -resize   ........ resize picture (after any cropping)
  -mt .................... use multi-threading if available
  -low_memory ............ reduce memory usage (slower encoding)
  -map  ............. print map of extra info
  -print_psnr ............ prints averaged PSNR distortion
  -print_ssim ............ prints averaged SSIM distortion
  -print_lsim ............ prints local-similarity distortion
  -d  .......... dump the compressed output (PGM file)
  -alpha_method  .... transparency-compression method (0..1), default=1
  -alpha_filter  . predictive filtering for alpha plane,
                           one of: none, fast (default) or best
  -exact ................. preserve RGB values in transparent area, default=off
  -blend_alpha  ..... blend colors against background color
                           expressed as RGB values written in
                           hexadecimal, e.g. 0xc0e0d0 for red=0xc0
                           green=0xe0 and blue=0xd0
  -noalpha ............... discard any transparency information
  -lossless .............. encode image losslessly, default=off
  -near_lossless  ... use near-lossless image
                           preprocessing (0..100=off), default=100
  -hint  ......... specify image characteristics hint,
                           one of: photo, picture or graph

  -metadata  ..... comma separated list of metadata to
                           copy from the input to the output if present.
                           Valid values: all, none (default), exif, icc, xmp

  -short ................. condense printed message
  -quiet ................. don't print anything
  -version ............... print version number and exit
  -noasm ................. disable all assembly optimizations
  -v ..................... verbose, e.g. print encoding/decoding times
  -progress .............. report encoding progress

Experimental Options:
  -jpeg_like ............. roughly match expected JPEG size
  -af .................... auto-adjust filter strength
  -pre  ............. pre-processing filter
copy console
cd /home/web/www/html/default-web.pi/ yarn

root@raspberrypi:/home/web/www/html/default-web.pi# yarn run
yarn run v1.17.3
info Commands available from binary scripts: acorn, atob, autoprefixer, babel, babel-external-helpers, babel-node, bin-version-check, browser-sync, browserslist, color-support, css-blank-pseudo, css-has-pseudo, css-prefers-color-scheme, cssesc, cwebp, dev-ip, esparse, esvalidate, executable, gifsicle, gulp, in-install, in-publish, jpegtran, js-yaml, jsesc, json5, loose-envify, lpad-align, lt, mime, mkdirp, node-gyp, node-sass, nopt, not-in-install, not-in-publish, opn, optipng, parser, pixelmatch, purgecss, rc, regexp-tree, regjsparser, rimraf, sassgraph, seek-bunzip, seek-table, semver, sshpk-conv, sshpk-sign, sshpk-verify, strip-indent, svgo, throttleproxy, uglifyjs, uuid, which, window-size
info Project commands
   - build
      gulp
   - convert
      gulp convert
   - serve
      gulp serve
   - tests
      gulp tests
   - watch
      gulp watch
question Which command would you like to run?:



copy console
yarn run convert
$ gulp convert
[16:18:09] Requiring external module @babel/register
[16:18:22] Using gulpfile /home/web/www/html/default-web.pi/gulpfile.babel.js
[16:18:22] Starting 'convert'...
[16:18:22] Starting 'bulma_copy_from_node'...
10 Sep 16:18:22 - Bulma: Bulma_0.7.5
10 Sep 16:18:22 - Local Path to Save Bulma from Node : /home/web/www/html/default-web.pi\src\sass\Bulma_0.7.5
[16:18:23] Finished 'bulma_copy_from_node' after 677 ms
[16:18:23] Finished 'convert' after 688 ms
Done in 22.09s.
Alle von mir getesteten Gulp Module zum Erstellen von .webp funktionieren auf dem Pi nicht! es gibt zwei Wege das zu Fixen:
a.) exec('/usr/local/bin/cwebp -resize 600 0 ' + input_image + ' -o ' + output_image, function (err, stdout, stderr) {.....						
b.) ln -sf /usr/local/bin/cwebp /home/web/www/html/default-web.pi/node_modules/cwebp-bin/vendor/cwebp....						
						
a.) var RASPBERRY = true; in der gulpfile.babel.js setzen

var RASPBERRY = true;

/* nur wenn cwebp unterstützt wird 
//////////////////////////////////////
// import cwebp from 'gulp-cwebp'
///////////////////////////////////////
*/

b.) Symbolischer Link :
copy console
yarn run build
Fix error
[16:01:53] 'imageswebp' errored after 28 s
[16:01:53] Error in plugin 'gulp-cwebp'
Message:
    spawn /home/web/www/html/default-web.pi/node_modules/cwebp-bin/vendor/cwebp EACCES
Details:
    errno: EACCES
    code: EACCES
    syscall: spawn /home/web/www/html/default-web.pi/node_modules/cwebp-bin/vendor/cwebp
    path: /home/web/www/html/default-web.pi/node_modules/cwebp-bin/vendor/cwebp
    spawnargs: -o,/tmp/32081fbf-0309-4500-a807-34bfdbc8badc,/tmp/4593596a-5999-49c4-b9de-4092024dca9d
    killed: false
    stdout:
    stderr:
    failed: true
    signal: null
    cmd: /home/web/www/html/default-web.pi/node_modules/cwebp-bin/vendor/cwebp -o /tmp/32081fbf-0309-4500-a807-34bfdbc8badc /tmp/4593596a-5999-49c4-b9de-4092024dca9d
    timedOut: false
    domainEmitter: [object Object]
    domainThrown: false
[16:01:53] 'default' errored after 29 s
[16:01:53] The following tasks did not complete: images
[16:01:53] Did you forget to signal async completion?
error Command failed with exit code 1.
Auf dem Raspberry läuft das Node cwebp-bin Modul nicht! wir fixen das mit einem Symbolischen Link
copy console
ln -sf /usr/local/bin/cwebp /home/web/www/html/default-web.pi/node_modules/cwebp-bin/vendor/cwebp
->http://default-web.pi unsere Website ist jetzt erreichbar ;o)
copy console
yarn run serve
Abbild sichern ! fertig ;o) 11_09_2019.img

Step 11.) Fine Tuning Mysql / PHP / Memcache

  • Fine Tuning :: Pi bekommt letzten Schliff
Bevor ich weiter mache ein paar Überlegungen:

Wir befinden uns im produktiven Bereich

Der PI wird ein kleines Abbbild des großen Bruders im WWW !

Mysql / PHP laufen noch mit den Standard Einstellungen... das werden wir ändern. Inwieweit der PI mit diesen Einstellungen umgehen kann wird sich beim Arbeiten zeigen. Mit Memcache nutze ich den Ram um den Seitenaufbau noch etwas zu beschleunigen. So werden sich wiederholende Suchanfragen in den Ram gelegt das entlastet den Mysql-Server...

Ok los geht's , Mysql Optimierung .... so sieht es bis jetzt aus
copy console
mkdir -p /home/web/www/mysqltuner cd /home/web/www/mysqltuner wget http://mysqltuner.pl/ -O mysqltuner.pl wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv chmod +x mysqltuner.pl perl mysqltuner.pl --host 127.0.0.1 --user root --pass networkmysql
performance_schema = on
mcedit /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
performance_schema = on
sudo systemctl reload-or-restart mariadb.service

networkmysql
......
Variables to adjust:
    query_cache_size (=0)
    query_cache_type (=0)
    query_cache_limit (> 1M, or use smaller result sets)
    innodb_log_file_size should be (=16M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.
......
passwort ändern mysql
root@raspberrypi:/var/lib/mysql# mysqladmin -u root password
New password:
Confirm new password:
mysqladmin: Passwords don't match
root@raspberrypi:/var/lib/mysql# mysqladmin -u root password
root@raspberrypi:~# cat /etc/mysql/mariadb.conf.d/50-server.cnf
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
socket                  = /run/mysqld/mysqld.sock
#port                   = 3306
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
#skip-external-locking

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1

#
# * Fine Tuning
#
#key_buffer_size        = 16M
#max_allowed_packet     = 16M
#thread_stack           = 192K
#thread_cache_size      = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
#myisam_recover_options = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10

#
# * Query Cache Configuration
#
#query_cache_limit      = 1M
query_cache_size        = 16M

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file       = /var/log/mysql/mysql.log
#general_log            = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time        = 10
#log_slow_rate_limit    = 1000
#log_slow_verbosity     = query_plan
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
#max_binlog_size        = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = exclude_database_name

#
# * Security Features
#
# Read the manual, too, if you want chroot!
#chroot = /var/lib/mysql/
#
# For generating SSL certificates you can use for example the GUI tool "tinyca".
#
#ssl-ca = /etc/mysql/cacert.pem
#ssl-cert = /etc/mysql/server-cert.pem
#ssl-key = /etc/mysql/server-key.pem
#
# Accept only connections using the latest and most secure TLS protocol version.
# ..when MariaDB is compiled with OpenSSL:
#ssl-cipher = TLSv1.2
# ..when MariaDB is compiled with YaSSL (default in Debian):
#ssl = on

#
# * Character sets
#
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
#
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!

#
# * Unix socket authentication plugin is built-in since 10.0.22-6
#
# Needed so the root database user can authenticate without a password but
# only when running as the unix root user.
#
# Also available for other users if required.
# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.3 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.3]
mariadb.service stop
copy console
sudo systemctl start mariadb.service perl mysqltuner.pl --host 127.0.0.1 --user root --pass networkmysql
copy console
mv /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.bak mcedit /etc/mysql/mariadb.conf.d/50-server.cnf

root@raspberrypi:/home/web/www/mysqltuner# cat  /etc/mysql/mariadb.conf.d/50-server.cnf
# Optimized my.cnf configuration for MySQL/MariaSQL
#
# by Fotis Evangelou, developer of Engintron (engintron.com)
#
# === Updated December 2018 ===
#
# The settings provided below are a starting point for a 2GB - 4GB RAM server with 2-4 CPU cores.
# If you have less or more resources available you should adjust accordingly to save CPU,
# RAM and disk I/O usage.
# The settings marked with a specific comment or the word "UPD" after the value
# should be adjusted for your system by using database diagnostics tools like:
# https://github.com/major/MySQLTuner-perl
# or
# https://launchpad.net/mysql-tuning-primer (supports MySQL up to v5.6)
#
#
# Note that if there is NO comment after a setting value, then 99,9% of the times you won't need to adjust it.
#
#
# THINGS TO DO AFTER YOU UPDATE MY.CNF - TROUBLESHOOTING
# If any terminal commands are mentioned, make sure you execute them as "root" user.
# If MySQL cannot start or restart, then perform the following actions.
#
# 1. If the server had the stock database configuration and you added or updated any
#    "innodb_log_*" settings (as suggested below), then execute these commands ONLY
#    the first time you apply this configuration:
#
#    $ rm -rvf /var/lib/mysql/ib_logfile*
#    $ chown -R mysql:mysql /var/lib/mysql
#    $ service mysql restart
#
#    or use the shorthand command:
#    $ rm -rvf /var/lib/mysql/ib_logfile*; chown -R mysql:mysql /var/lib/mysql; service mysql restart
#
# 2. If the setting "bind-address" is not commented out, then make sure the file /etc/hosts is
#    properly configured. A good example of a "clean" /etc/hosts file is something like this:
#
#    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#    ::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
#    1.2.3.4   hostname.domain.tld hostname # Replace accordingly!
#
#    Finally restart the database service:
#
#    $ service mysql restart
#
# 3. If the database service cannot restart even after the first 2 steps, make sure the database data folder
#    (common for either MySQL or MariaDB) "/var/lib/mysql" is owned by the "mysql" user AND group.
#    Additionally, the folder itself can have 0751 or 0755 file permissions. To fix it, simply do this:
#    $ chown -R mysql:mysql /var/lib/mysql
#    $ chmod 0755 /var/lib/mysql
#
#    Finally restart the database service:
#
#    $ service mysql restart

[mysql]
port                            = 3306
socket                          = /run/mysqld/mysqld.sock

[mysqld]
#user                    = mysql
#pid-file                = /run/mysqld/mysqld.pid
#socket                  = /run/mysqld/mysqld.sock
#port                   = 3306
#basedir                 = /usr
#datadir                 = /var/lib/mysql
#tmpdir                  = /tmp
#lc-messages-dir         = /usr/share/mysql




# Required Settings
basedir                         = /usr
bind_address                    = 127.0.0.1 # Change to 0.0.0.0 to allow remote servers to connect to this server's
                                            # database instance
datadir                         = /var/lib/mysql
max_allowed_packet              = 256M
max_connect_errors              = 1000000
pid_file                        = /run/mysqld/mysqld.pid
#port                            = 3306
skip_external_locking
skip_name_resolve
socket                          = /run/mysqld/mysqld.sock
lc-messages-dir                         = /usr/share/mysql
#sql_mode                       = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES # Enable for b/c with databases
                                                                                                                                               # using null dates
tmpdir                          = /tmp
user                            = mysql

# InnoDB Settings


default_storage_engine          = InnoDB
innodb_buffer_pool_instances    = 2     # Use 1 instance per 1GB of InnoDB pool size
innodb_buffer_pool_size         = 1G    # Use up to 70-80% of RAM & optionally check if /proc/sys/vm/swappiness is set to 0
innodb_file_per_table           = 1
innodb_flush_log_at_trx_commit  = 0
innodb_flush_method             = O_DIRECT
innodb_log_buffer_size          = 16M
innodb_log_file_size            = 512M
innodb_stats_on_metadata        = 0

#innodb_temp_data_file_path     = ibtmp1:64M:autoextend:max:20G # Control the maximum size for the ibtmp1 file
#innodb_thread_concurrency      = 4     # Optional: Set to the number of CPUs on your system (minus 1 or 2) to better
                                        # contain CPU usage. E.g. if your system has 8 CPUs, try 6 or 7 and check
                                        # the overall load produced by MySQL/MariaDB.
innodb_read_io_threads          = 64
innodb_write_io_threads         = 64

# MyISAM Settings
query_cache_limit               = 4M    # UPD - Option supported up to MySQL v5.7
query_cache_size                = 48M   # UPD - Option supported up to MySQL v5.7
query_cache_type                = 1     # Option supported up to MySQL v5.7

##query_cache_type=0  # for OFF
##query_cache_size=0  # to ensure QC is NOT USED


key_buffer_size                 = 48M   # UPD

low_priority_updates            = 1
concurrent_insert               = 2

# Connection Settings
max_connections                 = 100   # UPD

back_log                        = 512
thread_cache_size               = 100
thread_stack                    = 192K

interactive_timeout             = 180
wait_timeout                    = 180

# Buffer Settings
join_buffer_size                = 4M    # UPD
read_buffer_size                = 3M    # UPD
read_rnd_buffer_size            = 4M    # UPD
sort_buffer_size                = 4M    # UPD

# Table Settings
# In systemd managed systems like Ubuntu 16.04 or CentOS 7, you need to perform an extra action for table_open_cache & open_files_limit
# to be overriden (also see comment next to open_files_limit).
# E.g. for MySQL 5.7, please check: https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
# and for MariaDB check: https://mariadb.com/kb/en/library/systemd/
table_definition_cache          = 10000 # UPD
table_open_cache                = 10000 # UPD
open_files_limit                = 60000 # UPD - This can be 2x to 3x the table_open_cache value or match the system's
                                        # open files limit usually set in /etc/sysctl.conf or /etc/security/limits.conf
                                        # In systemd managed systems this limit must also be set in:
                                        # /etc/systemd/system/mysqld.service.d/override.conf (for MySQL 5.7+) and
                                        # /etc/systemd/system/mariadb.service.d/override.conf (for MariaDB)

max_heap_table_size             = 128M
tmp_table_size                  = 128M

# Search Settings Fulltext 
ft_min_word_len                 = 2     # Minimum length of words to be indexed for search results

# Logging
log_error                       = /var/lib/mysql/mysql_error.log
log_queries_not_using_indexes   = 1
long_query_time                 = 5
slow_query_log                  = 0     # Disabled for production
slow_query_log_file             = /var/lib/mysql/mysql_slow.log

[mysqldump]
# Variable reference
# For MySQL 5.7: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
# For MariaDB:   https://mariadb.com/kb/en/library/mysqldump/
quick
quote_names
max_allowed_packet              = 64M

######################################################

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.3 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.3]
systemctl status mariadb.service
Sep 12 13:05:17 raspberrypi mysqld[10303]: 2019-09-12 13:05:17 0 [Note] /usr/sbin/mysqld (mysqld 10.3.17-MariaDB-0+deb10u1) starting as process 10303
Sep 12 13:05:17 raspberrypi mysqld[10303]: 2019-09-12 13:05:17 0 [Warning] Could not increase number of max_open_files to more than 16364 (request: 20
Sep 12 13:05:17 raspberrypi mysqld[10303]: 2019-09-12 13:05:17 0 [Warning] Changed limits: max_open_files: 16364  max_connections: 100 (was 100)  tabl
Fix Error
copy console
mkdir -p /etc/systemd/system/mariadb.service.d touch /etc/systemd/system/mariadb.service.d/override.conf cat > "/etc/systemd/system/mariadb.service.d/override.conf" <<EOF [Service] LimitNOFILE=65535 EOF
clear journalctl & errorlog
copy console
cat /dev/null > /var/lib/mysql/mysql_error.log sudo rm -rf /run/log/journal/* systemctl daemon-reload sudo systemctl reload-or-restart mariadb.service systemctl status mariadb.service
root@raspberrypi:/var/lib/mysql# systemctl status mariadb.service
● mariadb.service - MariaDB 10.3.17 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─override.conf
   Active: active (running) since Thu 2019-09-12 14:08:12 BST; 102ms ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 11660 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
  Process: 11661 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 11663 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl se
  Process: 11978 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
  Process: 11981 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
 Main PID: 11823 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 159 (limit: 4915)
   Memory: 77.9M
   CGroup: /system.slice/mariadb.service
           ├─11823 /usr/sbin/mysqld
           ├─11979 /bin/bash /etc/mysql/debian-start
           └─11998 logger -p daemon.info -i -t/etc/mysql/debian-start Checking for insecure root accounts.
lines 1-20/20 (END)
dies und das Befehle
rm -rvf /var/lib/mysql/ib_logfile*; 
systemctl list-units --type=service | grep maria
systemctl stop mariadb.service
systemctl status mariadb.service
systemctl is-active mariadb.service

copy console
apt-get install memcached
check
root@raspberrypi:/var/lib/mysql# echo "stats settings" | nc localhost 11211
STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 0
STAT inter 127.0.0.1
STAT verbosity 0
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT num_threads_per_udp 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-negotiate
STAT auth_enabled_sasl no
STAT item_size_max 1048576
STAT maxconns_fast yes
STAT hashpower_init 0
STAT slab_reassign yes
STAT slab_automove 1
STAT slab_automove_ratio 0.80
STAT slab_automove_window 30
STAT slab_chunk_max 524288
STAT lru_crawler yes
STAT lru_crawler_sleep 100
STAT lru_crawler_tocrawl 0
STAT tail_repair_time 0
STAT flush_enabled yes
STAT dump_enabled yes
STAT hash_algorithm murmur3
STAT lru_maintainer_thread yes
STAT lru_segmented yes
STAT hot_lru_pct 20
STAT warm_lru_pct 40
STAT hot_max_factor 0.20
STAT warm_max_factor 2.00
STAT temp_lru no
STAT temporary_ttl 61
STAT idle_timeout 0
STAT watcher_logbuf_size 262144
STAT worker_logbuf_size 65536
STAT track_sizes no
STAT inline_ascii_response no
END
copy console
apt-get install -y php-memcached
-> http://default-web.pi/phpinfo.php
  • mod rewrite
    https://wiki.ubuntuusers.de/Apache/mod_rewrite/
copy console
sudo a2enmod rewrite sudo a2enmod actions systemctl restart apache2

Step 12.) nginx - Reverse Proxy

  • Pi bekommt einen Reverse Proxy
Bevor ich weiter mache ein paar Überlegungen:

Wir befinden uns im produktiven Bereich

Der PI bekommt einen Reverse Proxy mit für SSL / http2

nginx verlangt für PHP eine FastCGI-Schnittstelle. Da PHP nicht im Passiv-Modus agiert, müssen - wie bei FastCGI üblich - PHP-Instanzen gestartet werden, die im Arbeitsspeicher auf ihren Einsatz warten. Die einfachste Möglichkeit dies zu erreichen ist die Verwendung des PHP FastCGI Process Managers.



root@raspberrypi:~# locate fpm/pool.d
/etc/php/7.3/fpm/pool.d
/etc/php/7.3/fpm/pool.d/www.conf

sudo systemctl restart php7.3-fpm.service 

root@raspberrypi:~# sudo systemctl status  php7.3-fpm.service
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor prese
   Active: active (running) since Fri 2019-09-13 08:18:27 BST; 23s ago
     Docs: man:php-fpm7.3(8)
 Main PID: 1719 (php-fpm7.3)
   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/se
    Tasks: 3 (limit: 4915)
   Memory: 6.2M
   CGroup: /system.slice/php7.3-fpm.service
           ├─1719 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
           ├─1720 php-fpm: pool www
           └─1721 php-fpm: pool www

Sep 13 08:18:26 raspberrypi systemd[1]: Starting The PHP 7.3 FastCGI Process Man
Sep 13 08:18:27 raspberrypi systemd[1]: Started The PHP 7.3 FastCGI Process Mana

copy console
sudo apt-get install php7.3-fpm php7.3-cli php7.3-mysql php7.3-gd php7.3-imagick php7.3-recode php7.3-tidy php7.3-xmlrpc mcedit /etc/apache2/ports.conf
NOTICE: Not enabling PHP 7.3 FPM by default.
NOTICE: To enable PHP 7.3 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.3-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Wir (ver)legen den lauschenden Port 80 auf Port 9090
root@raspberrypi:~# cat  /etc/apache2/ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 9090

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

copy console
sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default mcedit /etc/apache2/mods-enabled/fastcgi.conf
fastcgi.conf
root@raspberrypi:~# cat  /etc/apache2/mods-enabled/fastcgi.conf
<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  FastCgiIpcDir /var/lib/apache2/fastcgi
  AddType application/x-httpd-fastphp .php
  Action application/x-httpd-fastphp /php-fcgi
  Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
  FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.3-fpm.sock -pass-header Authorization
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>
Port 9090 vorhanden?
root@raspberrypi:~# sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.4.1:445         0.0.0.0:*               LISTEN      371/smbd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      578/mysqld
tcp        0      0 192.168.4.1:139         0.0.0.0:*               LISTEN      371/smbd
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      353/memcached
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      265/systemd-resolve
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      384/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      379/sshd
tcp6       0      0 :::9090                 :::*                    LISTEN      579/apache2
tcp6       0      0 :::5355                 :::*                    LISTEN      265/systemd-resolve
tcp6       0      0 :::53                   :::*                    LISTEN      384/dnsmasq
tcp6       0      0 :::22                   :::*                    LISTEN      379/sshd
tcp6       0      0 :::443                  :::*                    LISTEN      579/apache2

Wir erstellen entsprechende Verzeichnisse
copy console
mkdir -p /home/web/www/html/default-web.pi/{src,dist,zugang,ssl,nginx,apache,doku} mcedit /home/web/www/html/default-web.pi/apache/default-web.pi.conf
root@raspberrypi:~# cat /home/web/www/html/default-web.pi/apache/default-web.pi.conf
<VirtualHost *:9090>
    VirtualDocumentRoot /home/web/www/html/%0/dist/
    ServerName %0

    LogFormat "%V (Intranet host: %h) %{X-Forwarded-For}i %l %u %t \"%r\" %s %b" vcommon
     CustomLog /var/log/apache2/access.log vcommon

    <Directory "/home/web/www/html/*/dist">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
          Require all granted
    </Directory>
</VirtualHost>
copy console
echo "" | sudo tee /home/web/www/html/default-web.pi/dist/info.php
copy console
sudo apt install nginx
root@raspberrypi:~# sudo systemctl status  nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-09-13 10:33:45 BST; 11s ago
     Docs: man:nginx(8)
  Process: 3277 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 3279 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 3280 (nginx)
    Tasks: 5 (limit: 4915)
   Memory: 4.4M
   CGroup: /system.slice/nginx.service
           ├─3280 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─3281 nginx: worker process
           ├─3282 nginx: worker process
           ├─3283 nginx: worker process
           └─3284 nginx: worker process

Sep 13 10:33:45 raspberrypi systemd[1]: Starting A high performance web server and a reverse proxy server...
Sep 13 10:33:45 raspberrypi systemd[1]: Started A high performance web server and a reverse proxy server.
copy console
mcedit /etc/nginx/nginx.conf
root@raspberrypi:~# mcedit /etc/nginx/nginx.conf

root@raspberrypi:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@raspberrypi:~# sudo systemctl restart nginx.service
root@raspberrypi:~# cat /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
        ###################################
        ##### Unsere Conf Includieren #####
        ###################################

        include /home/web/www/html/*/nginx/*.conf;

}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
root@raspberrypi:~#
ok, es lassen sich Bereiche angeben
Internal (Private) Addresses
All internal addresses 10/8, 172.16/12, 192.168/16, 169.254/16 and 127/8 blocks (and IPv6 addresses outside of the public 2000::/3 block) 
are only evaluated by mod_remoteip when RemoteIPInternalProxy internal (intranet) proxies are registered.
Um den Proxy nutzen zu können verwenden wir mod_remoteip
root@raspberrypi:~# locate mod_remoteip
/usr/lib/apache2/modules/mod_remoteip.so
copy console
a2enmod remoteip systemctl restart apache2
copy console
mcedit /etc/apache2/conf-available/remoteip.conf
cat /etc/apache2/conf-available/remoteip.conf


RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 198.168.4.1/24

copy console
sudo systemctl reload apache2
 http://default-web.pi:8080/info.php

root@raspberrypi:~# mcedit /etc/apache2/apache2.conf

root@raspberrypi:~# apachectl -t
Syntax OK

root@raspberrypi:~# cat  /etc/apache2/apache2.conf
.......

#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

############## neu ############
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
......

Wir erstellen ein SSL Zertifikat Wir deaktivieren SSl vom Apache2
copy console
sudo a2dismod ssl systemctl restart apache2
cd /home/web/www/html/default-web.pi/ssl
mkcert default-web.pi 'default-web.pi'
root@raspberrypi:/home/web/www/html/default-web.pi/ssl# mkcert default-web.pi 'default-web.pi'
Using the local CA at "/root/.local/share/mkcert" ✨

Created a new certificate valid for the following names 📜
 - "default-web.pi"
 - "default-web.pi"

The certificate is at "./default-web.pi+1.pem" and the key at "./default-web.pi+1-key.pem" ✅
cd /home/web/www/html/default-web.pi/nginx/
root@raspberrypi:/home/web/www/html/default-web.pi/nginx# 

mcedit proxy_params.conf

cat  proxy_params.conf

proxy_set_header        Host               $host;
proxy_set_header        X-Real-IP          $remote_addr;
proxy_set_header        X-Forwarded-For    $proxy_add_x_forwarded_for;
#proxy_set_header        X-Forwarded-Host   $host:443;
proxy_set_header        X-Forwarded-Server $host;
proxy_set_header        X-Forwarded-Port   443;
proxy_set_header        X-Forwarded-Proto  https;

client_max_body_size 100M;
client_body_buffer_size 1m;
proxy_intercept_errors on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 256 16k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 0;
proxy_read_timeout 300;
root@raspberrypi:/home/web/www/html/default-web.pi/nginx# cat server.conf
map $http_origin $cors_origin_header
{
        default "";
        "~(^|^http:\/\/)(localhost$|localhost:[0-9]{1,4}$)" "$http_origin";
        # "~^https://test-.-dev.example.pl$" "$http_origin";
        # https: //test-7-dev.example.pl
        "https://default-web.pi" "$http_origin";
}

map $http_origin $cors_cred
{
        default "";
        "~(^|^http:\/\/)(localhost$|localhost:[0-9]{1,4}$)" "true";
        # "~^https://test-.-dev.example.pl$" "true";
        # https: //test-7-dev.example.pl
        "https://default-web.pi" "true";
}

server
{
        listen 80;
        listen 443 ssl http2;

        server_name ~^(www\.)?(?<domain>.+)$;

        error_log /home/web/www/html/default-web.pi/nginx/error.log debug;
        access_log /home/web/www/html/default-web.pi/nginx/error.log combined;

        root /home/web/www/html/$domain/dist;

        index index.php index.htm index.html;


        ssl_certificate /home/web/www/html/default-web.pi/ssl/default-web.pi+1.pem;
        ssl_certificate_key /home/web/www/html/default-web.pi/ssl/default-web.pi+1-key.pem;
        ssl_protocols       SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:MEDIUM:!aNULL:!MD5;

        add_header Access-Control-Allow-Origin $cors_origin_header always;
        add_header Access-Control-Allow-Credentials $cors_cred;
        add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
        add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";


        if ($request_method = 'OPTIONS')
        {
                return 204 no-content;
        }

        location /
        {
			try_files $uri @proxy;
        }
		
        location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$
        {
                
				expires 30d;
        }
		
        location @proxy
        {
                proxy_pass http://192.168.4.2:9090; 
				include /etc/nginx/proxy_params;
        }

        location ~* \.php$
        {
                proxy_pass http://192.168.4.2:9090; 
				include /etc/nginx/proxy_params;
        }

        location ~ /\.ht
        {
                deny all;
        }
}


root@raspberrypi:/home/web/www/html/default-web.pi/nginx#  nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Wir aktivieren uns den nginx.service für das Hochfahren
copy console
systemctl enable nginx.service
root@raspberrypi:~# systemctl enable nginx.service
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
root@raspberrypi:/home/web/www/html/default-web.pi/nginx# curl -v --http2 https://default-web.pi
* Expire in 0 ms for 6 (transfer 0xe587c0)
* Expire in 1 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 1 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 1 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 2 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 2 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 2 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 2 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 2 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
* Expire in 0 ms for 1 (transfer 0xe587c0)
*   Trying 192.168.4.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0xe587c0)
* Connected to default-web.pi (192.168.4.2) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: O=mkcert development certificate; OU=root@raspberrypi
*  start date: Jun  1 00:00:00 2019 GMT
*  expire date: Sep 13 11:44:18 2029 GMT
*  subjectAltName: host "default-web.pi" matched cert's "default-web.pi"
*  issuer: O=mkcert development CA; OU=root@raspberrypi; CN=mkcert root@raspberrypi
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0xe587c0)
> GET / HTTP/2
> Host: default-web.pi
> User-Agent: curl/7.64.0
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200
< date: Mon, 16 Sep 2019 12:26:49 GMT
< content-type: text/html; charset=UTF-8
< content-length: 2039
< server: Apache/2.4.38 (Raspbian)
< vary: Accept-Encoding
< x-test-header: proxy
<


    
        
		........

Wir bauen uns unseren nginx zusammen ;o)

copy console
systemctl stop nginx apt-get remove nginx
apt-get remove nginx Entfernen des Pakets "nginx" bei gleichzeitiger Erhaltung seiner Konfigurationsdateien
Install nginx (1.16.1) mit add-dynamic-module

Alle von mir getesteten Build-Methoden add-dynamic-module *.so (njs , ngx_brotli usw.) zu erzeugen schlugen fehl... Der einzige Weg ist NGINX neu aufzusetzen.


	adduser --system --disabled-password --home /var/cache/nginx --shell /sbin/nologin --group nginx \
    
	apt-get update \
    && apt-get install -y \
        inotify-tools \
        curl \
        libyajl-dev \
        libgeoip-dev \
        dh-autoreconf \
        libcurl4-gnutls-dev \
        git \
        wget \
        build-essential \
        libpcre3 \
        libpcre3-dev \
        libssl-dev \
        libtool \
        autoconf \
        libxml2-dev \
        zlib1g-dev \
        libperl-dev \
 
    mkdir -p \
        /var/log/nginx \
        /var/cache/nginx \

    cd /usr/src \
    curl -L https://nginx.org/download/nginx-1.16.1.tar.gz | tar xz \
    cd /usr/src/nginx-1.16.1 \
	
    git clone https://github.com/nginx/njs.git \
    git clone https://github.com/google/ngx_brotli.git \
    cd ngx_brotli \
    git submodule update --init \	
	
	cd /usr/src/nginx-1.16.1 \
     ./configure \
        --prefix=/etc/nginx \
        --sbin-path=/usr/sbin/nginx \
        --modules-path=/usr/lib/nginx/modules \
        --add-dynamic-module=/usr/src/nginx-1.16.1/ngx_brotli \
        --add-dynamic-module=/usr/src/nginx-1.16.1/njs/nginx \
        --conf-path=/etc/nginx/nginx.conf \
        --error-log-path=/var/log/nginx/error.log \
        --http-log-path=/var/log/nginx/access.log \
        --pid-path=/var/run/nginx.pid \
        --lock-path=/var/run/nginx.lock \
        --http-client-body-temp-path=/var/cache/nginx/client_temp \
        --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
        --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
        --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
        --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
        --user=nginx \
        --group=nginx \
        --with-compat \
        --with-file-aio \
        --with-threads \
        --with-http_addition_module \
        --with-http_auth_request_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_mp4_module \
        --with-http_perl_module=dynamic \
        --with-http_random_index_module \
        --with-http_realip_module \
        --with-http_secure_link_module \
        --with-http_slice_module \
        --with-http_ssl_module \
        --with-http_stub_status_module \
        --with-http_sub_module \
        --with-http_v2_module \
        --with-mail \
        --with-mail_ssl_module \
        --with-stream \
        --with-stream_realip_module \
        --with-stream_ssl_module \
        --with-stream_ssl_preread_module \
        --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' \
        --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' \
    && make \
    && make install
	
	
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules	

Delete all File !	
mc /etc/nginx/modules-enabled/
	
root@raspberrypi:/etc/nginx/modules# sudo nginx -V
nginx version: nginx/1.16.1
built by gcc 8.3.0 (Raspbian 8.3.0-6+rpi1)
built with OpenSSL 1.1.1c  28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules 
--add-dynamic-module=/usr/src/nginx-1.16.1/ngx_brotli --add-dynamic-module=/usr/src/nginx-1.16.1/njs/nginx 
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log 
--pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp 
--user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module 
--with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module 
--with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module 
--with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module 
--with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module 
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' 
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
Dies und das
# Nginx
alias nginx-start="sudo systemctl start nginx"
alias nginx-stop="sudo systemctl stop nginx"
alias nginx-restart="sudo systemctl restart nginx"
alias nginx-status="systemctl status nginx"
alias nginx-reload="sudo kill -HUP `cat /var/run/nginx.pid`"
alias nginx-vim-default="sudo vim /etc/nginx/sites-available/default"
alias nginx-vim-nginx.conf="sudo vim /etc/nginx/nginx.conf"
alias nginx-tail-error.log="sudo tail -f -n200 /var/log/nginx/error.log"
alias nginx-tail-access.log="sudo tail -f -n200 /var/log/nginx/access.log"
alias nginx-cd-nginx.conf="cd /etc/nginx/"
alias nginx-verify-config="sudo nginx -t"

noch ein Paar Quellen 

# https://github.com/rryqszq4/ngx_php7
# http://www.raspberryconnect.com/raspbian-packages/49-raspbian-aptget
# https://hub.docker.com/r/centerforopenscience/nginx/dockerfile/
# https://github.com/freemember007/njs-demo
# https://github.com/astefanutti/kubebox/blob/master/docs/Dockerfile

Step 13.) Iptables - Firewall

  • Pi bekommt eine Iptables-Firewall
Bevor ich weiter mache ein paar Überlegungen:



Der PI bekommt eine Wlan-Iptables-Firewall. SSH Server Login ist nur über verbundene virtuelle Wlan-Schnittstelle möglich, Geräte müssen sich im IP Bereich 192.168.4.130 - 255 befinden. Der SSH Zugang wird auf die IP 192.168.4.1 (IP4) beschränkt. Offene Ports 21,22,53,443,80 (Apache & SSH) werden für die Schnittstelle wlan0 und eth0 über Iptables "dicht gemacht". Es wird versucht Scans zu unterbinden.

IP 4 erzwingen mcedit /etc/sysctl.d/99-sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

starten und überprüfen
sudo sysctl -p
ifconfig | grep inet6
SSH Dicht machen
mcedit /etc/hosts.allow
# Erlaube SSH Verbindungen (IP)
sshd : 192.168.4.128/25
sshd : 127.0.0.1
sshd : [::1]
mcedit /etc/hosts.deny
# Alle SSH Verbindungen die nicht in der hosts.allow erlaubt sind ablehnen und Logfile schreiben.
sshd: ALL \
: spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log \
: deny
SSH Nur von einer IP
mcedit /etc/ssh/sshd_config

ListenAddress 192.168.4.1
sudo service sshd restart
copy console
apt-get install iptables-persistent
# Port 22 nur vom virtuellen Wlan 
iptables -A INPUT -p tcp --dport 22 --source 192.168.4.128/25 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

#ausgehende Netzwerk-Traffic wird zugelassen, aber der gesamte TCP/IP-Traffic von außen einfach ignoriert.
iptables -A INPUT -i wlan0 -p tcp -m multiport --destination-port 21,22,53,443,80 -j DROP
iptables -A INPUT -i eth0 -p tcp -m multiport --destination-port 21,22,53,443,80 -j DROP

# PORTSCAN
iptables -N PORTSCAN
iptables -A PORTSCAN -j LOG --log-prefix "PORTSCAN detected -- "
iptables -A PORTSCAN -j DROP

#ungültigen Flagkombinationen aussortieren.

#SYN + RST
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j PORTSCAN

#SYN + FIN
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j PORTSCAN

#FIN + URG + PSH
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j PORTSCAN

#ALL
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j PORTSCAN

#nmap Null scan
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j PORTSCAN

#nmap FIN stealth scan
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags ALL FIN -j PORTSCAN

#XMAS
iptables -A INPUT -p tcp --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN \
        -j PORTSCAN
iptables -A FORWARD -p tcp --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN \
        -j PORTSCAN
netfilter-persistent save
iptables-save > /etc/iptables/rules.v4
vom wlan zugriff gewähren 
IP 192.168.4.130 - 255


  192.168.4.130/32  	  192.168.4.130 - 192.168.4.130  	  255.255.255.255  	  1  
  192.168.4.130/31  	  192.168.4.130 - 192.168.4.131  	  255.255.255.254  	  2  
  192.168.4.128/30  	  192.168.4.128 - 192.168.4.131  	  255.255.255.252  	  4  
  192.168.4.128/29  	  192.168.4.128 - 192.168.4.135  	  255.255.255.248  	  8  
  192.168.4.128/28  	  192.168.4.128 - 192.168.4.143  	  255.255.255.240  	  16  
  192.168.4.128/27  	  192.168.4.128 - 192.168.4.159  	  255.255.255.224  	  32  
  192.168.4.128/26  	  192.168.4.128 - 192.168.4.191  	  255.255.255.192  	  64  
 -> 192.168.4.128/25  	  192.168.4.128 - 192.168.4.255  	  255.255.255.128  	  128  

      Network = 192.168.4.128/25
   Usable IPs = 192.168.4.129
             to 192.168.4.254 for 126
    Broadcast = 192.168.4.255
      Netmask = 255.255.255.128
Wildcard Mask = 0.0.0.127

Step 14.) USB Laufwerk dauerhaft einbinden

  • Pi bekommt ein USB Laufwerk
Bevor ich weiter mache ein paar Überlegungen:

Wir befinden uns im produktiven Bereich

Der PI bekommt ein USB Laufwerk für die Datensicherheit meiner Anwendungen.

Als erstes legen wir uns einen mountpunkt an und vergeben die Rechte
copy console
sudo mkdir -p /mnt/usb/shares chown web:web /mnt/usb/shares chmod 755 /mnt/usb/shares
copy console
sudo apt-get -y install hfsutils hfsprogs exfat-fuse ntfs-3g
Speichermedium ermittelt
root@raspberrypi:~# sudo blkid -o list -w /dev/null
device     fs_type label    mount point    UUID
-------------------------------------------------------------------------------
/dev/mmcblk0p1
           vfat    boot     /boot          F661-303B
/dev/mmcblk0p2
           ext4    rootfs   /              8d008fde-f12a-47f7-8519-197ea707d3d4
/dev/sda1  vfat             (not mounted)  CF42-89E6
/dev/mmcblk0
                            (in use)
mcedit /etc/fstab
###################################
###### USB einbinden FAT 32 #######
UUID=CF42-89E6 /mnt/usb/shares/ vfat utf8,uid=web,gid=web,noatime 0
reload mount
copy console
mount -av
copy console
mkdir -p /mnt/usb/shares/{usb_dump_www,usb_dump_db,usb_drive}
jetzt noch samba usb einrichten mcedit /etc/samba/smb.conf
[usb-pi]
comment = usb-pi
path = /mnt/usb/shares/usb_drive
browsable =yes
writable = yes
guest ok = yes
read only = no
force user = web

[database-pi]
comment = usb-pi
path = /mnt/usb/shares/usb_drive
browsable =yes
writable = no
guest ok = yes
read only = yes
force user = web


Rechte prüfen
root@raspberrypi:/mnt/usb/shares# ls -l
total 8544
drwxr-xr-x 2 web web   32768 Jul 14  2017 SanDiskSecureAccess
-rwxr-xr-x 1 web web 8600360 Nov  4  2016 SanDiskSecureAccessV3.01_win.exe
drwxr-xr-x 3 web web   32768 Nov 28 10:22 usb_drive
drwxr-xr-x 2 web web   32768 Nov 28 10:13 usb_dump_db
drwxr-xr-x 2 web web   32768 Nov 28 10:13 usb_dump_www
mcedit /home/pi/rsync_script.sh
root@raspberrypi:/var/lib/mysql# cat /home/pi/rsync_script.sh
#!/bin/bash
# RSYNC Script macht ein Backup vom Webverzeichnis / Datenbanken 	
# chmod +x rsync_script.sh / Rechte 
#
#
#	* * * * * auszuführender Befehl
#	┬ ┬ ┬ ┬ ┬
#	│ │ │ │ │
#	│ │ │ │ └──── Wochentag (0-7) (Sonntag =0 oder =7)
#	│ │ │ └────── Monat (1-12)
#	│ │ └──────── Tag (1-31)
#	│ └────────── Stunde (0-23)
#	└──────────── Minute (0-59)
# 	*/5 * * * *  = alle 5 minuten 

# Quelle

SOURCES_WWW="/var/www/"
SOURCES_DATABASE="/var/lib/mysql/"

# Ziel  ls -F /var/lib/mysql/  | grep / | sed -e "s/\///g"


TARGET_WWW="/mnt/usb/shares/usb_dump_www"
TARGET_DATABASE="/mnt/usb/shares/usb_dump_db"
TARGET_USB="/mnt/usb/shares"

RSYNC=`which rsync`




if [[ $(findmnt -M "$TARGET_USB") ]]; then
	echo "USB-Laufwerk gefunden ..."
	# LOOK 
	if [ -e /mnt/rsyncjob.lock ]
	then
	  echo "Rsync schon aktiv ..."
	  exit
	fi

	touch /mnt/rsyncjob.lock

	# Delete LOOK

	trap 'rm /mnt/rsyncjob.lock' EXIT

	# Und los gehts 

	ls -F $SOURCES_DATABASE | grep / | sed -e "s/\///g" | egrep -v "^(performance_schema|phpmyadmin|mysql|sys)$" | xargs -I {} -P 5 -n 1 $RSYNC -rav --delete --progress --no-o --no-g --inplace --no-whole-file $SOURCES_DATABASE{} $TARGET_DATABASE 
	ls -F $SOURCES_WWW | grep / | sed -e "s/\///g"| egrep -v "^(_noooooo_)$" | xargs -I {} -P 5 -n 1 $RSYNC -rav --delete --progress --no-o --no-g --inplace --no-whole-file $SOURCES_WWW{} $TARGET_WWW
else
    echo "USB-Laufwerk nicht gefunden!"
fi

exit 0
copy console
cd /mnt/ chmod +x rsync_script.sh ./rsync_script.sh

das muss rein (alle 30 Minuten wird auf dem USB-Stick gesichert!)
sudo crontab -e
*/30 * * * *  root    /home/pi/rsync_script.sh > /dev/null 2>&1

copy console
reboot top

Diese Webseite wird ausschließlich zu privaten Zwecken betrieben!
The website content is licensed MIT.

Bulma v0.7.5
build December 01 2019 11:19:17
gulp 4.0.2
@babel/core 7.5.5