Problème avec iptables sur openvz

Système : proxmox
Dédié ovh

Bonjour,

N’ayant jamais fait de réseau en VM jusqu’à présent, je rencontre quelques difficultés avec les communication de mon container (OPENVZ).
J’ai monté un container en OPENVZ sur mon interface proxmox en m’appuyant sur ce tuto :
guides.ovh.com/Proxmox

J’ai utilisé la partie OPENVZ en NAT.

Ma machine marche bien lorsque j’applique les consignes du tuto, mais, lorsque pour sécuriser mon serveur hote je lance le script iptables, après avoir configuré le ssh pour me rendre sur le container, j’ai accès à mon container en ssh mais si je tape une commande aptitude update, ça ne fonctionne pas, alors qu’avant de lancer mon script iptables, le update fonctionnait.

Il semblerait que le routage ne veut plus fonctionner. Donc je crois avoir compris que dans le script iptables, je casse en premier lieu toutes les connexions sauf celles déjà établies. Donc il doit me manquer une règle quelque part pour que mon container fonctionne correctement.

J’ai beau chercher sur les tutos, je n’arrive pas à trouver mon bonheur. Quelqu’un pourrait-il m’expliquer le fonctionnement ainsi que les règles que je dois taper pour faire marcher ma machine container s’il vous plait ?

Pour les tests, j’ai placé mon container sur l’ip 10.0.0.1

J’ai besoin de comprendre comment cela fonctionne.
D’avance merci pour vos futures réponses.

Je ne sais pas quel log vous donner pour aider à résoudre mon problème, donc si vous avez besoin, demandez moi !

Merci

Salut

Ca fait plus d’un an que j’ai fais ça, mais je me souviens avoir eu le même problème. J’avais activé la Masquerade sur l’interface pour redonner l’accès à Internet aux VM

Tu peux le faire dans les règles de Nat Postrouting avec Webmin, c’est ptet plus simple ^^

Bonne chance

J’ai essayé en plaçant le code dans le fichier /etc/network/interface mais ça ne fonctionne pas pour autant…
Je ne comprends pas pourquoi…

j’ai rentré cette ligne de commande en direct , ça me répond :

J’ai enlevé le post-up et retapé la commande, je me connecte toujours à mon serveur, mais l’update est toujours impossible…

  1. Contenu du script iptables ?
  2. Script iptables exécuté sur la machine hôte ou la machine virtuelle ?
  3. Une fois le script exécuté, les règle iptables en place (affichées par la commande iptables-save) correspondent-elles au contenu du script ?
  4. aptitude exécuté sur la machine hôte ou la machine virtuelle ?
  5. Sortie de la commande “ifconfig” ou “ip addr” sur les deux machines ?

1- Contenu du script iptables :

[code]###BEGIN INIT INFO

Provides: scriptname

Required-Start: $remote_fs $syslog

Required-Stop: $remote_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Start daemon at boot time

Description: Enable service provided by daemon.

END INIT INFO

#!/bin/sh

Vider les tables “filter” actuelles

iptables -t filter -F

Vider les règles personnelles

iptables -t filter -X

Interdire toute connexion entrante et sortante

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

Autoriser loopback (localhost)

iptables -t filter -A INPUT -i lo -s 127.0.0.0/0 -d 127.0.0.0/0 -j ACCEPT
iptables -t filter -A OUTPUT -o lo -s 127.0.0.0/0 -d 127.0.0.0/0 -j ACCEPT

Ne pas casser les connexions etablies

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

ICMP (Ping)

iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

#Proxmox
iptables -t filter -A OUTPUT -p udp --dport 8006 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8006 -j ACCEPT

SSH In

iptables -t filter -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport xxxx -j ACCEPT

SSH Out

iptables -t filter -A OUTPUT -p tcp --dport xxxx -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport xxxx -j ACCEPT

DNS In/Out

iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

NTP Out : pour la mise a jour automatique de l heure

iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

Whos is

iptables -t filter -A OUTPUT -p tcp --dport 43 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

HTTP + HTTPS Out

iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

HTTP + HTTPS In

iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT

Monit munin :

#iptables -t filter -A INPUT -p tcp --dport 1337 -j ACCEPT
#iptables -A INPUT -p tcp --dport 4949 -j ACCEPT
#iptables -A OUTPUT -p tcp --dport 4949 -j ACCEPT

#FTP
#iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
#iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport 49152:65534 -j ACCEPT

Mail SMTP

iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

Teamspeak

#iptables -A INPUT -p udp -m udp --dport xxxx -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport xxxx -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport xxxx -j ACCEPT

#iptables -A OUTPUT -p tcp -m tcp --dport xxxx -j ACCEPT

#w00tw00t
iptables -I INPUT -d xx.xx.xx.xx -p tcp --dport 80 -m string --to 70 --algo bm --string ‘GET /w00tw00t.at.ISC.SANS.’ -j DROP

##############BAN BAN BAN BAN BAN#####################
iptables -A INPUT -s 220.255.1.202 -j DROP
iptables -A INPUT -s 220.255.1.236 -j DROP
iptables -A INPUT -s 114.44.104.11 -j DROP
iptables -A INPUT -s 114.44.105.57 -j DROP
iptables -A INPUT -s 118.167.2.206 -j DROP
iptables -A INPUT -s 118.167.8.246 -j DROP
iptables -A INPUT -s 118.167.97.19 -j DROP
iptables -A INPUT -s 118.168.128.126 -j DROP
iptables -A INPUT -s 201.254.96.72 -j DROP
[/code]

2 - Le code est exécuté sur la machine hôte

3 - Sortie de iptables-save de la machine hôte :

[code]# Generated by iptables-save v1.4.8 on Wed Nov 14 18:32:03 2012
*nat
:PREROUTING ACCEPT [898:95185]
:POSTROUTING ACCEPT [384:23308]
:OUTPUT ACCEPT [997:145925]
-A POSTROUTING -s 10.0.0.3/32 -o vmbr0 -j MASQUERADE
COMMIT

Completed on Wed Nov 14 18:32:03 2012

Generated by iptables-save v1.4.8 on Wed Nov 14 18:32:03 2012

*mangle
:PREROUTING ACCEPT [766782:141939072]
:INPUT ACCEPT [765153:141732285]
:FORWARD ACCEPT [28:1859]
:OUTPUT ACCEPT [800318:152845356]
:POSTROUTING ACCEPT [795746:151909438]
COMMIT

Completed on Wed Nov 14 18:32:03 2012

Generated by iptables-save v1.4.8 on Wed Nov 14 18:32:03 2012

*filter
:INPUT DROP [950:210505]
:FORWARD DROP [16:1062]
:OUTPUT DROP [4584:936715]
-A INPUT -d xx.xx.xx.xx/32 -p tcp -m tcp --dport 80 -m string --string “GET /w00tw00t.at.ISC.SANS.” --algo bm --to 70 -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8006 -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -p tcp -m tcp --dport xxxx -j ACCEPT
-A INPUT -p tcp -m tcp --dport xxxx -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -s 220.255.1.202/32 -j DROP
-A INPUT -s 220.255.1.236/32 -j DROP
-A INPUT -s 114.44.104.11/32 -j DROP
-A INPUT -s 114.44.105.57/32 -j DROP
-A INPUT -s 118.167.2.206/32 -j DROP
-A INPUT -s 118.167.8.246/32 -j DROP
-A INPUT -s 118.167.97.19/32 -j DROP
-A INPUT -s 118.168.128.126/32 -j DROP
-A INPUT -s 201.254.96.72/32 -j DROP
-A INPUT -s 121.179.146.9/32 -j DROP
-A INPUT -s 119.39.244.178/32 -j DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p udp -m udp --dport 8006 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport xxxx -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport xxxx -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 43 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 587 -j ACCEPT
COMMIT

Completed on Wed Nov 14 18:32:03 2012

[/code]

4 - aptitude est effectué sur la machine virtuelle (pour tester si j’ai la connection à internet je fais comme ça… ya peut-être d’autres moyens :smiley:

5- Sortie de ifconfig sur la machine hôte

[code]dummy0 Link encap:Ethernet HWaddr ee:fe:74:67:e8:88
inet6 addr: fe80::ecfe:74ff:fe67:e888/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:363 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:23994 (23.4 KiB)

eth0 Link encap:Ethernet HWaddr 00:25:90:7c:68:40
inet6 addr: fe80::225:90ff:fe7c:6840/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:376093 errors:0 dropped:0 overruns:0 frame:0
TX packets:346550 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:150205783 (143.2 MiB) TX bytes:80629554 (76.8 MiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:468151 errors:0 dropped:0 overruns:0 frame:0
TX packets:468151 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:77036668 (73.4 MiB) TX bytes:77036668 (73.4 MiB)

venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet6 addr: fe80::1/128 Scope:Link
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:256 errors:0 dropped:0 overruns:0 frame:0
TX packets:291 errors:0 dropped:3 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:38135 (37.2 KiB) TX bytes:24912 (24.3 KiB)

vmbr0 Link encap:Ethernet HWaddr 00:25:90:7c:68:40
inet addr:IP_hote Bcast:xx.xx.xx.255 Mask:255.255.255.0
inet6 addr: fe80::225:90ff:fe7c:6840/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:364390 errors:0 dropped:0 overruns:0 frame:0
TX packets:331339 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:144078216 (137.4 MiB) TX bytes:79787202 (76.0 MiB)

vmbr1 Link encap:Ethernet HWaddr ee:fe:74:67:e8:88
inet6 addr: fe80::ecfe:74ff:fe67:e888/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
[/code]

6 - sortie de ifconfig sur la machine distante :

[code]lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:60 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4838 (4.7 KiB) TX bytes:4838 (4.7 KiB)

venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:127.0.0.2 P-t-P:127.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:338 errors:0 dropped:0 overruns:0 frame:0
TX packets:291 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:29989 (29.2 KiB) TX bytes:43248 (42.2 KiB)

venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.0.0.3 P-t-P:10.0.0.3 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
[/code]

Voila !

La machine virtuelle, plutôt ?

  1. Qu’est-ce que c’est que cette aberration d’avoir configuré une adresse de loopback (127.0.0.2) sur l’interface venet0 ?

  2. Si tu avais créé des règles de NAT iptables (DNAT, MASQUERADE) avant de lancer le script, elles ont été supprimées. Il faudra donc les inclure dans le script. Je n’y trouve pas la règle MASQUERADE listée par iptables-save, que tu as dû rajouter manuellement par la suite je suppose.

  3. Le trafic routé entre la machine virtuelle et l’extérieur passe par la chaîne FORWARD, qui est vide avec une politique par défaut DROP. Il faut donc y ajouter des règles pour autoriser le trafic souhaité.
    Par exemple pour accepter toutes les connexions sortantes :

iptables -A FORWARD -i venet0 -o vmbr0 -j ACCEPT iptables -A FORWARD -i vmbr0 -o venet0 -m state --state ESTABLISHED,RELATED -j ACCEPT

  1. “-s 127.0.0.0/0 -d 127.0.0.0/0”, ça ne sert à rien puisque /0 implique “toutes les adresses” quelle que soit l’adresse mise devant, ce qui est déjà le cas par défaut. Et si tu voulais écrire 127.0.0.0/8, je le déconseille car les communications sur l’interface de loopback peuvent utiliser n’importe quelles adresses de la machine, et pas seulement ce préfixe.

1 - Un copain est venu me filer un petit coup de main et on a réécrit le pare feu qui jouait pour un dédié classique, mais pas pour une machine virtuelle. Donc avec les nouvelles règles j’arrive à installer des programmes sur la machine virtuelle qui contient toujours (je l’ai réinstallée) 127.0.0.2 en venet0 donc sur la machine virtuelle. On somme je dois aller si j’ai bien compris dans le /etc/network/interface de la machine virtuelle et mettre en venet0 ce que j’ai en venet0:0.

Je ne comprends pas encore bien comment se fait le routage inter machines virtuelles car je vais avoir un port 80 pour mes sites sur la machine virtuelle1 par exemple, mais je vais aussi avoir un port 80 sur une autre machine virtuelle, Et la, je ne sais pas comment je peux rediriger ce port sur toutes les machines…

Merci pour ton aide.

  1. Il me semblait avoir lu que c’était openvz qui configurait l’adresse sur l’interface venet de la machine virtuelle. Que contient son /etc/network/interfaces actuellement ?

N’ayant jamais utilisé openvz je ne sais pas non plus, je vois plusieurs possibités :

  • openvz crée une interface venetN différente pour chaque machine virtuelle sur la machine hôte, et le routage entre VM est effectué par la pile IP de la machine hôte ;
  • openvz utilise une seule interface venet0 pour toutes les machines virtuelles et gère lui-même le trafic entre elles sans intervention de la pile IP de la machine hôte ;
  • openvz utilise une seule interface venet0 pour toutes les machines virtuelles mais le routage est effectué par la pile IP de la machine hôte.

Ceci est de la redirection de port (iptables DNAT), cela n’a rien à voir avec le routage ni avec les machines virtuelles.
Il faut une adresse publique par port externe à rediriger, donc si tu n’as qu’une seule adresse IP publique (pour la machine hôte), tu ne pourras rediriger le port 80 que vers une seule VM (et le port 80 de la machine hôte elle-même ne sera plus accessible de l’extérieur). Dans ce cas il faut soit :

  • utiliser un port extérieur différent pour le serveur web chaque VM, mais ça oblige à utiliser des URL de type site:port/….
  • mettre en place un reverse proxy HTTP sur la machine hôte qui va rediriger les requêtes HTTP vers les VM en fonction du nom de domaine du site demandé. Apache peut le faire.

Et concernant le problème de communication de la VM vers l’extérieur, c’est réglé ?

Alors oui, le problème de communication de la machine virtuelle vers l’extérieur est réglé car j’ai en fait changé le script iptables, donc de ce côté la ça fonctionne.

voici pour le moment le contenu de /etc/network/interface de la machine virtuelle :

[code]# This configuration file is auto-generated.

WARNING: Do not edit this file, your changes will be lost.

Please create/edit /etc/network/interfaces.head and

/etc/network/interfaces.tail instead, their contents will be

inserted at the beginning and at the end of this file, respectively.

NOTE: it is NOT guaranteed that the contents of /etc/network/interfaces.tail

will be at the very end of this file.

Auto generated lo interface

auto lo
iface lo inet loopback

Auto generated venet0 interface

auto venet0
iface venet0 inet manual
up ifconfig venet0 up
up ifconfig venet0 127.0.0.2
up route add default dev venet0
down route del default dev venet0
down ifconfig venet0 down

iface venet0 inet6 manual
up route -A inet6 add default dev venet0
down route -A inet6 del default dev venet0

auto venet0:0
iface venet0:0 inet static
address 10.0.0.3
netmask 255.255.255.255
[/code]

Ok alors j’ai bien compris ce que tu m’explique concernant le reverse proxy et je vais appliquer ça dès ce soir…

Quand on n’y connait rien au début c’est un peu barbare, mais ça devient plus clair quand on fait le job soit même.
Merci beaucoup pour ton aide, je pense que ça va m’être utile dans les heures qui viennent.

A très bientôt !

Ce serait donc openvz qui crée le contenu du fichier interfaces ?
Je me demande bien pourquoi il met cette adresse 127.0.0.2 sur venet0 alors qu’elle ne peut appartenir qu’à l’interface de loopback (lo)…