====== Netzwerkkonfiguration ======
===== Netplan =====
Quelle [[https://netplan.io/examples]]
- Netzwerkkonfiguration schreiben (siehe unten)
- Konfiguration aktivieren netplan apply
''/etc/netplan/50-cloud-init.yaml''
* DHCP network:
ethernets:
enp2s0:
dhcp4: true
version: 2
* Statische IP network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 10.10.10.2/24
dhcp4: no
gateway4: 10.10.10.1
nameservers:
addresses: [10.10.10.1,1.1.1.1]
search:
- mydomain
- otherdomain
* Netzwerkrouten network:
version: 2
renderer: networkd
ethernets:
enp3s0:
...
...
routes:
- to: 0.0.0.0/0
via: 9.0.0.1
metric: 100
- to: 0.0.0.0/0
via: 10.0.0.1
metric: 100
- to: 0.0.0.0/0
via: 11.0.0.1
metric: 100
* Bridges network:
version: 2
renderer: networkd
ethernets:
enp3s0:
...
...
bridges:
br0:
dhcp4: yes
interfaces:
- enp3s0
* VLAN network:
version: 2
renderer: networkd
ethernets:
mainif:
match:
macaddress: "de:ad:be:ef:ca:fe"
set-name: mainif
addresses: [ "10.3.0.5/23" ]
gateway4: 10.3.0.1
nameservers:
addresses: [ "8.8.8.8", "8.8.4.4" ]
search: [ example.com ]
vlans:
vlan15:
id: 15
link: mainif
addresses: [ "10.3.99.5/24" ]
vlan10:
id: 10
link: mainif
addresses: [ "10.3.98.5/24" ]
nameservers:
addresses: [ "127.0.0.1" ]
search: [ domain1.example.com, domain2.example.com ]
* WLAN network:
version: 2
renderer: networkd
wifis:
wlp2s0b1:
dhcp4: no
dhcp6: no
addresses: [192.168.0.21/24]
gateway4: 192.168.0.1
nameservers:
addresses: [192.168.0.1, 8.8.8.8]
access-points:
"network_ssid_name":
password: "**********"
===== per Befehl "ip" =====
Nützeliche Befehle:
* IP Adresse setzen/löschen ip a [add|del] dev
* Netzwerkkarte ein-/ausschalten ip link set [up|down]
* Netzwerkrouten anzeigen ip route show
* Stadardgateway setzen ip route [add|dell] default via
* Netzwerkroute setzen/löschen ip route [add|dell] via dev
===== Interfaces =====
Die Datei ''/etc/network/interfaces'' beschreibt die Netzwerkkonfiguration des Linux Systems.
Hier ein Beispiel:
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth1
#iface eth1 inet dhcp
iface eth1 inet static
address
netmask
broadcast
gateway
dns-nameservers
dns-search
# emergency fallback addresses
# post-up ip addr add dev eth0
# pre-down ip addr del dev eth0
auto eth0
iface eth0 inet manual
iface wlan0 inet static
#Bridge
auto br0
iface br0 inet static
# gateway
bridge_ports eth1 wlan0
bridge_fd 5
bridge_stp no # unter Umständen auf 'yes' setzen - s.u.
address
netmask
auto wlan0_1_rename
iface wlan0_1_rename inet static
address
netmask
broadcast
# Kommando vor Netzwerkarteneinstellungen ausführen
pre-up
# Kommando starten
up
# Kommando nach Netzwerkkarteneinstellungen ausführen
post-up
#DSL-Einwahl
auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth0 up # line maintained by pppoeconf
provider dsl-provider
# DynDNS Client starten
up /etc/init.d/ddclient restart
===== Netzwerk neustarten =====
sudo systemctl restart network
===== DNS registrieren =====
Ein Linux Client registriert sich beim Booten an dem, in der Netzwerkkonfiguration angegebenen, DNS-Server.
Wenn dies ein lokaler DNS-Server ist (z. B. Router) dann wird die Registrierung angenommen.
An diesem Beispiel sieht man, wie sich ein Linux-Client an einem DNS-Server erneut registrieren kann:
nsupdate
update delete .. A
update add .. 86400 A
send
In der Datei ''/etc/dhcp/dhclient.conf'' kann man auch folgende Einstellungen eintragen um den o.g. Prozess zu automatisieren und z.B. so einen Active Directory DNS Server aktuell halten.
send fqdn.fqdn "";
send fqdn.encoded on;
send fqdn.server-update on;
Nachdem das gespeichert wurde, kann man sich so eine neue IP holen und nachsehen ob der DNS-Server aktualisiert wurde.
sudo dhclient -r
sudo dhclient
==== IP Adresse ausgeben und DNS Eintrag aktualisieren ====
Hier eine Alternative zum o.g. Verfahren über die ''dhclient.conf''.
Man kann das u.a. Script z.B. in der Datei ''/etc/cron.daily/nsupdate'' hinterlegen, so dass es tgl. ausgeführt wird.
#!/bin/bash
DNSSVR=$(dig +noall +answer +short $(dig +noall +answer +short . ns | head -1))
DEV=$(ip route get ${DNSSVR}|awk 'BEGIN{FS="dev *"}{sub(/ .*/,"",$2);print $2}')
IPCIDR=$(ip a show dev ${DEV}|grep -w 'inet'|awk '{print $2}')
IP=$(echo "${IPCIDR}"|cut -d '/' -f1)
echo -e "server ${DNSSVR}\n update add $(hostname -f) 86130 A ${IP} \nsend\n" | nsupdate -v
===== DNS flush =====
Zuerst alles Caches vom Resolver leeren (gibt keine Ausgaben auf der Konsole).
* ab Ubunbu 22.04 resolvectl flush-caches
* bis Ubuntu 20.04 systemd-resolve --flush-caches
Danach kann man sich die Statistiken anzeigen lassen und sehen, dass alles genullt wurde.
* ab Ubunbu 22.04 resolvectl statistics
* bis Ubuntu 20.04 systemd-resolve --statistics
Die Anzeige auf diese ankommt ist Current Cache Size: 0
===== Networkteaming / -bonding =====
Quelle: [[https://wiki.ubuntuusers.de/Netzwerkkarten_b%C3%BCndeln/]]
Um eine Ausfallsicherheit bzw. Bandbreitenerhöhung herzustellen, kann man mehrere Netzwerkschnittstellen zu einer zusammenfassen.
Dies kann mit dem Programm ''ifenslave'' gemacht werden.
apt-get install ifenslave
==== Vorbereitung ====
Nachdem man sicher ist, dass der Kernel Bonding kann
find /lib/modules/`uname -r` -iname bonding*
schaut man, ob es Netzwerkkarten gibt die sich dafür eignen (diese müssen angeschlossen und in Betrieb sein, sprich eine IP haben und erreichbar sein)
mii-tool
ACHTUNG: diese Programm schaut standardmäßig nach "eth#" Devices!
==== Bonding ====
Zunächst schaltet man die Netzwerkkarten ab, welche zusammengefasst werden sollen.
ifdown enp1s0
ifdown enp1s0
...
Nun konfiguriert man das Bonding in der ''/etc/network/interfaces''
#eth0 is manually configured, and slave to the "bond0" bonded NIC
auto eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0
#eth1 ditto, thus creating a 2-link bond.
auto eth1
iface eth1 inet manual
bond-master bond0
auto bond0
iface bond0 inet static
address 10.0.0.10
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
gateway 10.0.0.1
dns-nameservers 10.0.0.1
bond-slaves eth0 eth1
bond-mode 0
bond-miimon 100
bond-updelay 200
bond-downdelay 200
* bond-slaves: Welche Schnittstellen diesem Bond zugehörig sind, "all", falls alle.
* bond-mode: 0 bis 6 oder Names des Modus, in dem der bonding-Treiber arbeiten soll.
* bond-miimon: Das bonding-Modul überprüft alle 100ms den Link-Status aller gebündelten Schnittstellen.
* bond-updelay: Wenn eine Schnittstelle als (wieder) aktiv erkannt wird, werden 200ms abgewartet, ehe der bonding-Treiber das interface wieder in den Verbund integriert, ansonsten sofort.
* bond-downdelay: Gibt es einen Übertragungsfehler oder Aussetzer, so betrachtet das bonding-Modul die Schnittstelle erst nach 200ms als verloren und entfernt diese aus dem bond, ansonsten sofort.
Nun lässt man das Bonding-Kernelmodul beim Booten automatisch laden. Dazu trägt man folgendes in die Datei ''/etc/modules'' ein:
bonding
Nach einem Reboot sollte es nur noch die eine Netzwerkkarte namens "bond0" geben, welche dann auch die o.g. Netzwerkadresse hat und damit erreichbar ist.
Ohne Reboot kann man den Bond wie gewohnt starten:
ifup bond0
ifdown bond0
==== Bonding Modi ====
Folgende Bonding Modi gibt es:
^ Modus ^ Bezeichnung ^ Zweck ^ Beschreibung ^
| 0 | balance-rr | Lastverteilung & Ausfallsicherheit | Die genutzte Netzwerkschnittstelle wird im Round-Robin-Verfahren festgelegt, das heißt die verfügbaren Schnittstellen werden in Senderichtung wechselweise genutzt. In Empfangsrichtung kann max. die Geschwindigkeit einer einzelnen Schnittstelle erreicht werden - je mehr Teilnehmer, umso mehr Upload-Gesamtbandbreite, denn diese werden auf die übrigen freien Schnittstellen aufgeteilt. |
| 1 | active-backup | Ausfallsicherheit | Nur eine Schnittstelle ist aktiv, im Fehlerfalle wird eine der anderen im Verbund genutzt. die Netzwerkkarten können über verschiedene Switches angebunden werden. |
| 2 | balance-xor | Lastverteilung & Ausfallsicherheit | Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen, die Zuordnung geschieht über den Modulo der Division zwischen der Formel (Quell-MAC-Adresse XOR Ziel-MAC-Adresse) und der Anzahl der Slave-Schnittstellen. |
| 3 | broadcast | Ausfallsicherheit | Daten werden auf allen Netzwerkschnittstellen gesendet. Die Nutzung mehrerer Switches ist möglich. |
| 4 | 802.3ad | Lastverteilung & Ausfallsicherheit | 802.3ad ist ein Standard der IEEE, der die Bündelung mehrerer Schnittstellen mit gleichen Übertragungseinstellungen (Geschwindigkeit und Duplex-Einstellungen) erlaubt, um eine höhere Bandbreite zu erhalten. Es kann nur ein Switch verwendet werden, dieser muss 802.3ad unterstützen. ethtool oder mii-tool wird benötigt. |
| 5 | balance-tlb | Lastverteilung | Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen. Das Verfahren hierzu ist jedoch komplexer und effizienter als bei balance-xor. Das Programm ethtool wird benötigt. |
| 6 | balance-alb | Lastverteilung | Erweitertes balance-tlb, zusätzlich zur MAC-basierten Zuordnung der Schnittstellen für ausgehende Verbindungen werden eingehende Verbindungen auf die Schnittstellen verteilt. Das Programm ethtool wird benötigt. |
===== VLAN =====
Voraussetzungen erfüllen
sudo apt-get install vlan
sudo modprobe 8021q
==== Temporär einrichten ====
Danach VLAN auf dem Interface konfigurieren
sudo vconfig add eth1 10
sudo ip addr add 10.0.0.1/24 dev eth1.10
sudo ip link set up eth1.10
==== Permanent einrichten ====
sudo su -c 'echo "8021q" >> /etc/modules'
nun in der ''/etc/network/interfaces'' folgendes eintragen:
auto eth1.10
iface eth1.10 inet static
...
vlan-raw-device eth1
===== Wake On LAN =====
Mit dem Wake on LAN (WOL) lässt sich ein PC über die Netzwerkkarte aufwecken.
Man konfiguriert einfach die WOL Einstellungen für das normale Wakeup mit Magic Paketen.
==== Netzwerkkarte vorbereiten ====
Mit dem Tool ''ethtool'' kann man WOL auf der Netzwerkkarte einschalten.
Der folgende Befehl fragt die Netzwerkkarte ab.
sudo ethtool
Hier achtet man auf die Zeile welche mit ''Wake-on: ...'' beginnt.
Steht hier der Parameter ''d'' ist WOL deaktiviert.
Mit dem Aktivieren der Funktion steht in der Zeile dann ein ''g''.
ethtool -s wol g
==== WOL dauerhaft einschalten ====
Leider übersteht die o.g. Einstellung den Neustart eines PCs nicht und schaltet sich immer wieder aus.
Per ''systemd'' kann man das nach jedem Neustart aktivieren (Quelle: [[https://wiki.ubuntuusers.de/Wake_on_LAN/]].
vi /etc/systemd/system/wol.service
Inhalt:
[Unit]
Description=Configure Wake-up on LAN
After=network-online.target
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s wol g
[Install]
WantedBy=basic.target
Danach noch den Service einschalten und den Systemd-Daemon neustarten.
sudo systemctl enable wol.service
sudo systemctl daemon-reload
==== WOL testen ====
Mit dem Befehl ''etherwake'' kann man Geräte aus dem Tiefschlaf aufwecken.
Das Tool muss vorher installiert werden.
sudo apt instal etherwake
Danach kann man ein Gerät aufwecken
sudo etherwake -i
==== Webserver installierten und einrichten ====
Mit der u.a. einfachen Webseite kann man das Wake On Lan steuern.
Hier ein Beispiel mit dem ''lighttpd'' Webserver.
apt-get install lighttpd
Nach der installation, das Modul "CGI" einschalten und Perl-Scripte aktivieren.
lighty-enable-mod cgi
vi /etc/lighttpd/lighttpd.conf
Die Zeile mit
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
wie folgt anpassen
static-file.exclude-extensions = ( ".fcgi" )
Ausserdem noch unten folgendes einfügen:
cgi.assign = ( ".pl" => "/usr/bin/perl",".cgi" => "/usr/bin/perl" )
Danach den Webserver neustarten
service lighttpd restart
==== Website erstellen ====
mkdir -p /var/www/wol /var/www/wol/cgi
vi /var/www/wol/index.php
Inhalt:
vi /var/www/wol/cgi/wakeup.pl
Inhalt:
#!/usr/bin/perl -w
use Socket;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');
print $cgi->header(-type =>'text/html'),
$cgi->start_html('Wakeup'),
$cgi->h1('Wakeup'),
wake($cgi->param('HWaddress'),$cgi->param('IPaddress'),$cgi->param('Port')),
$cgi->end_html();
sub wake
{
my $hwaddr = shift;
my $ipaddr = shift || '255.255.255.255';
my $port = shift || getservbyname('discard', 'udp');
my ($raddr, $them, $proto);
my ($hwaddr_re, $pkt);
# Validate hardware address (ethernet address)
$hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6);
if ($hwaddr !~ m/^$hwaddr_re$/) {
return $cgi->p({-style => 'color:red'}, "Invalid hardware address: $hwaddr" );
}
# Generate magic sequence
foreach (split /:/, $hwaddr) {
$pkt .= chr(hex($_));
}
$pkt = chr(0xFF) x 6 . $pkt x 16;
# Allocate socket and send packet
$raddr = gethostbyname($ipaddr);
$them = pack_sockaddr_in($port, $raddr);
$proto = getprotobyname('udp');
if(!socket(S, AF_INET, SOCK_DGRAM, $proto)) {
return $cgi->p({-style => 'color:red'}, "socket : $!");
}
if(!setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)) {
return $cgi->p({-style => 'color:red'}, "setsockopt : $!" );
}
if(!send(S, $pkt, 0, $them)) {
return $cgi->p({-style => 'color:red'}, "send : $!");
}
close S;
return $cgi->p("Sending magic packet to $ipaddr:$port with $hwaddr.
< Zurück");
}
Danach das Perl-Script ausführbar machen mit
chmod a+x /var/www/wol/cgi/wakeup.pl
==== Website testen ====
Nun kann man die Webseite öffnen [[http:///wol]]
Hier gibt man die benötigten Angaben ein und klickt auf absenden.
Man kann das "wakeup.pl" Script auch direkt öffnen hier ein Beispiel:
[[http:///wol/cgi/wakeup.pl?HWaddress=00:11:22:33:44:55:66&IPaddress=1.2.3.4&Port=9]]