Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

iptables forward et qemu

4 réponses
Avatar
david hannequin
Bonjour,

Je viens de créer une machine virtuel avec qemu mais je veux pouvoir y
accéder depuis le web.
Pour cela j'ai ajouter les régles iptables suivantes :

# on accept les translations
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# Pour la machine qemu
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 172.20.0.0/24 -i tun0 -o eth0 -p tcp -j ACCEPT

# http tun0
iptables -A INPUT -i tun0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o tun0 -p tcp --sport 80 -j ACCEPT

# Web vers tun0 pour le serveur web
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination
172.20.0.2:80

iptables -A FORWARD -i eth0 -o tun0 -p tcp --destination-port 80 -m
state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun0 -p tcp --source-port 80 -m state
--state ESTABLISHED -j ACCEPT

Je vois as mon erreur, est ce que vous avez une idée ?

Cordialement
David Hannequin


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

4 réponses

Avatar
Pascal Hambourg
Salut,

david hannequin a écrit :

Je viens de créer une machine virtuel avec qemu mais je veux pouvoir y
accéder depuis le web.



Plutôt depuis internet, non ? "Acéder depuis le web", ça ne veut rien
dire. On accède *au* web, pas depuis le web.

Pour cela j'ai ajouter les régles iptables suivantes :



Pour que je sois sûr de comprendre : ces règles sont créées sur la
machine hôte, pas sur la machine virtuelle ?
Et tun0 est l'interface réseau de la machine hôte qui permet de
communiquer avec la machine virtuelle ?

# on accept les translations
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT



Normalement c'est déjà par défaut, on ne fait pas de filtrage dans la
table 'nat'.

# Pour la machine qemu
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT



Plutôt permissif. Mais pourquoi pas pour un premier test afin de
vérifier la connectivité.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



eth0 est l'interface de la machine hôte vers internet ?

iptables -A FORWARD -s 172.20.0.0/24 -i tun0 -o eth0 -p tcp -j ACCEPT



Inutile, la règle précédente "FORWARD -i tun0" a déjà accepté.
A quoi correspond 172.20.0.0/24 ?

# http tun0
iptables -A INPUT -i tun0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o tun0 -p tcp --sport 80 -j ACCEPT



Inutile, les règles précédentes "INPUT -i tun0" et "OUTPUT -o tun0" ont
déjà tout accepté. Et pour le trafic retour, on n'utilise pas
(uniquement) le port source mais (aussi) le suivi de connexion. Sinon
c'est facile de contourner le pare-feu, il suffit d'attaquer à partir du
port source accepté.
Au fait, à quoi sont censées servir ces deux règles ? Si je lis bien, à
permettre à la machine virtuelle d'accéder au serveur web de la machine
hôte ?

# Web vers tun0 pour le serveur web
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination
172.20.0.2:80



A quoi correspond 172.20.0.2 ?

iptables -A FORWARD -i eth0 -o tun0 -p tcp --destination-port 80 -m
state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun0 -p tcp --source-port 80 -m state
--state ESTABLISHED -j ACCEPT



Inutile, les règles précédentes "FORWARD -i tun0" et "FORWARD -o tun0"
ont déjà tout accepté.

Je vois as mon erreur, est ce que vous avez une idée ?



Commence par préciser la configuration réseau de la machine hôte et de
la machine virtuelle (interfaces, adresses, routes). Ensuite explique ce
que tu attends, ce qui marche et ce qui ne marche pas, le résultat
précis des tests exacts (commandes, messages d'erreur, capture de trafic
réseau...) que tu as effectués (ping, traceroute, tcptraceroute...)
Le "forwarding" IP est-il activé sur la machine hôte
(net.ipv4.ip_forward=1) ?
Si oui, la machine virtuelle peut-elle accéder à internet ?


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Fnor
david hannequin wrote:
Bonjour,

Je viens de créer une machine virtuel avec qemu mais je veux pouvoir y
accéder depuis le web.
Pour cela j'ai ajouter les régles iptables suivantes :

# on accept les translations
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# Pour la machine qemu
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 172.20.0.0/24 -i tun0 -o eth0 -p tcp -j ACCEPT

# http tun0
iptables -A INPUT -i tun0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o tun0 -p tcp --sport 80 -j ACCEPT

# Web vers tun0 pour le serveur web
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination
172.20.0.2:80

iptables -A FORWARD -i eth0 -o tun0 -p tcp --destination-port 80 -m
state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun0 -p tcp --source-port 80 -m state
--state ESTABLISHED -j ACCEPT

Je vois as mon erreur, est ce que vous avez une idée ?



N'aurais-tu pas oublié d'activer le forward ?
Mettre ip_forward=yes dans le fichier /etc/network/options et relancer
la configuration du réseau :
$ /etc/init.d/networking restart

Fnor


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
david hannequin
Salut,

J'apporte quelques précisions à mon probléme. J'ai une machine relier à
internet sur la carte eth0. Sur cette machine je fais fonctionner un
machine virtuelle qemu avec le service apache2.
Pour que cela fonctionne correctement j'ai créer les régles :

iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 172.20.0.0/24 -i tun0 -o eth0 -p tcp -j ACCEPT

tun0 est l'interface réseau de la machine virtuelle
172.20.0.0/24 est le réseau de la machine virtuelle
l'adresse de la machine virtuelle est 172.20.0.2

Ces régles sont permisives mais permettent de à la machine virtuelle
d'accéder à internet et de communiquer avec la machine hote.

Maintenant, je souhaite pouvoir accéder au serveur apache depuis
internet avec l'adresse ip publique de la machine hote.
Pour cela j'ai ajouté à mon script :
modprobe iptable_nat
modprobe iptable_filter
echo 1 > /proc/sys/net/ipv4/ip_forward # pour autoriser le forwarding

# les 3 lignes pour accepter la tranlation
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# les 6 lignes pour la machine virtuelle, j'affinerais les régles pour
les rendre moin permissives une fois que ca marchera comme je veux
;-)
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 172.20.0.0/24 -i tun0 -o eth0 -p tcp -j ACCEPT

# tun0 est l'interface réseau de la machine virtuelle
# 172.20.0.0/24 est le réseau de la machine virtuelle
# l'adresse de la machine virtuelle est 172.20.0.2

# Web vers tun0 pour le serveur web
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination
172.20.0.2:80
# 172.20.0.2 est l'adresse d l'interface réseau de la machine virtuelle
où fonctione apache

# je compte remplacer les régles tro pemissives par celle ci mais pour
l'instant ca marche po :-(
iptables -A FORWARD -i eth0 -o tun0 -p tcp --destination-port 80 -m
state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun0 -p tcp --source-port 80 -m state
--state ESTABLISHED -j ACCEPT

# régles pour le masquerading pour le serveur web
iptables -t nat -A POSTROUTING -s 172.20.0.0/24 -j MASQUERADE

j'ai cherché et testé plusieurs solution sans que ca marche et je vois
pas mon erreur.
merci d'avance
David Hannequin


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Pascal Hambourg
david hannequin a écrit :
[...]
Ces régles sont permisives mais permettent de à la machine virtuelle
d'accéder à internet et de communiquer avec la machine hote.



Bien.

Maintenant, je souhaite pouvoir accéder au serveur apache depuis
internet avec l'adresse ip publique de la machine hote.
Pour cela j'ai ajouté à mon script :
modprobe iptable_nat
modprobe iptable_filter



Pas vraiment utile, ces modules (et les autres) auraient été chargés
automatiquement lors de la création des règles iptables qui en ont besoin.

echo 1 > /proc/sys/net/ipv4/ip_forward # pour autoriser le forwarding

# les 3 lignes pour accepter la tranlation
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# les 6 lignes pour la machine virtuelle, j'affinerais les régles pour
les rendre moin permissives une fois que ca marchera comme je veux
;-)



Bonne initiative.

iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 172.20.0.0/24 -i tun0 -o eth0 -p tcp -j ACCEPT

# tun0 est l'interface réseau de la machine virtuelle
# 172.20.0.0/24 est le réseau de la machine virtuelle
# l'adresse de la machine virtuelle est 172.20.0.2

# Web vers tun0 pour le serveur web
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination
172.20.0.2:80
# 172.20.0.2 est l'adresse d l'interface réseau de la machine virtuelle
où fonctione apache



Je rajouterais "-i eth0", mais ce n'est pas essentiel.
Et à ce stade, le serveur de la machine virtuelle est-il accessible
depuis internet ?

# je compte remplacer les régles tro pemissives



Lesquelles ?

par celle ci mais pour l'instant ca marche po :-(



C'est-à-dire ?

iptables -A FORWARD -i eth0 -o tun0 -p tcp --destination-port 80 -m
state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun0 -p tcp --source-port 80 -m state
--state ESTABLISHED -j ACCEPT

# régles pour le masquerading pour le serveur web
iptables -t nat -A POSTROUTING -s 172.20.0.0/24 -j MASQUERADE



Ça m'a l'air correct. Il faudrait autoriser l'ICMP aussi, et peut-être
le DNS (pour la résolution inverse d'adresses IP sources des requêtes)
mais c'est secondaire.

Tu as bien essayé d'accéder au serveur depuis internet et pas depuis la
machine hôte, car d'une part ça ne marchera pas sans créer une règle
DNAT dans la chaîne OUTPUT (et avoir un noyau qui va bien) et d'autre
part ça ne prouvera pas que l'accès depuis internet fonctionne.


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact