Wheezy kvm: iptables ou nwfilter

Bonjour

erreur de débutant, je viens de perdre la tartine que j’ai tapé pour cause de timeout de session, :frowning:

donc je vais résumer:

J’ai un setup qemu/kvm fonctionnel.
Le host peut se connecter aux guests et inversément.

Par contre mes guests ne sont pas accessibles depuis le lan malgré tout ce que j’essaie (réseau par défaut en nat, réseau routé vers l’interface eth0). J’ai tenté d’écraser les règles iptables créées par libvirt pour définir par.ex

Mais ma règle additionnelle n’est jamais appliquée.

Je fonctionne sur une wheezy.

Merci d’avance pour vos suggestions

Bridge:

auto br0 iface br0 inet static address 192.168.10.100 netmask 255.255.255.0 network 192.168.10.0 broadcast 192.168.10.255 gateway 192.168.10.1 bridge_ports eth0 bridge_stp on bridge_maxwait 0

sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-arptables = 0 net.ipv4.conf.all.bootp_relay = 1

iptables -S

-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 69 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT -A FORWARD -d 192.168.122.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i br0 -o br0 -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-port-unreachable

Même les habitués peuvent se faire avoir. C’est une des raisons pour lesquelles je n’aime pas les forums web et leur préfère les newsgroups Usenet et les mailing lists.

Ceci montre la configuration du pont br0 qui est rattaché à l’interface physique eth0. D’après tes règles iptables il semble que les machines virtuelles sont rattachées à un autre pont, virbr1. A quoi sert br0, quelles auters interfaces s’y rattachent ?

  • Pourquoi activer le filtrage des paquets IPv4 pontés (net.bridge.bridge-nf-call-iptables = 1) ?
  • Je ne vois pas l’activation de la fonction routeur IPv4 (net.ipv4.ip_forward = 1) ?
  • Conseil de base : quand on met un réseau en place, on commence par tester la connectivité sans aucun filtrage. Ensuite, quand ça marche, on introduit le filtrage. Si ça ne marche plus, on sait que ça vient du filtrage et pas d’autre chose.
  • iptables-save affiche le contenu de toutes les tables actives. iptables -S n’affiche que le contenu de la table de filtrage (filter), donc pas les règles de NAT.

Les machines virtuelles ont-elle la bonne adresse de passerelle par défaut pour pouvoir communiquer avec l’extérieur ?

[quote]-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT[/quote]
Pourquoi mets-tu des règles si tu acceptes tout ?

Bonjour Pascal, Ricardo
Merci pour vos réponses.

Effectivement, je pensais aussi à la debian-user-french mais je me suis dit que j’allais d’abord tenter ici.

J’ai fait mon setup suivant wiki.debian.org/KVM et le br0 permet de communiquer entre eth0 et les guests (si j’ai bien tout capté)

C’est corrigé (cfr infra)

C’est justement une partie de mon souci. Les règles sont établies dans /etc/libvirt/nwfilter et activées au démarrage de libvirt/qemu-kvm. Les règles que j’applique ensuite sont basées sur: wiki.kartbuilding.net/index.php/ … all_Config

My bad, D’habitude j’utilise Shorewall pour me simplifier la vie. Cfr infra pour iptables-save

[quote=“PascalHambourg”]
Les machines virtuelles ont-elle la bonne adresse de passerelle par défaut pour pouvoir communiquer avec l’extérieur ?[/quote]

Oui, aucun souci de se côté, je peux les connecter depuis mon host et inversément.

J’ai donc débuggé quelque peux et constaté que les règles de mon script étaient effectivement appliquées mais l’ensemble ne doit pas être cohérent.
En appliquant la suggestion de Pascal (retirer toutes les règles),

iptables -F POSTROUTING -t nat iptables -F POSTROUTING -t mangle iptables -F PREROUTING -t mangle iptables -F

mes machines sont joignables dans les 2 directions (Host <-> Guest)
Je peux joindre ma machine depuis le lan en appliquant ensuite:

Donc, code 40 (erreur entre la chaise et le clavier).

Par contre, je crois que je vais tester avec Shorewall. Reste le souci d’écraser les règles FW mises en places par libvirt correctement et d’appliquer celles qui me conviennent (et les faire correctement).

J’ai vu dans /etc/libvirt/nwfilter la série de règles qui s’appliquent et je me demande si ce n’est pas mieux de définir les règles additionnelles à ce niveau (au travers de virsh). Qu’en pensez vous?

Merci encore.

Il faudrait en être sûr, car tes règles iptables considèrent que c’est virbr0 (et non virbr1 comme je l’ai écrit plus haut), donc avec du routage entre les deux ponts. La command “brctl show” devrait montrer à quel pont les machines virtuelles sont rattachées. Si c’est bien br0, alors il s’agit bien de pontage et pour que le filtrage IPv4 soit effectif il faut remettre net.bridge.bridge-nf-call-iptables à 1 et modifier les règles avec br0 au lieu de virbr0.

Concernant nwfilter, je ne connais pas du tout.

J’ai mis un peu de temps à comprendre, et c’est au détour d’un post, je ne sais plus bien sur quel site, que le plus simple est de désactiver le réseau en NAT par défaut créé par libvirt et d’en créer un routé sur le bridge, br0, précédemment créé. Assigner ensuite le réseau routé aux VMs.

Si on veut continuer à utiliser netfilter il faut créer un hook dans libvirt
torrycrass.com/2013/03/09/kv … etworking/
Enfin un petit coup de shorewall kwm ou shorewall dnsmasq dans google donne quelques pistes intéressantes.

Ensuite, avec le réseau routé, configurer iptables adéquatement.
J’utilise shorewall pour cela sur base de la config 2 interfaces avec virbrX en loc et br0 en net (configuré selon les infos du wiki.debian.org).
Cela fonctionne mais il me reste une interrogation.
Voici la config, la question suit :slightly_smiling:

/etc/shorewall/interface

#ZONE INTERFACE OPTIONS net br0 dhcp,tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0 loc virbr1 tcpflags,nosmurfs,routefilter,logmartians,routeback

/etc/shorewall/masq

#INTERFACE SOURCE ADDRESS PROTO PORT(S) IPSEC MARK br0 10.0.0.0/8,\ 169.254.0.0/16,\ 172.16.0.0/12,\ 192.168.0.0/16

=> ajouter IP_FORWARDING = Yes dans shorewall.conf (ou p-ê mieux dans /etc/default/shorewall)

/etc/shorewall/policy

[code]
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST
loc net ACCEPT
$FW loc ACCEPT
$FW all ACCEPT
net all DROP info

THE FOLLOWING POLICY MUST BE LAST

all all REJECT info[/code]

/etc/shorewall/routestopped

#INTERFACE	HOST(S)                  OPTIONS
virbr1		-

/etc/shorewall/rules

#ACTION		SOURCE		DEST		PROTO	DEST	SOURCE		ORIGINAL	RATE		USER/	MARK	CONNLIMIT	TIME         HEADERS         SWITCH
#							PORT	PORT(S)		DEST		LIMIT		GROUP
#SECTION ALL
#SECTION ESTABLISHED
#SECTION RELATED
SECTION NEW

#       Don't allow connection pickup from the net
#
Invalid(DROP)	net		all
#
#	Accept DNS connections from the firewall to the network
#
DNS(ACCEPT)	$FW		net
DNS(ACCEPT)	loc		$FW
#
#	Accept SSH connections from the local network for administration
#
SSH(ACCEPT)	loc		$FW
SSH(ACCEPT)	net		$FW
#
#	Allow Ping from the local network
#
Ping(ACCEPT)	loc		$FW

#
# Drop Ping from the "bad" net zone.. and prevent your log from being flooded..
#

Ping(DROP)	net		$FW

ACCEPT		$FW		loc		icmp
ACCEPT		$FW		net		icmp

#
# PORT FORWARDING TO VMs
#
HTTP(DNAT)	net		loc:192.168.123.200
SSH(DNAT)	net		loc:192.168.123.200
HTTP(DNAT)	net		loc:192.168.123.201:80	tcp	8080
SSH(DNAT)	net		loc:192.168.123.201:22	tcp	2222

#
# ACCESS FROM VMs to NET
HTTP(ACCEPT)	loc		$FW
HTTPS(ACCEPT)	loc		$FW

/etc/shorewall/zones

#ZONE	TYPE	OPTIONS			IN			OUT
#					OPTIONS			OPTIONS
fw	firewall
net	ipv4
loc	ipv4

La question qui persiste, est que je suis obligé de faire un hop par le pare feu, ex:
DNS(ACCEPT) $FW net
DNS(ACCEPT) loc $FW
Au lient de simplement faire
DNS(ACCEPT) loc net
Et là, je m’interroge :119

Et là, je ne peux pas t’aider car je ne connais pas shorewall. Je n’utilise qu’iptables directement.

Bonjour Pascal,
Merci en tous cas, tes commentaires m’ont permis de réviser ma conf.
J’ai tout de même une solution fonctionnelle. A part ce point d’interrogation dans la conf Shorewall, ça marche :slightly_smiling:

Donc, je recommande de virer le NAT par défaut créé par libvirt, ça évite d’avoir des règles créées par nwfilter. Je n’ai pas encore trouvé l’info nécessaire pour faire la bonne configuration par ce biais.

++