Aujourd'hui, je devais configurer un serveur en arrière d'un firewall (linux/debian). J'avais prévu un petit plan des étapes à faire. Puisque le serveur est protégé par un serveur-pare-feu, je devais ajouter une règle de "Destination NAT" ou DNAT au logiciel firewall de linux: iptables. J'ai cherché, cherché, cherché et je n'arrivais pas à trouver la raison pourquoi ma règle de DNAT ne fonctionnait pas. Admettons que j'avais une configuration comme celle-ci: INTERNET -> FIREWALL -> SERVEUR. J'étais capable de passer d'internet à firewall et de firewall à serveur, mais pas d'internet à serveur. J'ai essayé d'utiliser tcpdump port XXXX et netcat pour faire des tests. Ça n'a pas trop aidé.
Enfin, vers la fin de la journée, j'ai lu une documentation sur iptables qui indiquait que les paquets envoyés à la table de PREROUTING étaient "filtrés" par la suite. Ce qui veut dire que les paquets passaient effectivement d'internet au firewall, mais étaient bloqués lorsqu'il transférait les paquets au serveur interne (transférer = FORWARD). Donc, j'ai réalisé ce chemin 1. ils vont dans le PREROUTING, 2. ensuite le routing (route -n), 3. ils sont filtrés par INPUT (interface locale) ou FORWARD (interface externe). Dans mon idée, il n'y avait que 1. "PREROUTING" et 2. "routing". Puisque les paquets étaient redirigés vers un autre serveur, je croyais qu'il n'y avait pas de filtrage par la suite. J'avais tord. Finalement, mon ami, a cherché sur google images "iptables" et tout c'est éclairci. Voici un exemple de schéma qui explique le cheminement des paquets sur linux 2.6.
J'ai testé par la suite, en ajoutant la règle dans la section FORWARD et tout fonctionnait parfaitement comme prévu. Donc, si vous voulez faire du DNAT, pensez à FORWARD/INPUT!
# Voici un exemple de règles iptables # je permet à l'adresse source 192.168.1.10 de se connecter # via l'interface eth0, protocole udp # à mon firewall et je redirige vers 10.0.0.2 iptables -t nat -A PREROUTING -i eth0 -p udp --dport 12345 -s 192.168.1.10 -j DNAT --to 10.0.0.2 # Je permet de forwarder le paquet à mon serveur 10.0.0.2 # noter que seulement l'ip de destination (-d) a été modifiée iptables -A FORWARD -i eth0 -p udp --dport 12345 -s 192.168.1.10 -d 10.0.0.2 -j ACCEPT
Concernant netcat, si vous voulez faire un client et un serveur udp, voici la syntaxe:
# clients udp: netcat -u ip_du_serveur port_du_serveur netcat -u 10.0.0.2 12345 # serveur udp: netcat -u -l -s ip_du_serveur -p port_du_serveur netcat -u -l -s 10.0.0.2 -p 12345
Ça m'a pris ben du temps avant de comprendre que les options -s et -p étaient obligatoires pour créer un serveur!