Initial commit
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# 25 / 10 / 08
|
||||
|
||||
## Adressage ID et sous-réseau
|
||||
|
||||
### Exercice 4 :
|
||||
|
||||
| Adresse IP| Classe | Réseau | Partie Hote | Masque | Première IP | Dernière IP |
|
||||
|--------|:--------:|-----|-------------|:-------:|-----|-------------|
|
||||
| 171.15.200.1 | B | 171.15 | 200.1 | /16 | 172.15.0.1 | 172.15.255.254 |
|
||||
| 192.20.4.1 | C | 192.20.4 | 1 | /24 | 192.20.4.1 | 192.20.4.254 |
|
||||
| 8.7.5.18 | A | 8 | 7.5.18 | /8 | 8.0.0.1 | 8.255.255.254 |
|
||||
| 191.10.8.3 | B | 191.10 | 8.3 | /16 | 191.10.0.1 | 191.10.255.254 |
|
||||
| 126.200.1.4 | A | 126 | 200.1.4 | /8 | 126.0.0.1 | 126.255.255.254
|
||||
| 223.1.2.3 | C | 223.1.2 | 3 | /24 | 223.1.2.1 | 223.1.2.254 |
|
||||
|
||||
### Exercice 5 :
|
||||
|
||||
| Adresse IP | Classe | Masque |
|
||||
|--------|----------|-----|
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
|
||||
### Exercice 6 :
|
||||
|
||||
| Adresse IP | Validité | Explication |
|
||||
|--------|:--------:|-----|
|
||||
| 192.118.275.3 | N | 275 |
|
||||
| 192.168.0.1 | O | |
|
||||
| 172.17.255.0 | O | |
|
||||
| 191.100.2.255 | O | |
|
||||
| 127.0.0.1 | N | ip local réservé |
|
||||
| 169.254.100.9 | O | |
|
||||
| 0.0.0.7 | N | réseau 0 |
|
||||
| 0.0.0.0 | N | réseau 0 |
|
||||
| 10.255.255.255 | N | Adresse Broadcast Dirigé |
|
||||
| 190.100.0.0 | N | Adresse réseau |
|
||||
| 255.255.255.255 | N | Adresse Broadcast Local |
|
||||
| 224.0.0.1 | N | |
|
||||
|
||||
### Exercice privée / publique :
|
||||
|
||||
| | | | | |
|
||||
|--------|--------|-----|-------|-------|
|
||||
| PU | PU | PR | PR | PU |
|
||||
| PR | PR | PR | PR | PU |
|
||||
|
||||
### Exercice Mask 1
|
||||
|
||||
| Mask decimal | Mask CIDR |
|
||||
|------|------|
|
||||
||/8|
|
||||
||/24|
|
||||
||/16|
|
||||
||/12|
|
||||
||/19|
|
||||
||/29|
|
||||
||/14|
|
||||
|
||||
### Exercice Mask 2
|
||||
|
||||
| Mask CIDR | Mask decimal |
|
||||
|-----|-----|
|
||||
|| 255.128.0.0 |
|
||||
|| 255.248 |
|
||||
|| 255.255.255.252 |
|
||||
|| 255.255.128.0 |
|
||||
|| 255.255.248.0 |
|
||||
|| 255.255.254.0 |
|
||||
|| 255.192.0.0 |
|
||||
|
||||
### Exercice Mask 3
|
||||
|
||||
| Adresse | Mask decimal | Réseau | |
|
||||
|-----|-----|-----|-----|
|
||||
@@ -0,0 +1,5 @@
|
||||
# 25 / 11 / 12
|
||||
|
||||
|
||||
## TP : rappels-2024
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
# 26 01 29
|
||||
|
||||
## Triade de la sécurité :
|
||||
```
|
||||
Confidentialité
|
||||
/\
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/________\
|
||||
Intégrité Disponibilité
|
||||
```
|
||||
|
||||
8 milliard de personnes sur terre mais plus assé d'ip diponible. A plus de 60% possèdent et utilise internet.
|
||||
|
||||
accuracy = nomber of true positive
|
||||
@@ -0,0 +1,60 @@
|
||||
# Rappel 2024
|
||||
|
||||
## Exercice 3
|
||||
|
||||
Il s'agit d'une requête HTTP GET (navigation web) envoyée par l'hôte 172.16.0.100 vers le serveur web 172.16.0.2
|
||||
|
||||
Ethernet :
|
||||
------
|
||||
|
||||
00 50 FC 20 3A 4A : Adresse Mac Desination
|
||||
|
||||
00 50 FC 0B 9A 80 : Adresse Mac Source
|
||||
|
||||
08 00 : Type de la Trame
|
||||
|
||||
IP :
|
||||
------
|
||||
|
||||
4 : Le datagrame contenu correspond à la version 4 d'IP
|
||||
|
||||
5 : 5 * 4 = 20 octets, l'entête IP fait 20 octets de longuer
|
||||
|
||||
00 : Vide
|
||||
|
||||
01 3E : Longueur de la trame IP ()
|
||||
|
||||
8E 4F : Identification
|
||||
|
||||
40 00 : Fragment offset 0 donc pas de fragment
|
||||
|
||||
80 : Time to live (128)
|
||||
|
||||
06 : Numéro du protocole, 06 correspond au protocole TCP
|
||||
|
||||
12 E4 : ?
|
||||
|
||||
AC 10 00 64 : IP Source 172.16.0.100
|
||||
|
||||
AC 10 00 02 : IP Destination 172.16.0.2
|
||||
|
||||
TCP :
|
||||
------
|
||||
|
||||
19 32 : Port Source 6450
|
||||
|
||||
00 50 : Port Destination 80 (http)
|
||||
|
||||
2C 3D 86 A1 : Numéro de séquence absolu
|
||||
|
||||
92 D3 19 AD : Acknowledgement number
|
||||
|
||||
50 :
|
||||
|
||||
18 : Flags
|
||||
|
||||
FA F0 :
|
||||
|
||||
1F 2F :
|
||||
|
||||
00 00 :
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,15 @@
|
||||
000000 00 50 FC 20 3A 4A 00 50 FC 0B 9A 80 08 00 45 00
|
||||
000010 01 3E 8E 4F 40 00 80 06 12 E4 AC 10 00 64 AC 10
|
||||
000020 00 02 19 32 00 50 2C 3D 86 A1 92 D3 19 AD 50 18
|
||||
000030 FA F0 1F 2F 00 00 47 45 54 20 2F 20 48 54 54 50
|
||||
000040 2F 31 2E 31 0D 0A 41 63 63 65 70 74 3A 20 2A 2F
|
||||
000050 2A 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 61
|
||||
000060 67 65 3A 20 66 72 0D 0A 41 63 63 65 70 74 2D 45
|
||||
000070 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 2C 20 64
|
||||
000080 65 66 6C 61 74 65 0D 0A 49 66 2D 4D 6F 64 69 66
|
||||
000090 69 65 64 2D 53 69 6E 63 65 3A 20 54 75 65 2C 20
|
||||
000100 30 39 20 41 70 72 20 32 30 30 32 20 31 38 3A 35
|
||||
000110 36 3A 35 38 20 47 4D 54 0D 0A 49 66 2D 4E 6F 6E
|
||||
000120 65 2D 4D 61 74 63 68 3A 20 22 37 66 36 32 36 2D
|
||||
000130 62 34 61 2D 33 63 62 33 33 39 37 61 22 0D 0A 55
|
||||
000140 73 65 72 2D 41 67 65 6E 74 3A 20 4D 6F 7A 69 6C
|
||||
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,20 @@
|
||||
UE2.21 Technologies des réseaux
|
||||
|
||||
## Plan du module
|
||||
|
||||
Séance du Mercredi 12 novembre 2025 de 13h30 à 17h00 par M. KOURITAL Mohamed
|
||||
|
||||
- Énoncé :
|
||||
- [Analyse du protocole HTTP](https://wiki.simoko.eu/cours/systemeetreseau/analyseprotocolehttp)
|
||||
- [Outils de capture de paquets et Analyse de trames (Ethernet, ARP, ICMP, DHCP), Tables ARP, attribution dynamique d’adresses IP](https://wiki.simoko.eu/cours/systemeetreseau/outils_de_capture_de_paquets_et_analyse_de_trames2)
|
||||
- [Analyse des protocoles TCP et IP avec Wireshark](https://wiki.simoko.eu/cours/systemeetreseau/analyse_des_protocoles_tcp_et_ip_avec_wireshark)
|
||||
- [Interrogations d’une infrastructure de réseaux Internet](https://wiki.simoko.eu/cours/systemeetreseau/interrogations_d_une_infrastructure_de_reseaux_internet)
|
||||
- [Devoir de synthèse](https://wiki.simoko.eu/cours/systemeetreseau/devoir_de_synthese)
|
||||
|
||||
## Ressources pédagogiques
|
||||
- [Adressage_IP_et_sous-reseaux-presentation-2013.pdf](https://formations.cci-paris-idf.fr/CFAUTEC/index.php/document/telecharger/1eLMjYG662Vwbf-hxcGSfPQE7RVTOg4DY1UnuxAwg-bWP9KvX8UAAOX-CcJyz-XGR260qJID/)
|
||||
- [1 - TD Adressage IP et sous-reseaux.pdf](https://formations.cci-paris-idf.fr/CFAUTEC/index.php/document/telecharger/nezoO2c3xrjQ1X87U2uzXZ1abV2zgcZtxvYRxjFymQReTwGcFcgw8bjsV-1QeQxXdW16EVrm/)
|
||||
- [rappels-2024.pdf](https://formations.cci-paris-idf.fr/CFAUTEC/index.php/document/telecharger/eCVxPWRnu-GwDSco9LynAW2IP-q6AmLgxbmuArpXZZDamIAbTcG0ibXi0hTc4GylyAouSWvh/)
|
||||
- [exo58.pkt](https://formations.cci-paris-idf.fr/CFAUTEC/index.php/document/telecharger/oPZECyL98qcx6e6xKE_c4g1qp09mqnWxN28Coo4SLzfCu4kExFpJcCw4VmjkLiDSrX_B5EZs/)
|
||||
- [normalisation_protocoles.pdf ](https://formations.cci-paris-idf.fr/CFAUTEC/index.php/document/telecharger/mBmn3jJDnB0iYGcu2eeIno5O97MkuyRPvIqPc3JyLrjKLf_nQJwKpHmYfk0MX820PtPcXVxU/)
|
||||
|
||||
+191
@@ -0,0 +1,191 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
ipv4_calc.py
|
||||
Calculatrice IPv4 (fonctions clés du site site24x7 ipv4 subnet calculator)
|
||||
Usage:
|
||||
python ipv4_calc.py 192.168.1.10/24
|
||||
python ipv4_calc.py 10.0.5.7 255.255.255.0
|
||||
python ipv4_calc.py --split 192.168.0.0/22 --subnet-size 24 # découper /22 en /24
|
||||
python ipv4_calc.py --by-hosts 192.168.0.0/24 --hosts 50 # trouver préfixe nécessaire
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import ipaddress
|
||||
import argparse
|
||||
import math
|
||||
from typing import Tuple, List
|
||||
|
||||
|
||||
def ip_to_bin_str(ip: ipaddress.IPv4Address) -> str:
|
||||
return '.'.join(f'{octet:08b}' for octet in ip.packed)
|
||||
|
||||
|
||||
def mask_to_wildcard(mask: ipaddress.IPv4Address) -> ipaddress.IPv4Address:
|
||||
# wildcard = inverse of mask
|
||||
mask_int = int(mask)
|
||||
wildcard_int = (~mask_int) & 0xFFFFFFFF
|
||||
return ipaddress.IPv4Address(wildcard_int)
|
||||
|
||||
|
||||
def usable_host_count(prefixlen: int) -> int:
|
||||
if prefixlen == 32:
|
||||
return 1 # only the host itself
|
||||
if prefixlen == 31:
|
||||
return 2 # RFC 3021: two-host point-to-point networks (no broadcast)
|
||||
return max(0, (1 << (32 - prefixlen)) - 2)
|
||||
|
||||
|
||||
def summarize_network(network: ipaddress.IPv4Network) -> dict:
|
||||
net_addr = network.network_address
|
||||
broadcast = network.broadcast_address
|
||||
prefixlen = network.prefixlen
|
||||
netmask = network.netmask
|
||||
wildcard = mask_to_wildcard(netmask)
|
||||
total_hosts = (1 << (32 - prefixlen))
|
||||
usable = usable_host_count(prefixlen)
|
||||
|
||||
# first/last usable host (handle /31 and /32 specially)
|
||||
if prefixlen == 32:
|
||||
first_usable = last_usable = net_addr
|
||||
elif prefixlen == 31:
|
||||
# two addresses, both usable (RFC 3021)
|
||||
first_usable = net_addr
|
||||
last_usable = network.network_address + 1
|
||||
else:
|
||||
first_usable = net_addr + 1
|
||||
last_usable = broadcast - 1
|
||||
|
||||
return {
|
||||
'network': str(net_addr),
|
||||
'cidr': f'{net_addr}/{prefixlen}',
|
||||
'netmask': str(netmask),
|
||||
'netmask_binary': ip_to_bin_str(netmask),
|
||||
'wildcard': str(wildcard),
|
||||
'wildcard_binary': ip_to_bin_str(wildcard),
|
||||
'broadcast': str(broadcast),
|
||||
'first_usable': str(first_usable),
|
||||
'last_usable': str(last_usable),
|
||||
'total_hosts': total_hosts,
|
||||
'usable_hosts': usable,
|
||||
'prefixlen': prefixlen,
|
||||
'network_binary': ip_to_bin_str(net_addr),
|
||||
}
|
||||
|
||||
|
||||
def parse_input(ip_str: str, mask_str: str = None) -> ipaddress.IPv4Network:
|
||||
"""
|
||||
Accept:
|
||||
- "192.168.1.10/24"
|
||||
- "192.168.1.10 255.255.255.0"
|
||||
- "192.168.1.0/24"
|
||||
Returns an IPv4Network object (network derived from given IP and mask).
|
||||
"""
|
||||
if '/' in ip_str:
|
||||
# ip/prefix form
|
||||
iface = ipaddress.IPv4Interface(ip_str)
|
||||
return iface.network
|
||||
else:
|
||||
# ip + mask form or ip alone -> require mask_str
|
||||
if mask_str is None:
|
||||
raise ValueError("Masque non fourni. Utiliser format 'IP/PREFIX' ou fournir le masque.")
|
||||
# If mask_str is like /24, remove slash
|
||||
if mask_str.startswith('/'):
|
||||
mask_str = mask_str[1:]
|
||||
# If mask_str is decimal prefix
|
||||
if mask_str.isdigit():
|
||||
prefix = int(mask_str)
|
||||
iface = ipaddress.IPv4Interface(f"{ip_str}/{prefix}")
|
||||
return iface.network
|
||||
# Otherwise assume dotted mask
|
||||
try:
|
||||
# compute prefix from mask
|
||||
mask_ip = ipaddress.IPv4Address(mask_str)
|
||||
# translate to prefixlen:
|
||||
mask_int = int(mask_ip)
|
||||
prefix = mask_int.bit_count() # number of ones
|
||||
iface = ipaddress.IPv4Interface(f"{ip_str}/{prefix}")
|
||||
return iface.network
|
||||
except Exception as e:
|
||||
raise ValueError(f"Masque invalide: {mask_str}") from e
|
||||
|
||||
|
||||
def split_network_into_prefix(network: ipaddress.IPv4Network, new_prefix: int) -> List[ipaddress.IPv4Network]:
|
||||
if new_prefix < network.prefixlen:
|
||||
raise ValueError("new_prefix doit être >= prefix du réseau d'origine")
|
||||
return list(network.subnets(new_prefix=new_prefix))
|
||||
|
||||
|
||||
def required_prefix_for_hosts(hosts: int) -> int:
|
||||
"""
|
||||
Retourne le préfixe minimal capable de contenir 'hosts' hôtes utilisables.
|
||||
Pour hosts <= 2, /31 ou /32 peuvent être envisagés.
|
||||
"""
|
||||
if hosts <= 0:
|
||||
raise ValueError("Le nombre d'hôtes doit être positif.")
|
||||
# handle /32 -> 1, /31 -> 2, others -> usable = 2^(32-p)-2
|
||||
if hosts == 1:
|
||||
return 32
|
||||
if hosts == 2:
|
||||
return 31
|
||||
# find minimal p such that (2^(32-p) - 2) >= hosts
|
||||
# => 2^(32-p) >= hosts + 2
|
||||
needed = hosts + 2
|
||||
power = math.ceil(math.log2(needed))
|
||||
prefix = 32 - power
|
||||
if prefix < 0:
|
||||
raise ValueError("Trop d'hôtes demandés pour IPv4")
|
||||
return prefix
|
||||
|
||||
|
||||
def pretty_print_summary(s: dict):
|
||||
print(f"Réseau : {s['cidr']} ({s['network']})")
|
||||
print(f"Masque : {s['netmask']} (/{s['prefixlen']})")
|
||||
print(f"Masque (binaire): {s['netmask_binary']}")
|
||||
print(f"Wildcard: {s['wildcard']} (binaire: {s['wildcard_binary']})")
|
||||
print(f"Adresse de broadcast : {s['broadcast']}")
|
||||
print(f"Plage hôtes utilisables : {s['first_usable']} - {s['last_usable']}")
|
||||
print(f"Total adresses : {s['total_hosts']} | Hôtes utilisables : {s['usable_hosts']}")
|
||||
print(f"Adresse réseau (binaire) : {s['network_binary']}")
|
||||
print()
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Calculatrice IPv4 (subnet calculator)")
|
||||
parser.add_argument('ip', help="IP ou réseau. Ex: 192.168.1.10/24 ou 10.0.0.1")
|
||||
parser.add_argument('mask', nargs='?', default=None, help="Masque (optionnel si 'ip' contient /). Ex: 255.255.255.0 ou /24")
|
||||
parser.add_argument('--split', action='store_true', help="Afficher la liste des sous-réseaux")
|
||||
parser.add_argument('--subnet-size', type=int, default=None, help="Si --split: nouveau préfixe (ex: 24)")
|
||||
parser.add_argument('--by-hosts', action='store_true', help="Calculer le préfixe nécessaire pour un nombre d'hôtes (utiliser --hosts)")
|
||||
parser.add_argument('--hosts', type=int, default=None, help="Nombre d'hôtes (utile avec --by-hosts)")
|
||||
args = parser.parse_args()
|
||||
|
||||
# by-hosts mode
|
||||
if args.by_hosts:
|
||||
if args.hosts is None:
|
||||
parser.error("--by-hosts nécessite --hosts N")
|
||||
prefix = required_prefix_for_hosts(args.hosts)
|
||||
print(f"Pour {args.hosts} hôtes utilisables, préfixe minimal: /{prefix}")
|
||||
print(f"Taille réseau: {1 << (32 - prefix)} adresses totales, {usable_host_count(prefix)} hôtes utilisables")
|
||||
return
|
||||
|
||||
try:
|
||||
network = parse_input(args.ip, args.mask)
|
||||
except Exception as e:
|
||||
parser.error(str(e))
|
||||
|
||||
summary = summarize_network(network)
|
||||
pretty_print_summary(summary)
|
||||
|
||||
if args.split:
|
||||
if args.subnet_size is None:
|
||||
parser.error("--split nécessite --subnet-size")
|
||||
new_pref = args.subnet_size
|
||||
subnets = split_network_into_prefix(network, new_pref)
|
||||
print(f"Découpage de {network.with_prefixlen} en /{new_pref} : {len(subnets)} sous-réseaux")
|
||||
for s in subnets:
|
||||
summ = summarize_network(s)
|
||||
print(f" - {s.with_prefixlen}: {summ['first_usable']} - {summ['last_usable']} (utilisables: {summ['usable_hosts']})")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user