#!/usr/bin/env bash # Diese oberste Zeile wird "Shebang" genannt und legt fest, # dass es sich bei dieser Datei um ein Shell-Skript (bash-Skript) # handelt. set -ex # Nur für Ingos Rechner nötig export PATH=$PATH:/usr/sbin:/usr/bin:/nix/store/3v58nb3cwghbi986nia32i4vrksn6ipl-busybox-1.36.1/bin:/nix/store/1ms9gpljbqqj0g421y8qdjyvaxxqx341-dnsmasq-2.91/bin:/nix/store/zfqc1nlhrpccfbl39lj5k0b2sd0lslbi-debootstrap-1.0.140_bpo12+1/bin # Host1 Host3 # | | # Switch --- RouterA --- Internet --- RouterB --- Switch # | | | # Host2 RouterC Host4 # | # Host5 --- Switch --- Host6 #### Mit Altlasten aufräumen killall -9 dnsmasq &>/dev/null || true sleep 1 ip netns del host1 &>/dev/null || true ip netns del host2 &>/dev/null || true ip netns del routerA &>/dev/null || true ip link del br0 &>/dev/null || true ip link del veth-host1 &>/dev/null || true ip link del veth-host1-p &>/dev/null || true ip link del veth-host2 &>/dev/null || true ip link del veth-host2-p &>/dev/null || true ip link del veth-routerA &>/dev/null || true ip link del veth-r &>/dev/null || true ip link del veth-g &>/dev/null || true for container_name in host1 host2 routerA; do ip netns del $container_name &>/dev/null || true done # Notiz an zukünftiges Ich: Auch alte Kabel entfernen #### Container erstellen # für Host1, Host2 und RouterA ip netns add host1 ip netns add host2 ip netns add routerA #### Switch erstellen modprobe bridge ip link add name br0 type bridge ip link set br0 up #### Kabel verlegen und aktivieren # Kabel erschaffen ip link add name veth-host1 type veth peer name veth-host1-p ip link add name veth-host2 type veth peer name veth-host2-p ip link add name veth-routerA type veth peer name veth-routerA-p # +---------------br0 # | veth-host1-p # | # | # | # |veth-host1 # +--------+ # | | # | | # +--------+ # host1 # Kabelenden in Switch einstecken und aktivieren ip link set veth-host1-p master br0 up ip link set veth-host2-p master br0 up ip link set veth-routerA-p master br0 up # Kabelenden in Container verschieben und aktivieren ip link set veth-host1 netns host1 up ip link set veth-host2 netns host2 up ip link set veth-routerA netns routerA up # Loopback-Geräte in den drei Containern aktivieren # (ohne aktiviertes Loopback-Gerät können sich die # Container nicht selbst anpingen) ip -n host1 link set lo up ip -n host2 link set lo up ip -n routerA link set lo up #### RouterA eine IP-Adresse zuweisen ip -n routerA addr add 10.0.47.1/24 dev veth-routerA # Zwei Merkregeln zur Festsetzung von IP-Adressen: # 1. Man sollte keine IP-Adressen verwenden, # die anderen Menschen oder Organisationen # zugeteilt sind. Um auf Nummer sicher zu gehen, # am besten einen der drei für private Nutzung # vorgesehenen Adressbereiche verwenden: # - 10.0.0.0 bis 10.255.255.255 # - 192.168.0.0 bis 192.168.255.255 # - 172.16.0.0 bis 172.31.255.255 # 2. Wenn sich zwei Rechner im selben LAN befinden # (weil sie direkt oder über einen Switch # miteinander verkabelt sind), dann sollten # sie auch IP-Adressen aus demselben # Adressbereich erhalten. # Beispiel: RouterA, Host1 und Host2 sind # im selben LAN, sollten daher alle IP-Adressen # der Form 10.0.47.x erhalten. # Umgekehrt: Wenn zwei Rechner nicht im selben # LAN sind, dann sollten sie auch nicht IP-Adressen # aus demselben Adressbereich erhalten. # Beispiel: Host1 von Denise und Host1 von Lui # befinden sich nicht im selben LAN. Sollten # daher Adressen aus verschiedenen Adressbereichen # erhalten, z.B. Denise-Host1 10.0.20.101 und # Lui-Host1 10.0.70.101. #### Auf RouterA die DHCP-Server-App starten ip netns exec routerA dnsmasq -C /dev/null -d -i veth-routerA -p0 -K --dhcp-range=10.0.47.100,10.0.47.200 & # ip netns exec routerA: Innerhalb von RouterA ausführen... # dnsmasq: App, die drei Funktionen in einer anbietet (DNS-Server, DHCP-Server, TFTP-Server) # -p0: DNS-Server-Funktionalität abschalten # -C /dev/null: Die leere Pseudodatei /dev/null als Konfigurationsdatei verwenden # -i veth-routerA: Auf dem Netzwerkgerät veth-routerA auf DHCP-Anfragen lauschen # --dhcp-range=X,Y: IP-Adressen aus dem Bereich zwischen X und Y vergeben # -d: dnsmasq im Vordergrund belassen # -K: Autoritativen Modus aktivieren (so verlässt sich dnsmasq auf seine eigene Buchführung, was die vergebenen IP-Adressen angeht) # &: Befehl im Hintergrund ausführen #### Bei Host1 und Host2 automatisch per DHCP die IP-Adressen beziehen # Auf Ubuntu: ip netns exec host1 dhcpcd -f /dev/null -1 veth-host1 ip netns exec host2 dhcpcd -f /dev/null -1 veth-host2 # Auf NixOS (nur für Ingo): ip netns exec host1 busybox udhcpc -i veth-host1 ip netns exec host2 busybox udhcpc -i veth-host2 #### RouterA in Routing-Modus schalten ip netns exec routerA bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward" #### Verbindung zwischen RouterA und Gastgebersystem schaffen # (damit RouterA ins Internet kommen kann) ip link add name veth-r type veth peer name veth-g ip link set veth-r netns routerA up ip link set veth-g up ip -n routerA addr add 172.16.0.2/24 dev veth-r ip addr add 172.16.0.1/24 dev veth-g ip -n routerA route add default via 172.16.0.1 # Gastgebersystem in Routing-Modus schalten echo 1 > /proc/sys/net/ipv4/ip_forward # ... und zwar in der Variante, dass der Gastgeber vor dem # Weiterleiten von Paketen seine eigene IP-Adresse als # Absenderadresse einsetzt (NAT), damit der echte WLAN-Router # nicht von Paketen aus dem ihr unbekannten Netzwerk # 172.16.0.x oder 10.0.47.x verwirrt ist iptables -t nat -A POSTROUTING -j MASQUERADE -o wlan0 #### VPN einrichten if ! [ -e /var/lib/machines/debian ]; then debootstrap --include=systemd,dbus stable /var/lib/machines/debian systemd-nspawn -D /var/lib/machines/debian -E PATH=$PATH -- bash -c " apt install -y wireguard " fi rm -rf /var/lib/machines/routerA cp --reflink=auto -a /var/lib/machines/debian /var/lib/machines/routerA echo routerA > /var/lib/machines/routerA/etc/hostname systemd-nspawn -D /var/lib/machines/routerA -E PATH=$PATH -- bash -c " cd /etc/wireguard wg genkey | tee privatekey | wg pubkey > publickey systemctl enable wg-quick@wg0 echo root:abc | chpasswd " cat >/var/lib/machines/routerA/etc/wireguard/wg0.conf <