Bridge Firewall sous Linux

ethernetL’installation d’un bridge ethernet sous Linux Debian nécessite l’utilisation du package bridge-utils. Il peut être installé via la commande apt-get.

apt-get install bridge-utils

Configuration du bridge

La configuration du bridge s’effectue au moyen de l’utilitaire brctl.

Il est tout d’abord nécessaire de créer le bridge br0

/usr/sbin/brctl addbr br0

Il faut ensuite ajouter au bridge les interfaces ethernet qui doivent en faire partie.

/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1

L’adresse 0.0.0.0 est assignée à chaque interface faisant partie du bridge.

/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig eth1 0.0.0.0

Puis le bridge lui-même peut être configuré. A ce moment, on peut lui attribuer une adresse IP et définir le masque réseau.

/sbin/ifconfig br0 10.203.16.2 netmask 255.0.0.0 broadcast 10.255.255.255

La passerelle par défaut doit ensuite être définie

/sbin/route add default gw 10.201.16.45

Firewall

Le firewall doit ensuite être mis en place pour assurer le relai et le filtrage des paquets entre les interfaces.
Un script de configuration du firewall (basique) à travers les iptables est fourni ci-dessous.

#!/bin/sh
EXT_IF="eth0"
INT_IF="eth1"

#############################################
# F O R W A R D I N G
echo 1 > /proc/sys/net/ipv4/ip_forward

#############################################
# A N T I - S P O O F I N G
# Je veux pas de spoofing

if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
then
 for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
 do
   echo 1 > $filtre
 done
fi

# pas de icmp
#echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#############################################
# M O D U L E S

modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ipt_state

#############################################
# D E F A U L T   P O L I C I E S

# vidage des règles
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

# politique par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# log des paquets droppes
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP

# log des paquets acceptes
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT

# log des paquets rejectes
iptables -N LOG_REJECT
iptables -A LOG_REJECT -j LOG --log-prefix '[IPTABLES REJECT] : '
iptables -A LOG_REJECT -j REJECT

#############################################
# L O C A L H O S T
# allow lo on the router
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#############################################
# N E T B I O S
# NETBIOS désactivé
iptables -A FORWARD -p udp --dport 137 -j DROP
iptables -A FORWARD -p udp --sport 137 -j DROP
iptables -A FORWARD -p udp --dport 138 -j DROP
iptables -A FORWARD -p udp --sport 138 -j DROP
iptables -A FORWARD -p tcp --dport 139 -j DROP
iptables -A FORWARD -p tcp --sport 139 -j DROP

iptables -A INPUT -p udp --dport 137 -j DROP
iptables -A INPUT -p udp --sport 137 -j DROP
iptables -A INPUT -p udp --dport 138 -j DROP
iptables -A INPUT -p udp --sport 138 -j DROP
iptables -A INPUT -p tcp --dport 139 -j DROP
iptables -A INPUT -p tcp --sport 139 -j DROP

#############################################
# O U T P U T
# allow output on the router
iptables -A OUTPUT -j ACCEPT

#############################################
# I N P U T
# allow ICMP replies to the router
iptables -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT

# allow ssh on the router _itself_ (INPUT!)
iptables -A INPUT -p tcp --dport 60022 -m physdev --physdev-in $INT_IF -j ACCEPT
iptables -A INPUT -p tcp --dport 60022 -m physdev --physdev-in $EXT_IF -j ACCEPT

# allow DNS requests
iptables -A INPUT -p udp --sport 53 -m physdev --physdev-in $EXT_IF -j ACCEPT

# allow dhcp on the router _itself_ (INPUT!)
iptables -A INPUT -p udp --dport 67:68 --sport 67:68 -m physdev --physdev-in $INT_IF -j ACCEPT
iptables -A INPUT -p udp --dport 67:68 --sport 67:68 -m physdev --physdev-in $EXT_IF -j ACCEPT

# allow DNS Server on the router
iptables -A INPUT -p udp --sport 1024: --dport 53 -m physdev --physdev-in $INT_IF -j ACCEPT
iptables -A INPUT -p udp --sport 1024: --dport 53 -m physdev --physdev-in $EXT_IF -j ACCEPT

# reject all other connections to the router
iptables -A INPUT -p tcp -m physdev --physdev-in $EXT_IF -j LOG_DROP
iptables -A INPUT -p tcp -m physdev --physdev-in $INT_IF -j LOG_DROP
iptables -A INPUT -p udp -m physdev --physdev-in $EXT_IF -j LOG_DROP
iptables -A INPUT -p udp -m physdev --physdev-in $INT_IF -j LOG_DROP

#############################################
# F O R W A R D
iptables -A FORWARD -p tcp -m physdev --physdev-in $INT_IF --physdev-out $EXT_IF
  -j ACCEPT
iptables -A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -m physdev
             --physdev-in $EXT_IF --physdev-out $INT_IF -j ACCEPT
iptables -A FORWARD -p udp -m physdev --physdev-in $INT_IF --physdev-out $EXT_IF
  -j ACCEPT
iptables -A FORWARD -p udp -m physdev --physdev-in $EXT_IF --physdev-out $INT_IF
  -j ACCEPT
iptables -A FORWARD -p icmp -m physdev --physdev-in $INT_IF --physdev-out $EXT_IF
  -j ACCEPT
iptables -A FORWARD -p icmp -m state --state RELATED,ESTABLISHED -m physdev
              --physdev-in $EXT_IF --physdev-out $INT_IF -j ACCEPT

# reject all other connections
iptables -A FORWARD -p tcp -m physdev --physdev-in $EXT_IF -j LOG_REJECT
iptables -A FORWARD -p udp -m physdev --physdev-in $EXT_IF -j LOG_REJECT
iptables -A FORWARD -p tcp -m physdev --physdev-in $INT_IF -j LOG_REJECT
iptables -A FORWARD -p udp -m physdev --physdev-in $INT_IF -j LOG_REJECT

Une réponse a Bridge Firewall sous Linux

  1. Rado dit :

    Bonjour,

    Je viens de lire l’article et j’ai quelques questions

    Dans un bridge, les deux interfaces sont à la fois IN et OUT. De plus, eth0 et eth1 n’ont plus d’adresses IP.
    Comment peut on savoir quelle interface est le IN et laquelle le OUT?

    Peut-on dire dans la règle IPTABLES ne laisser que tel port utilisé dans les deux sens? sans indiquer les interfaces d’entrée et de sortie

    Comment rediriger le port 25 vers une adresse du réseau interne?

    Merci pour votre réponse,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>