====== 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 indique qu'il s'agit d'une **interface virtuelle = un alias**). Ceci est différent de la notion de VLANs, qui utilisent la notation **.** (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 : * Sur Debian-like : éditer le fichier ''/etc/network/interfaces'' et ajouter les lignes suivantes : 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 * Sur Redhat-like : 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 "", "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 : * **layer2** : répartition par défaut (XOR des adresses MAC src/dst et packet type ID) * **layer2+3** (XOR des adresses MAC/IP src/dst) * **layer3+4** (XOR des ports src/dst (TCP-UDP) et des adresses IPs src/dst ; NB : ce mode n'est pas totalement respectueux de la norme 802.3ad et peux causer des dé-séquencements avec des paquets fragmentés)) 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 : * interfaces physiques : ''/etc/sysconfig/network/ifcfg-ethX'' * agrégat : ''/etc/sysconfig/network/ifcfg-bond0'' * driver bonding : ''/etc/modprobe.d/bonding.conf'' 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==== * [[https://www.kernel.org/doc/Documentation/networking/bonding.txt|Linux Ethernet Bonding Driver HOWTO]] sur kernel.org * [[https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-using_channel_bonding|Using Channel Bonding]] (Redhat.com) =====Diagnostique===== Afficher les infos globales de la carte réseau: ifconfig eno0 eth0: flags=4163 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 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 : * reçus avec un mauvais tag de VLAN * utilisant un protocole inconnu * utilisant une adresse multicast non enregistrée * reçus par un agrégat inactif Les commandes suivantes sont des alternatives équivalentes qui remontent les mêmes compteurs : ip -s link 2: eth0: 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 [[informatique:logiciels:iperf|iperf]] ou [[informatique:linux:commandes_linux#wget|wget]]. src : [[https://www.cyberciti.biz/cloud-computing/increase-your-linux-server-internet-speed-with-tcp-bbr-congestion-control/|Increase Linux Internet speed with TCP BBR congestion control]] (nixCraft)