Limiter et contrôler le trafic sortant peut être utile dans de nombreux cas, par exemple :
- Protection contre les attaques - lorsque les services sur le serveur génèrent des réponses
- Protection des données - rendant plus difficile l'extraction d'informations du serveur
- Protection contre les scripts à code fermé qui peuvent collecter et transmettre des informations à votre insu
Dans notre exemple, nous allons créer une machine virtuelle et supposer que nous devons tester un logiciel concernant la transmission de données. Ainsi, nous bloquerons tout sauf une adresse IP à partir de laquelle nous testerons le logiciel.
1. Ajout de règles à iptables
# Supprimer les règles actuelles (attention si connecté via SSH)
iptables -F OUTPUT
# Autoriser loopback (localhost)
iptables -A OUTPUT -o lo -j ACCEPT
# Autoriser les requêtes DNS (si nécessaire, facultatif)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# Autoriser toutes les connexions sortantes vers l'IP 111.222.111.222
iptables -A OUTPUT -d 111.222.111.222 -j ACCEPT
# Bloquer toutes les autres connexions sortantes
iptables -A OUTPUT -j REJECT
Où 111.222.111.222 est l'adresse IP à partir de laquelle nous testerons, enverrons et recevrons des données.
2. Vérification des règles, vérification via SSH depuis le serveur lui-même
2.1 Vérification du ping
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 79.174.xx.xxx icmp_seq=1 Destination Port Unreachable
ping: sendmsg: Opération non autorisée
From 79.174.xx.xxx icmp_seq=2 Destination Port Unreachable
ping: sendmsg: Opération non autorisée
From 79.174.xx.xxx icmp_seq=3 Destination Port Unreachable
ping: sendmsg: Opération non autorisée
2.2 Vérification de telnet
telnet google.com 443
Trying 209.85.233.101...
Connection failed: Connexion refusée
Trying 209.85.233.113...
Connection failed: Connexion refusée
Trying 209.85.233.139...
Connection failed: Connexion refusée
Trying 209.85.233.100...
Comme nous pouvons le voir, les règles fonctionnent, et lorsque des scripts ou services tentent de se connecter, aucune donnée ne sera transmise sur Internet.
3. Surveillance du trafic et des tentatives de connexion
3.1 Cet exemple mettra à jour les données de connexion pour PHP toutes les secondes
watch -n 1 'lsof -i -nP | grep php'
php-fpm8. 445 www-data 11u IPv4 2405976614 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm8. 448 www-data 12u IPv4 2405976614 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm8. 449 www-data 14u IPv4 2405976614 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm8. 453 www-data 16u IPv4 2405976614 0t0 TCP 127.0.0.1:9000 (LISTEN)
S'il y a des tentatives de connexion à un nœud externe, la connexion sera visible, y compris le port et l'adresse IP.
Lors de la surveillance des scripts PHP, il existe également des modules supplémentaires, comme xdebug. Ne le laissez pas activé en mode production ; utilisez-le uniquement pour le débogage.
De cette manière, vous pouvez rapidement créer un environnement sandbox sur un serveur virtuel pour les scripts nécessaires et surveiller l'activité réseau sans risquer l'exposition des données.