Notation CIDR
La notation CIDR permet de désigner de manière concise un ensemble d'adresses IPv4 en indiquant le nombre de bits qu'on ne fait pas varier. Par exemple, 137.194.2.16
et 137.194.2.16/32
sont équivalents et ne désignent qu'une seule adresse IP. Par contre, 137.194.2.0/24
représente toutes les adresses de la forme 137.194.2.x
où x
varie de 1 à 254 (0 et 255 étant réservées dans ce cas à l'adresse de réseau et à l'adresse de broadcast).
On souhaite pouvoir utiliser la notation CIDR dans notre spécification d'hôtes, comme dans la commande suivante :
$ cargo run -- ping 192.168.0.169/30 22,80
192.168.0.169:22 is open
192.168.0.169:80 is closed
192.168.0.170:22 timed out
192.168.0.170:80 timed out
(on remarquera que les adresses de réseau 192.168.0.168 et de broadcast 192.168.0.171 ont été automatiquement exclues du scan)
Le crate ipnet
permet de manipuler la notation CIDR.
- Ajoutez le crate
ipnet
à vos dépendances dansCargo.toml
. - Écrivez une fonction
scanner::expand_net()
qui prend une spécification en entrée et qui renvoie une liste d'hôtes :
pub fn expand_net(host: &str) -> Vec<String> {
todo!()
}
Si jamais le paramètre host
est une spécification CIDR, la liste des adresses IPv4 concernées devra être renvoyée. Si jamais ce n'est pas une spécification CIDR ou si c'est un nom de machine sous forme textuelle (comme www.telecom-paris.fr
), ce même nom sera renvoyé.
Utilisez pour cela les fonctionnalités du crate ipnet
: vous trouverez de quoi construire un Ipv4Net
qui représente un sous-réseau. En cas d'échec, vous saurez que n'êtes pas en présence d'une notation CIDR. En cas de succès, vous pourrez énumérer les adresses IPv4 appartenant à ce sous-réseau.
- Dans le programme principal, appelez
scanner::expand_net()
sur chacun des hôtes passés sur la ligne de commande et construisez ainsi la liste des cibles. Utilisez cette liste dans l'appel àscanner::net::tcp_mping()
.
Vous allez rapidement vous apercevoir que la sortie est illisible en raison du grand nombre de timeouts et de ports fermés.
- Ajoutez une option
-o
/--open-only
pour n'afficher que les ports ouverts que vous avez trouvés.
On peut maintenant faire :
$ cargo run -- ping -o 192.168.0.0/24 22,80,443
192.168.0.16:80 is open
192.168.0.36:22 is open
192.168.0.138:80 is open
192.168.0.138:443 is open
192.168.0.138:22 is open
192.168.0.169:22 is open
192.168.0.254:443 is open
192.168.0.254:80 is open
192.168.0.96:80 is open