Soucis configuration iptables

Bonjour à tous !

Je viens vous voir car j’ai un soucis avec iptables.

Tout d’abord, ma machine physique tourne sous debian squeeze et héberge 2 machines virtuelles sous kvm.
Je voulais avoir 2 adresses ip pour chacune de ces vm données par ma machinbox.
J’ai donc fait une connexion bridge (la machine hôte possède l’ip 192.168.2.251 et les virtuelles 192.168.2.100, 192.168.2.160).

[code]/etc/network/interfaces

auto lo
iface lo inet loopback

The primary network interface

allow-hotplug eth0
iface eth0 inet manual
up ifconfig eth0 0.0.0.0 up
down ifconfig eth0 down

Network bridge

auto br0
iface br0 inet static
address 192.168.2.251
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
gateway 192.168.2.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0[/code]

Comme ça, tout fonctionne, un ifconfig me donne :

br0       Link encap:Ethernet  HWaddr bc:ae:c5:de:af:bd  
          inet adr:192.168.2.251  Bcast:192.168.2.255  Masque:255.255.255.0
          adr inet6: fe80::beae:c5ff:fede:afbd/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1856577 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1881059 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:1858154362 (1.7 GiB)  TX bytes:1335087157 (1.2 GiB)

eth0      Link encap:Ethernet  HWaddr bc:ae:c5:de:af:bd  
          adr inet6: fe80::beae:c5ff:fede:afbd/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1851475 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1475644 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:1987107075 (1.8 GiB)  TX bytes:821374096 (783.3 MiB)
          Interruption:29 

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4698 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4698 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:3183668 (3.0 MiB)  TX bytes:3183668 (3.0 MiB)

virbr1    Link encap:Ethernet  HWaddr de:cb:e0:1a:b8:ac  
          inet adr:192.168.100.1  Bcast:192.168.100.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:281 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:0 (0.0 B)  TX bytes:41540 (40.5 KiB)

vnet0     Link encap:Ethernet  HWaddr fe:54:00:c7:17:66  
          adr inet6: fe80::fc54:ff:fec7:1766/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:298053 errors:0 dropped:0 overruns:0 frame:0
          TX packets:624814 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:500 
          RX bytes:75132849 (71.6 MiB)  TX bytes:684624001 (652.9 MiB)

vnet1     Link encap:Ethernet  HWaddr fe:54:00:ab:fa:d4  
          adr inet6: fe80::fc54:ff:feab:fad4/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1427 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2275 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:500 
          RX bytes:161899 (158.1 KiB)  TX bytes:382838 (373.8 KiB)

Donc, si je me trompe pas, br0, c’est le pont avec eth0, eth0 c’est l’interface physique.
lo est la boucle locale (127.0.0.1).
virbr1 est un réseau virtuel que j’avais créer sous kvm mais que je me sert pas en fin de comptes.
Et vnet0 et vnet1 sont mes VM.

Jusque là, tout va bien, c’est maintenant que ça se complique.
J’ai voulu protéger ma machine hôte avec iptables, le soucis, c’est que du coup, ça me bloque mes VM…
Voici mon script :

[code]#!/bin/sh

BEGIN INIT INFO

Provides: mon_parefeu

Required-Start: $local_fs

Should-Start:

Required-Stop: $local_fs

Should-Stop:

X-Start-Before: $network

X-Stop-After: $network

Default-Start: S

Default-Stop: 0 6

Short-description: Configure le parefeu

Description: Met en place les règles iptables.

END INIT INFO

#------------------------Explications----------------------------------#

Défauts :

- Cette configuration s’applique à toutes les interfaces réseau.

Si vous voulez restreindre cela à une interface donnée,

utilisez ‘-i INTERFACE’ dans la variables $IPTABLES.

- Par défaut, le script autorise tout en sortie.

Pour changer ce comportement veuillez indiquer les numéros

de port en question dans les variables

$REMOTE_TCP_SERVICES

et/ou $REMOTE_UDP_SERVICES

- Pour configurer une machine routeur,

changez la valeur de la variable

ISROUTERNAT à true, ainsi que

les interfaces ethx et ethy selon votre configuration

ethx correspond à l’interface du LAN

ethy correspond à l’interface reliée à la truc-box

description: Active/Désactive le pare-feu au démarrage

#----------------------------------------------------------------------#

#------------------------VARIABLES-------------------------------------#
readonly IPTABLES=/sbin/iptables

Services que le système offrira au réseau, à séparer avec des espaces

TCP_SERVICES="53"
UDP_SERVICES=“53”

Services que le système utilisera du réseau

(défaut : autorise tout en sortie)

REMOTE_TCP_SERVICES="“
REMOTE_UDP_SERVICES=”"

Pour une machine faisant office de routeur avec NAT,

changer la valeur de la variable ISROUTERNAT à 1.

ISROUTERNAT=false

ethx correspond à l’interface du LAN

ethy correspond à l’interface reliée à la truc-box

ethx="ethx"
ethy=“eth0”
#----------------------------------------------------------------------#

if ! [ -x $IPTABLES ]; then
exit 0
fi

#----------------------------FONCTIONS---------------------------------#
fw_start () {

Vidage

fw_clear
echo "Parefeu - Suppression des règles : [OK]"

Interdictions

$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP

echo "Parefeu - interdictions générales établies : [OK]"

Loopback

$IPTABLES -t filter -A INPUT -i lo -j ACCEPT

Trafic d’entrée :

$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#PING
$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p icmp -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT

Sortie autorisée, si aucun port autorisé en sortie n’est défini

    if [ -z "$REMOTE_TCP_SERVICES"] && [ -z "$REMOTE_UDP_SERVICES" ]; then
        $IPTABLES -t filter -P OUTPUT ACCEPT
    fi

#Syn
$IPTABLES -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
#Ports
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Services à autoriser en entrée

for PORT in $TCP_SERVICES; do
	$IPTABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done

for PORT in $UDP_SERVICES; do
	$IPTABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT
done

Services à autoriser en sortie

for PORT in $REMOTE_TCP_SERVICES; do
	$IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $REMOTE_UDP_SERVICES; do
	$IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
echo "Parefeu - Mise en place des règles : [OK]"

if $ISROUTERNAT ; then
	$IPTABLES -A INPUT -i $ethx -j ACCEPT
	$IPTABLES -A INPUT -p icmp -j ACCEPT
	$IPTABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
	$IPTABLES -A FORWARD -o $ethy -j ACCEPT
	$IPTABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
	echo "Parefeu - Routeur avec NAT : [OK]"
fi

Toutes les autres connexions sont enregistrées dans syslog

#$IPTABLES -t filter -A OUTPUT -j LOG
$IPTABLES -t filter -A INPUT -j LOG --log-level=4

echo "Parefeu - Logging : [OK]"


	$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
	$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
	$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
	$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

echo "Parefeu - VOD : [OK]"	

}

fw_stop () {
#$IPTABLES -F
#$IPTABLES -t nat -F
#$IPTABLES -t mangle -F
#$IPTABLES -P INPUT DROP
#$IPTABLES -P FORWARD DROP
#$IPTABLES -P OUTPUT ACCEPT
echo “Arrêt du parefeu : [OK]”
}

fw_clear () {
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
$IPTABLES -F
}

fw_status () {
$IPTABLES -L --line-numbers
}

#----------------------------------------------------------------------#

case “$1” in
start|restart)
echo "Starting firewall…"
fw_start
echo “done.”
;;
stop)
echo "Stopping firewall…"
fw_stop
echo “done.”
;;
clean)
echo "Clearing firewall rules…"
fw_clear
echo “done.”
;;
status)
echo "Firewall status"
fw_status
;;
*)
echo "Usage: $0 {start|stop|restart|clean|status}"
exit 1
;;
esac
exit 0[/code]

Voilà ce que je souhaite faire : sur la machine hôte, j’aimerais ouvrir les ports 53,137, 138, 139 et 445 sans filtrer mes VM qui sont déjà protégées…
Je vois pas trop comment faire n’étant pas très calé sur iptables.

Si ça peut simplifier les choses, ça me dérange pas de faire un réseau virtuel sur la machine (n’avoir qu’une ip au lieu de 3) et faire la répartition après. J’espère que vous avez compris ce que je souhaite faire.

Désolé pour ce post de 10km…
En vous remerciant d’avance pour vos futures réponses.

Bon, j’ai réussi à résoudre mon soucis, j’ai passé un moment à mettre au point, mais maintenant, c’est bon, j’ai cependant une dernière question à poser à celui qui voudra répondre :stuck_out_tongue:

Au final, j’ai fait un réseau virtuel au sein de ma machine, du coup, les requêtes des 3 serveurs vont sur une seule et même adresse ip, celle de la machine hôte. C’est donc un réseau virtuel nat. J’ai constaté un avantage énorme, il n’y a plus qu’un seul pare feu pour 3 machines. Je poste mon script iptables modifié, si jamais ça peut servir à quelqu’un qui a un soucis du genre …

Et à propos de ce script, pouvez-vous me dire si il est suffisamment sécurisé ?

[code]#!/bin/sh

BEGIN INIT INFO

Provides: mon_parefeu

Required-Start: $local_fs

Should-Start:

Required-Stop: $local_fs

Should-Stop:

X-Start-Before: $network

X-Stop-After: $network

Default-Start: S

Default-Stop: 0 6

Short-description: Configure le parefeu

Description: Met en place les règles iptables.

END INIT INFO

#------------------------VARIABLES-------------------------------------#
readonly IPTABLES=/sbin/iptables
#----------------------------------------------------------------------#

if ! [ -x $IPTABLES ]; then
exit 0
fi

#----------------------------FONCTIONS---------------------------------#
fw_start () {

Vidage

fw_clear
echo "Parefeu - Suppression des règles"

Interdictions

$IPTABLES -t filter -P INPUT DROP
#$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP
echo "Parefeu - Interdictions générales"

Loopback

$IPTABLES -t filter -A INPUT -i lo -j ACCEPT
echo "Parefeu - Boucle locale"

Trafic d’entrée :

$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#PING
$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p icmp -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT

#Syn
$IPTABLES -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT

#Ports
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Services à autoriser en entrée

#TCP

#Machine physique
	#VOD | Local only
		$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
		$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
		$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
		$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

	#DNS | Local only
		$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 53 -j ACCEPT
#VM1 (Debian Squeeze)

	#Web
		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 80 -d 192.168.100.200 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.100.200:80

		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 443 -d 192.168.100.200 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 192.168.100.200:443

		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 4912 -d 192.168.100.200 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 4912 -j DNAT --to 192.168.100.200:4912

	#Jeu
		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 1823 -d 192.168.100.200 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 1823 -j DNAT --to 192.168.100.200:1823

#VM2 (WS2008R2)

	#Mail	
		#IMAPS
		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 993 -d 192.168.100.201 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 993 -j DNAT --to 192.168.100.201:993
		
		#SMTPS
		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 465 -d 192.168.100.201 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 465 -j DNAT --to 192.168.100.201:465

		#SMTP
		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 25 -d 192.168.100.201 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.100.201:25

		#IMAP
		$IPTABLES -A FORWARD -i eth0 -p tcp --dport 143 -d 192.168.100.201 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 143 -j DNAT --to 192.168.100.201:143

#UDP

#Machine physique

	#DNS | Local only
		$IPTABLES -A INPUT -s 192.168.2.0/24 -m state --state NEW -p udp --dport 53 -j ACCEPT

#VM1 (Debian Squeeze)

	#Jeu
		$IPTABLES -A FORWARD -i eth0 -p udp --dport 1823 -d 192.168.100.200 -j ACCEPT
		$IPTABLES -t nat -A PREROUTING -i eth0 -p udp --dport 1823 -j DNAT --to 192.168.100.200:1823

		$IPTABLES -P OUTPUT ACCEPT
		$IPTABLES -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
echo "Parefeu - Mise en place des règles"

Toutes les autres connexions sont enregistrées dans syslog

#$IPTABLES -t filter -A OUTPUT -j LOG
$IPTABLES -t filter -A INPUT -j LOG --log-level=4

echo "Parefeu - Logging"

}

fw_stop () {
#$IPTABLES -F
#$IPTABLES -t nat -F
#$IPTABLES -t mangle -F
#$IPTABLES -P INPUT DROP
#$IPTABLES -P FORWARD DROP
#$IPTABLES -P OUTPUT ACCEPT
echo “Arrêt du parefeu : [OK]”
}

fw_clear () {
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
$IPTABLES -F
}

fw_status () {
$IPTABLES -L --line-numbers
}

#----------------------------------------------------------------------#

case “$1” in
start|restart)
echo "Starting firewall…"
fw_start
echo “done.”
;;
stop)
echo "Stopping firewall…"
fw_stop
echo “done.”
;;
clean)
echo "Clearing firewall rules…"
fw_clear
echo “done.”
;;
status)
echo "Firewall status"
fw_status
;;
*)
echo "Usage: $0 {start|stop|restart|clean|status}"
exit 1
;;
esac
exit 0[/code]

Mon nouveau ifconfig (si ça peut aider pour ma question) :

[code]eth0 Link encap:Ethernet HWaddr bc:ae:c5:de:af:bd
inet adr:192.168.2.251 Bcast:192.168.2.255 Masque:255.255.255.0
adr inet6: fe80::beae:c5ff:fede:afbd/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:682844 errors:0 dropped:0 overruns:0 frame:0
TX packets:409004 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:957461826 (913.1 MiB) TX bytes:53538652 (51.0 MiB)
Interruption:29 Adresse de base:0x4000

lo Link encap:Boucle locale
inet adr:127.0.0.1 Masque:255.0.0.0
adr inet6: ::1/128 Scope:Hôte
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:48438 errors:0 dropped:0 overruns:0 frame:0
TX packets:48438 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:48572607 (46.3 MiB) TX bytes:48572607 (46.3 MiB)

virbr1 Link encap:Ethernet HWaddr fe:54:00:93:43:92
inet adr:192.168.100.1 Bcast:192.168.100.255 Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:56835 errors:0 dropped:0 overruns:0 frame:0
TX packets:48964 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:49294964 (47.0 MiB) TX bytes:28105190 (26.8 MiB)

vnet0 Link encap:Ethernet HWaddr fe:54:00:93:43:92
adr inet6: fe80::fc54:ff:fe93:4392/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13710 errors:0 dropped:0 overruns:0 frame:0
TX packets:12552 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:500
RX bytes:10915448 (10.4 MiB) TX bytes:3183403 (3.0 MiB)

vnet1 Link encap:Ethernet HWaddr fe:54:00:9c:34:fc
adr inet6: fe80::fc54:ff:fe9c:34fc/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29368 errors:0 dropped:0 overruns:0 frame:0
TX packets:31430 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:500
RX bytes:24245042 (23.1 MiB) TX bytes:24025057 (22.9 MiB)[/code]
Donc eth0, c’est l’interface physique.
lo, la boucle locale.
virbr1, le réseau virtual créé par kvm.
vnet0 et vnet1 les machines virtuelles.