Table of Contents

Le réseau sous Linux

Outils en vrac

nmap (http://www.nmap.org/),
thcrut (http://www.thc.org/thcrut/),
hping (http://www.hping.org/),
dsniff (http://www.monkey.org/~dugsong/dsniff/),
ettercap (http://ettercap.sourceforge.net/),
ggsniff (http://ggsniff.sourceforge.net/),
p0f (http://lcamtuf.coredump.cx/),
amap (http://www.thc.org/amap/),
vmap (http://www.thc.org/vmap/)
nbtscan (http://www.unixwiz.net/tools/nbtscan.html).

TUI monitoring

bmon
iptraf
iftop
nettop

IP secondaire

Soit l'interface réseau (physique ou non = marche aussi avec les bridges par exemple) eth0, je veux ajouter une IP secondaire dessus :

ifconfig eth0 add 10.0.0.1 netmask 255.255.255.0 up
 
# PI : pour le supprimer..
ifconfig eth0:0 del 10.0.0.1

L'adresse MAC est la même que eth0, mais on peut utiliser ainsi plusieurs adressages logiques sur le même LAN. On peut vérifier que l'interface a bien été créé sous le nom eth0:0 : ifconfig eth0:0 (la notation <itf:nombre> indique qu'il s'agit d'une interface virtuelle = un alias).

Ceci est différent de la notion de VLANs, qui utilisent la notation <itf>.<vlan> (par ex : eth0.13). Dans les 2 cas, le réseau physique est partagé entre les 2 réseaux, mais la différence fondamentale est que dans le cas des alias, le niveau 2 (liaison de données, Ethernet dans notre cas) est partagé entre tous les réseaux, alors qu'avec les VLANs il y a segmentation (domaines de broadcast différents = moins de bruit sur le réseau = plus performant et plus sécurisé).

Ainsi il vaut bien mieux utiliser différents VLANs que différents alias, lorsqu'on en a la possibilité (le fin du fin étant bien sûr d'utiliser des interfaces physiques différentes).

Pour pérenniser cette config et la charger au prochain démarrage, on doit la rajouter dans les fichiers de configuration réseau, qui dépendent de la distribution Linux :

auto eth0:0
iface eth0:0 inet static
	address 10.0.0.1
	netmask 255.255.255.0
	network 10.0.0.0
	broadcast 10.0.0.255

La plupart du temps cette distrib utilise plusieurs fichiers pour gérer les interfaces réseau ; le plus simple est de créer l'interface virtuelle avec l'assistant system-config-network : aller dans “Configuration du périphérique”, puis “<Nouveau périphérique>”, “Ethernet” et préciser les informations suivantes :

Nom			reseau_10.0.0
Périphérique		eth0:0
IP statique		10.0.0.1
Masque de sous-réseau	255.255.255.0
[..]
On boot			X # pour activer l'interface après un reboot de la machine

L'assistant consigne ces infos dans le fichier de configuration suivant : /etc/sysconfig/network-scripts/ifcfg-eth0:0

DEVICE=eth0:0
BOOTPROTO=none
NETMASK=255.255.255.0
TYPE=Ethernet
IPADDR=10.0.0.1
ONBOOT=yes
NAME=reseau_10.0.0

Bonding (agrégat)

Le bonding sous Linux est l'agrégat de ports, c'est-à-dire l'association de plusieurs interfaces réseau physiques pour en créer une logique, plus rapide et/ou plus fiable. C'est l'équivalent de l'etherchannel en terminologie Cisco ou du sharing chez Extreme Networks.

Théorie

Il existe plusieurs modes de gestion de l'agrégat ; en bref les mode 0 (balance-rr), 1 (active-backup), 2 (balance-xor), 3 (broadcast), 4 (802.3ad / LACP), 5 (balance-tlb), et 6 (balance-alb).

Dans la mesure du possible (si le commutateur d'en face le gère et est configuré pour), il est recommandé d'utiliser le LACP pour grouper ces interfaces entre elles et dialoguer avec l'équipement d'en face. Cela permet de créer un agrégat dynamique auquel on peut ajouter/retirer des interfaces à chaud par ex.

Avec le LACP (comme le balance-xor) on peut alors configurer la méthode de répartition de charge entre les interfaces avec le paramètre xmit_hash_policy, qui peut prendre la valeur :

Il existe les modes encap2+3 et encap3+4, identiques à layer2+3 et layer3+4, mais en utilisant les informations des protocoles encapsulés lorsque détection de tunnels)

Configuration sous centOS

Fichiers de configuration :

Pour fonctionner, on doit disposer d'une ou plusieurs interfaces physiques similaires en terme de type et de débit. Par exemple eth2 et eth3 :

# eth2
DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:e0:ed:xx:xx:x2
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
USERCTL=no
 
# eth3
DEVICE=eth3
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:e0:ed:xx:xx:x3
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
USERCTL=no

Il faut installer le module de bonding :

cat /etc/modprobe.d/bonding.conf 
alias bond0 bonding
options bond0 mode=4 xmit_hash_policy=layer2+3 miimon=100 downdelay=200 updelay=200

Exemple de configuration :

cat /etc/sysconfig/network-scripts/ifcfg-bond0
 
DEVICE='bond0'
BONDING_MASTER='yes'
BONDING_MODULE_OPTS='mode=802.3ad xmit_hash_policy=layer2+3 miimon=100'
BONDING_SLAVE0='eth2'
BONDING_SLAVE1='eth3'
BOOTPROTO='static'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR='10.1.8.200/24'
MTU='1500'
NAME='82599EB 10-Gigabit Network Connection'
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
USERCONTROL='no'

Diagnostique

cat /proc/net/bonding/bond0
 
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
 
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
 
802.3ad info
LACP rate: slow
Aggregator selection policy (ad_select): stable
Active Aggregator Info:
	Aggregator ID: 1
	Number of ports: 2
	Actor Key: 33
	Partner Key: 101
	Partner Mac Address: 74:8e:f8:xx:xx:x1
 
Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:e0:ed:xx:xx:x2
Aggregator ID: 1
 
Slave Interface: eth3
MII Status: up
Link Failure Count: 1
Permanent HW addr: 00:e0:ed:xx:xx:x3
Aggregator ID: 1

Références

Diagnostique

Afficher les infos globales de la carte réseau:

ifconfig eno0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.34.26  netmask 255.255.255.0  broadcast 10.0.34.255
        inet6 fe80::32d0:42ff:fe12:3456  prefixlen 64  scopeid 0x20<link>
        ether 30:d0:42:12:34:56  txqueuelen 1000  (Ethernet)
        RX packets 4963422  bytes 1239605132 (1.1 GiB)
        RX errors 0  dropped 208003  overruns 0  frame 0
        TX packets 4106056  bytes 4178402339 (3.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0x72180000-721a0000

Ici le compteur de paquets reçus supprimés (dropped) est important ; pourtant il n'indique pas nécessairement un problème dans la mesure où le kernel décompte les paquets :

Les commandes suivantes sont des alternatives équivalentes qui remontent les mêmes compteurs :

ip -s link
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 30:d0:42:12:34:56 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    1239605132 4963422  0       208003  0       4807
    TX: bytes  packets  errors  dropped carrier collsns
    4178403021 4106057  0       0       0       0
netstat -i
Table d'interfaces noyau
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0             1500  4963422      0 208003 0       4106059      0      0      0 BMRU

Il est plus pertinent de consulter les compteurs avec l'utilitaire ethtool (commande passée sur une autre machine) :

ethtool -S eth0
NIC statistics:
     rx_packets: 145743003
     tx_packets: 171911063
     rx_bytes: 51104241565
     tx_bytes: 222190909954
     rx_broadcast: 9278170
     tx_broadcast: 50
     rx_multicast: 3348219
     tx_multicast: 8
     rx_errors: 0
     tx_errors: 0
     tx_dropped: 0
     multicast: 3348219
     collisions: 0
     rx_length_errors: 0
     rx_over_errors: 0
     rx_crc_errors: 0
     rx_frame_errors: 0
     rx_no_buffer_count: 708691
     rx_missed_errors: 101954
     tx_aborted_errors: 0
     tx_carrier_errors: 0
     tx_fifo_errors: 0
     tx_heartbeat_errors: 0
     tx_window_errors: 0
     tx_abort_late_coll: 0
     tx_deferred_ok: 0
     tx_single_coll_ok: 0
     tx_multi_coll_ok: 0
     tx_timeout_count: 0
     tx_restart_queue: 0
     rx_long_length_errors: 0
     rx_short_length_errors: 0
     rx_align_errors: 0
     tx_tcp_seg_good: 0
     tx_tcp_seg_failed: 0
     rx_flow_control_xon: 0
     rx_flow_control_xoff: 0
     tx_flow_control_xon: 0
     tx_flow_control_xoff: 0
     rx_csum_offload_good: 132050209
     rx_csum_offload_errors: 284
     rx_header_split: 0
     alloc_rx_buff_failed: 0
     tx_smbus: 0
     rx_smbus: 0
     dropped_smbus: 0
     rx_dma_failed: 0
     tx_dma_failed: 0
     rx_hwtstamp_cleared: 0
     uncorr_ecc_errors: 0
     corr_ecc_errors: 0
     tx_hwtstamp_timeouts: 0
     tx_hwtstamp_skipped: 0

Dans cette dernière commande, le compteur rx_missed_errors indique des paquets perdus ; la cause est souvent la saturation du tampon de l'interface réseau, car trop de paquets sont reçus en même temps (à cause de burst, voir contrôle de flux), ou CPU trop lente/chargée pour les traiter.

Il peut être utile d'augmenter la taille des buffers et de faire des tests ; en gardant à l'esprit que cela augmente aussi la latence :

# afficher les paramètres actuels et les max admis
ethtool -g eno0
Ring parameters for eno0:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             256
RX Mini:        0
RX Jumbo:       0
TX:             256
 
# augmenter les buffers rx/tx
ethtool -G eno0 rx 4096 tx 4096

Tips

Activer le TCP BBR

Pour remplacer l'algorithme de gestion des congestions TCP par défaut par le BBR : - vérifier que votre kernel a été compilé avec les bons modules :

$ grep 'CONFIG_TCP_CONG_BBR=m' /boot/config-$(uname -r) \
&& grep 'CONFIG_NET_SCH_FQ' /boot/config-$(uname -r) \
&& grep -E 'CONFIG_TCP_CONG_BBR=m|CONFIG_NET_SCH_FQ' /boot/config-$(uname -r)
CONFIG_TCP_CONG_BBR=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m
CONFIG_TCP_CONG_BBR=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m

Si vous optenez ce résultat c'est bon ; sinon c'est qu'il est trop ancien (< 4.9) ou qu'il faut le recompiler avec les modules activés. Sous Debian 10 ça ne devrait pas poser de problème.

Pour activer le TCP BRR, en root/sudo :

$ sudo echo -e "net.core.default_qdisc=fq\n net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/10-custom-kernel-bbr.conf

Pour prendre en compte ces paramètres :

$ sudo sysctl --system
# (ou reboot)

Pour mesurer les améliorations, utiliser iperf ou wget.

src : Increase Linux Internet speed with TCP BBR congestion control (nixCraft)