Grundlagen

Siehe auch

Begriffe

  • Switches: L2

  • Router: L3

  • Tx = Transmit (Senden, aus Sicht des Servers)

  • Rx = Receive (aus Sicht des Servers)

  • 10.80.32.123:22 bedeutet „10.80.32.123, Port 22“

  • 10.80.32.123/22 bedeutet „10.80.32.123, mit Netzwerk-Präfix 22“

  • Jumbo-Frames dürfen nur auf Interfaces aktiv sein, die nicht geroutet werden, da die Default Routing Size bei 1500 liegt.

  • ping pingt standardmässig mit 56 Bytes Nutzdaten; 28 Bytes Headerdaten (IP/ICMP) kommen in jedem Fall hinzu, ergibt 84 Byte Grösse. ping -s 16384 testet, ob ein Host über Jumbo-Frames erreichbar ist (auch hier kommen noch 28 Byte Headerdaten hinzu).

Performance

Die theoretische, maximale Übertragungsrate in einem kabelgebundenen 1 Gbps-Netzwerk liegt bei rund 120 MByte/s. Eine 1 GB grosse Datei wäre so in ca. 9 Sekunden übertragen.

Faustregel (realistisch, und obendrein einfacher zum Rechnen):

  • 100 Mbit/s Netzwerk = max. 10 MB/s Übertragungsrate

  • 1 Gbps/s Netzwerk = max. 100 MB/s Übertragungsrate

  • 10 Gbps/s Netzwerk = max. 1 GB/s Übertragungsrate

Netmask Cheat Sheet

Umrechnung der Netzmaske und Präfixe in Adressen:

PREFIX

MASK

#Hosts

#Adresses

/32

255.255.255.255

1

1

/30

255.255.255.252

2

4

/29

255.255.255.248

6

8

/28

255.255.255.240

14

16

/27

255.255.255.224

30

32

/26

255.255.255.192

62

64

/25

255.255.255.128

126

128

/24

255.255.255.0

254

256

/23

255.255.254.0

510

512

/22

255.255.252.0

1022

1024

/21

255.255.248.0

2046

2048

/20

255.255.240.0

4094

4096

/19

255.255.224.0

8190

8192

/18

255.255.192.0

16382

16384

/17

255.255.128.0

32766

32768

/16

255.255.0.0

65534

65536

Beispiel: 172.16.100.0/22 reicht von 172.16.100.1 bis 172.16.103.254 (Broadcast ist die 172.16.103.255)

Netzwerk in RHEL 7+

Seit RHEL 7 wird eine ganze Reihe an Netzwerk-Kommandos vereinheitlicht:

  • arp ist jetzt ip neighbor

  • ifconfig ist jetzt ip address (abgekürzt ip a)

  • route bzw. netstat -r ist jetzt ip route

  • netstat -a ist jetzt ss --all (Socket Statistics)

  • netstat -ntulp ist jetzt ss -ntulp

Bei Bedarf lassen sich die althergebrachten Tools wie netstat nachinstallieren:

dnf -y install net-tools

Predictable Network Interface Device Names

Netzwerkkarten heissen seit der Einführung von systemd v197 nicht mehr eth0, eth1 usw., sondern folgen einem erweiterten Benennungsschema. Ein Zwei-Zeichen-Präfix kennzeichnet den Interface-Typ:

  • en: ethernet

  • sl: serial line IP (slip)

  • wl: wlan

  • ww: wwan

gefolgt von einem Namenstyp:

  • o<index>: on-board device index number

  • s<slot>[f<function>][d<dev_port>]: hotplug slot index number

  • x<MAC>: MAC address

  • p<bus>s<slot>: Karte steckt geographisch gesehen im PCI- oder USB-Slot

Beispiele: eno1 ist eine Onboard PCI Ethernet-Karte mit Firmware-Index 1, ens33 ist eine Hotplug Ethernet-Karte aus Slot 33. Bei enp2s0 handelt es sich um eine Ethernet-Karte, deren physischer Aufenthaltsort der PCI-Bus 2 im Slot 0 ist. ens4f0 ist der erste Port („0“) auf einer PCI-Express Hotplug-Karte im Slot 4.

Der Gerätename darf maximal 15 Zeichen lang werden.

NetworkManager

In RHEL 7 ist der schon seit 2005 in Fedora verfügbare NetworkManager.service der Standard-Netzwerkdienst,der Netzwerk-Interfaces und -Verbindungen anhand von D-Bus-Nachrichten dynamisch aktiv schalten kann, sobald sie verfügbar werden. Es gibt eine ganze Reihe an grafischen Tools, die ein Frontend zum NetworkManager.service darstellen, wie nmtui, nmcli und nm-connection-editor. Der Network-Manager beherrscht:

  • Auto-Detect möglicher Netzwerkinformationen

  • Unterbrechungsfreies Umschalten zwischen Verbindungen

  • Rückmeldung des Netzwerk-Status an Benutzer und Applikationen

  • Ohne Kommandozeilen-Interaktion lauffähig

Für einen Laptop mit WLAN, wechselnden Standorten, VPN-Tunneln, dynamischen IP-Adressen und Hardware eine feine Sache. Im Server-Umfeld mit statischen Netzwerkadressen, Minimalkonfiguration etc. eher unnötig - und daher verzichtbar.

Die klassischen ifcfg-Dateien werden nach wie vor unterstützt. Der Service, der (schon immer) auf den ifcfg-Dateien aufgebaut hat, heisst network.service.

Beide Dienste sind (in der Theorie) unabhängig voneinander, sorgen aber nebeneinander für Verwirrung. Ich empfehle in einer produktiven Server-Umgebung die Deaktivierung des NetworkManager.service und die Arbeit mit network.service.

Darauf achten, dass die benötigten Netzwerkkarten in ihren /etc/sysconfig/network-scripts/ifcfg-*-Dateien die Einstellungen NM_CONTROLLED=no und ONBOOT=yes gesetzt haben.

Dann einmalig:

systemctl stop NetworkManager.service && \
systemctl disable NetworkManager.service && \
systemctl mask NetworkManager.service && \
systemctl reboot

Danach genügt wie gewohnt nach einer Netzwerkonfigurationsänderung - auch in einer SSH-Session - ein simples:

systemctl restart network.service

Um den Network Manager nur für eine spezifische Netzwerkkarte zu deaktivieren, genügt der Eintrag NM_CONTROLLED="no" in der jeweiligen /etc/sysconfig/network-scripts/ifcfg--Datei.

Hostname und hostid

Details zum Host ermitteln:

hostnamectl

Hostname setzen:

hostnamectl set-hostname srv.example.com

Nur für die aktuelle Session setzen (nicht empfohlen, kann bei einigen Skripten aber Wunder wirken):

hostname srv.example.com

/usr/bin/hostid aus dem coreutils-Package berechnet die Host-ID eines Linux-Systems anhand von dessen IP-Adresse (Beispiel 007f0100). Linux-Maschinen mit mehreren IP-Adressen verfügen daher auch über mehrere Host-IDs, die bei Abfrage in abwechselnder (unter RHEL 6 noch in zufälliger) Reihenfolge zurückgeliefert werden. Wer daher eine statische, global eindeutige System-ID abfragen möchte, verwendet besser die UUID des Systems:

dnf -y install dmidecode
dmidecode --string system-uuid

Netzwerkkarten konfigurieren

Die Geschmäcker sind verschieden: es gibt wie immer mehrere Möglichkeiten, den Netzwerk-Stack zu konfigurieren.

  • in GNOME: mit dem nm-connection-editor

  • Text User Interface (TUI) seit RHEL 7: nmtui

  • Bash Netzwerk-Management-Kommando seit RHEL 7: nmcli

  • direkt auf den Netzwerkdateien: /etc/sysconfig/network-scripts/ifcfg-*

Minimalste Konfiguration für eine Netzwerkkarte mit DHCP, aber ohne Network-Manager und ohne IPv6:

/etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=dhcp
DEVICE=ens32
HWADDR=...
IPV6INIT=no
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet

Minimale Netzwerkkonfiguration für eine Karte mit statischer IP-Adresse:

/etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=none
DEVICE=eth0
DNS1=192.168.109.2
DNS2=192.168.109.3
GATEWAY=192.168.109.253
HWADDR=...
IPADDR=192.168.109.74
IPV6INIT=no
NETMASK=255.255.255.0
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet

Bemerkung

UUID oder HWADDR (also MAC-Adresse)? UUID wird nur durch den NetworkManager verwendet, um NICs zu identifizieren.

Netzwerkkarte mit zwei statischen IPv4-Adressen :

/etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=none
DEVICE=eth0

DNS1=192.168.109.2
DNS2=9.9.9.9

IPADDR0=192.168.109.74
PREFIX0=24
GATEWAY0=192.168.109.254

IPADDR1=192.168.123.45
PREFIX1=24
GATEWAY1=192.168.123.1

HWADDR=...
NAME=ens32
ONBOOT=yes
TYPE=Ethernet

IPv6 mit zwei statischen IPv6-Adressen:

/etc/sysconfig/network-scripts/ifcfg-ens32
IPV6INIT=yes
IPV6_AUTOCONF=no

IPV6ADDR=2001:db8:...
IPV6ADDR_SECONDARIES=2001:db8:...

IPV6_DEFAULTGW=2001:db8:...
DNS3=2001:db8:...
DNS4=2001:db8:...

Tipp

Ein Setup, bei der eine Maschine zwei Netzwerkkarten mit zwei verschiedenen IP-Adressen im gleichen Subnetz aufweist, ist definitiv nicht empfohlen.

Wurden Netzwerkeinstellungen in den Konfigurationsdateien geändert, müssen die betroffenen Netzwerkkarten neu gestartet werden:

cd /etc/sysconfig/network-scripts
ifdown ifcfg-ens32
ifup ifcfg-ens32

VLANs

So setzt man VLANs.

Auf Ebene Konfigurationsdatei besteht der Trick in der Benennung der Interfaces. Beispiel:

ifcfg-enp2s0
TYPE=Ethernet
BOOTPROTO=none
DEVICE=enp2s0
ONBOOT=yes
ifcfg-enp2s0.1000
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=enp2s0.1000
DEVICE=enp2s0.1000
ONBOOT=yes
IPADDR=...
PREFIX=...
GATEWAY=...
DNS1=...
DNS2=...
VLAN=yes

So geht es über die Kommandozeile (vorher NetworkManager stoppen):

# Configure VLAN ID 38
ip link add link enp0s31f6 name enp0s31f6.38 type vlan id 38
ip addr add 192.168.109.206/24 brd 192.168.109.255 dev enp0s31f6.38
ip link set dev enp0s31f6.38 up
ip --details link show enp0s31f6.38

# Remove VLAN
ip link set dev enp0s31f6.38 down
ip link delete enp0s31f6.38

Tools

IP-Adresse per DHCP erneuern:

dhclient

Wie schnell ist die Netzwerkkarte angebunden?

ethtool eno1

Welchen Treiber verwendet die Karte eno1?

ethtool --driver eno1

Netzwerkkarte auf Promiscuous Mode umstellen:

ip link set ens160 promisc on

Welche IP-Adressen sind gesetzt?

ip a

MTU auf 9000 (Jumbo Frames) setzen:

ip link set mtu 9000 dev ens6f0

TCP-Timestamps abschalten (wer Load Balancer etc. einsetzt, sollte darauf verzichten):

echo "net.ipv4.tcp_timestamps = 0" >> /etc/sysctl.conf
sysctl -p

netstat ist seit langem veraltet („deprecated“); ersetzt wird es durch ss (Socket Statistics). netstat liest seine Informationen aus dem virtuellen Dateisystem unter /proc aus, was es bei einer grossen Anzahl von Verbindungen langsam macht. ss zeigt mehr Informationen als netstat und arbeitet dabei auch noch schneller, da es seine Informationen direkt aus dem Kernel holt.

Alle Verbindungen auflisten:

ss | less

Nur TCP-Verbindungen anzeigen:

ss --tcp

Nur UDP-Verbindungen anzeigen (hier sollte man auch die lauschenden Prozesse einbeziehen, da UDP verbindungslos ist):

ss --udp --all

Host- und Servicenamen nicht auflösen:

ss --numeric

Zeige den Status aller TCP-Verbindungen:

ss --tcp --all --numeric

Zeige „listening“ TCP-Sockets:

ss --tcp --listening --numeric

Zeige auch die dabei involvierten Prozesse:

ss --tcp --listening --processes --numeric

Tipp

Wer in Echtzeit und „lesbar“ sehen möchte, wieviel über die Netzwerk-Interfaces gesendet und empfangen wird, kann sich das Tool iftop aus dem EPEL-Repository installieren:

dnf -y install iftop
iftop

Outbound-Proxy setzen

export HTTP_PROXY=http://username:password@proxyhost:proxyport
export HTTPS_PROXY=http://username:password@proxyhost:proxyport
export RSYNC_PROXY=username:password@proxyhost:proxyport

Falls man nicht unter root arbeitet:

sudo --shell
export ...

Falls die Einstellungen einen Reboot überleben sollen:

  • Systemweit: Ablage in /etc/profile.d/proxy.sh

  • Nur für Benutzer mit einem Shell-Login: /etc/profile.d/proxy.sh

  • Nur für ausgewählte Benutzer: nano ~/.bash_profile

Tracing / Tracking / Sniffing / Diagnose

httpry

HTTP-Verkehr spyen:

dnf -y install httpry
httpry -i any 'tcp port 80 or 8080'

Http-Trace mit Logfile:

httpry -i any ‚tcp port 80 or 8080 or 3128‘ -o /tmp/logfile -b /tmp/capture.pcap

Wer den Source Code von https://dumpsterventures.com/jason/httpry/ herunterlädt, findet im „scripts“-Ordner noch ein paar nützliche Perl-SKripte:

cd scripts
perl parse_log.pl -d ./plugins /tmp/logfile

tcpdump

Packet Sniffer installieren:

dnf -y install tcpdump

Lesen eines pcap-Dumpfiles:

tcpdump -qns 0 -X -r capture.pcap

Netzwerkverkehr mitschneiden:

tcpdump
tcpdump port 4242 and '(tcp-syn|tcp-ack)!=0'

Netzwerkverkehr ohne eigenen SSH-Verkehr mitschneiden:

tcpdump -i eth1 -s 1500 port not 22

Ohne DNS-Namensauflösung:

tcpdump -i eth1 -s 1500 port not 22 -n

Funktioniert z.B. ein stunnel?

# Terminal 1:
dnf -y install tcpdump nc
tcpdump port 60005 -n -vvvv

# Terminal 2:
echo "blah" > nc localhost 60005

MTR

MTR vereint traceroute und ping in einem Tool. Beim Start untersucht MTR die Netzwerkverbindung zwischen dem Host, auf dem MTR läuft, und dem angefragten Host, indem es Pakete mit absichtlich niedrigen TTLs sendet (beginnend bei 1). Es sendet im nächsten Schritt Pakete mit einer TTL von 2 und merkt sich die Reaktionszeit der dazwischen liegenden Router. Dadurch kann es den Antwortprozentsatz und die Antwortzeiten der Internetroute zum angefragten Host ausgeben. Die Ergebnisse werden normalerweise als Round-Trip-Response-Zeiten in Millisekunden und als Prozentsatz des Paketverlusts angegeben.

Sehr nützlich, da es auch die Autonomen Systeme (AS) auf dem Weg anzeigt.

mtr --aslookup --tcp --port 443 --report www.linuxfabrik.ch
Start: 2021-07-19T09:21:35+0200
HOST: linuxfabrik                 Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. AS???    _gateway             0.0%    10    1.0   1.2   0.9   2.9   0.6
  2. AS13030  790his1.fiber7.init  0.0%    10    1.8   1.9   1.3   2.8   0.5
  3. AS13030  790his2.fiber7.init  0.0%    10    1.5   1.7   1.4   2.5   0.3
  4. AS13030  790kus1.fiber7.init  0.0%    10    2.7   2.1   1.5   2.9   0.5
  5. AS13030  790her1.fiber7.init  0.0%    10    1.8   1.8   1.5   2.9   0.4
  6. AS13030  740mei1.fiber7.init  0.0%    10    3.3   2.0   1.5   3.3   0.6
  7. AS13030  740rap1.fiber7.init  0.0%    10    2.1   2.1   1.9   2.6   0.2
  8. AS13030  790ust2.fiber7.init  0.0%    10    3.1   2.9   2.2   5.7   1.0
  9. AS13030  r1zrh12.core.init7.  0.0%    10    3.3   3.2   2.7   3.4   0.2
 10. AS13030  r1stg4.core.init7.n  0.0%    10    3.2   3.2   2.7   3.8   0.4
 11. AS13030  r1stg5.core.init7.n  0.0%    10    4.6   4.8   4.4   6.0   0.5
 12. AS13030  r1stg2.core.nit7.ne  0.0%    10    4.9   4.7   4.3   5.1   0.3
 13. AS13030  r1wil2.core.init7.n  0.0%    10    4.6   4.8   4.4   5.4   0.3
 14. AS13030  r1win11.core.init7.  0.0%    10    5.1   4.7   4.3   5.1   0.2
 15. AS13030  r1win12.core.init7.  0.0%    10    4.7   4.7   4.5   5.0   0.2
 16. AS13030  r1zrh6.core.init7.n  0.0%    10    4.7   4.7   4.4   4.9   0.2
 17. AS13030  r1glb1.core.init7.n  0.0%    10    4.2   8.6   4.2  43.8  12.4
 18. AS13030  r2glb1.core.init7.n  0.0%    10    3.9   4.5   3.9   5.3   0.4
 19. AS13030  r1glb2.core.init7.n  0.0%    10    4.1   4.5   4.1   5.1   0.3
 20. AS13030  gw-green.init7.net   0.0%    10    4.3   4.2   3.6   5.2   0.5
 21. AS1836   146.228.2.130        0.0%    10    5.4   7.4   4.8  19.1   4.5
 22. AS1836   146.228.2.101        0.0%    10    4.5   6.5   4.1  14.5   3.5
 23. AS1836   195.48.51.29         0.0%    10    4.4   4.5   4.1   5.8   0.5
 24. AS204823 185.231.52.10        0.0%    10    4.2   4.4   4.1   4.6   0.2

Serverdienst mit ncat simulieren

Wer mal eben schnell einen Prozess benötigt, der testweise auf einem bestimmten Port lauscht, kann ncat oder kurz nc verwenden. Mit folgendem Aufruf lauscht nc auf Port 80/tcp sowie 1234/udp und zeigt an, was bei ihm ankommt:

dnf -y install nmap-ncat
ncat -vvv --listen 80
ncat -vvv --udp --listen 1234

Intel-Netzwerktreiber für RHEL compilieren

Der Ablauf:

VER=5.13.4
dnf -y install kernel-devel
wget https://downloadmirror.intel.com/14687/eng/ixgbe-$VER.tar.gz
tar xzpf ixgbe-$VER.tar.gz cd ixgbe-$VER/src

make install
rmmod ixgbe
modprobe ixgbe
systemctl restart network
dracut --force

Firmware-Upgrade einer Netzwerkkarte am Beispiel Intel X550-T2

Auch wenn Firmware-Versionen 1.86, 1.93 und 2.00 verfügbar sind: die Karten werden Stand 202001 immer mit Firmware-Version 1.00 geliefert. Ein Firmware-Upgrade ist also anzuraten.

Die Intel-Firmware der Karte kann direkt unter CentOS geflasht werden. Download der Treiber direkt in das /root-Verzeichnis.

Um das Upgrade durchzuführen, mit IPMI, iDRAC oder iLO (Konsole) verbinden (das nachfolgende Firmware-Upgrade besser nicht über SSH ausführen - auch wenn es schon oft geklappt hat):

cd /root
tar xvzf X550_NVMUpdatePackage*
cd /root/X550/Linux_x64
./nvmupdate64e
# X550-T2 auswählen (z.B. mit Eingabe von "01")
# back up the NVM images: yes

Troubleshooting

Ping ergibt „Redirect Host(New nexthop: …)“, und die Maschine, von der aus gepingt wird, kann diverse Dienste im eigenen Netz nicht erreichen?

Kann an der zentralen Firewall liegen: Wenn diese zwei Subnetze über das gleiche physische Interface bedient, hilft eine Auftrennung der beiden logischen Netze auf einzelne physische Interfaces.

Server-Interface mit VLAN startet nicht?

Vielleicht wurde ein früher deaktivierter NetworkManager aktualisiert und so wieder aktiviert, und ein systemctl disable --now NetworkManager hilft.

Am Beispiel einer Intel X550-T2

In oVirt wird sie unter RHEL 7.5 nicht angezeigt, und so lässt sich auch kein oVirt-Host einrichten. Funktioniert aber sonst direkt in RHEL tiptop. Wie vorgehen?

Geholfen hat es am Ende nicht: hinterher hat sich herausgestellt, dass es an einem Bug in der verwendeten oVirt-Version lag. :-)

WLAN-Signal schlecht? Welcher Kanal bringt die beste Abdeckung?

Folgender Befehl listet alle erreichbaren WLANs und deren Eigenschaften auf:

nmcli -f ALL dev wifi

Daraus sucht man sich seine eigenen WLAN-BSSIDs heraus, ändert an seinem WLAN-Router die Channel-IDs sukzessive eine nach der anderen und beobachtet in einem Terminal-Fenster folgende Ausgabe (die Spalte SIGNAL bezeichnet die Signalgüte in Prozent - je höher, desto besser):

while true; do ncmli -f CHAN,BSSID,SIGNAL,RATE,BARS dev wifi |grep 1C:24:CD...; sleep 3; done

Built on 2022-06-03