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.
