[iptables] Coup de main pour conf

Applications, problèmes de configuration réseau
toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

[iptables] Coup de main pour conf

Message par toma222 »

Bonsoir,

Comme je l'indique dans ce post, je suis en train de me monter un serveur qui a entre autres rôles de servir de passerelle entre mon réseau Wifi (192.168.1.0, que je considère "non sûr") et mon réseau Ethernet (192.168.0.0, que je considère "sûr). Je suis donc en train de configurer iptables. Le but est de sécuriser un minimum tout ça et d'apprendre à utiliser iptables.

Voici donc un petit schéma simplifié de l'architecture :

(PC 192.168.0.20 )---------------------------------------(192.168.0.1 Serveur 192.168.1.20) - - - - - - - - - - - - - - - - - - -(192.168.1.1 Box Web)

Il y a d'autres PC autour, du côté du réseau 192.168.1.0 principalement.

Et voici donc mon script iptables actuel :

Code : Tout sélectionner

##Variables
interne=192.168.0.0/24
externe=192.168.1.0/24
partout=0.0.0.0/0
serveur0=192.168.0.1
serveur1=192.168.1.20
portable=192.168.1.10

##Initialisation des tables

#filter
iptables -t filter -F
iptables -t filter -X

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

#nat
iptables -t nat -F
iptables -t nat -X

iptables -t nat -P PREROUTING  ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

#mangle
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT

##Règles pour l'interface lo
iptables -t filter -A INPUT  -i lo -j ACCEPT

##Règles pour l'interface eth0 (on accepte tout sur le réseau interne)
iptables -t filter -A INPUT -i eth0 -s $interne -d $interne -j ACCEPT

##Règles pour l'interface eth1
#Samba pour Portable
iptables -t filter -A INPUT -i eth1 -s $portable -d $serveur1 -p tcp --dport 135 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $portable -d $serveur1 -p udp --dport 137 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $portable -d $serveur1 -p udp --dport 138 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $portable -d $serveur1 -p tcp --dport 139 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $portable -d $serveur1 -p tcp --dport 445 -j ACCEPT

#plus d'autres pour Samba, NTP...)

##Suivi de connexion
#Toutes les connexions qui sortent du LAN vers le Net sont acceptées
iptables -t filter -A FORWARD -i eth0 -o eth1 -s $interne -d $partout -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#Seules les connexions déjà établies ou en relation avec des connexions établies sont acceptées venant du Net vers le LAN
iptables -t filter -A FORWARD -i eth1 -o eth0 -s $partout -d $interne -m state --state ESTABLISHED,RELATED -j ACCEPT

##Nat
iptables -t nat -A POSTROUTING -o eth1 -s $interne -j MASQUERADE

##LOGs
iptables -t filter -A INPUT -j ULOG --ulog-prefix=DefaultDrop
(je sais que les -t filter ne sont pas nécessaires mais je préfère les mettre pour la lisibilité)

Un iptables -nvL me donne :

Code : Tout sélectionner

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     0    --  lo     *       0.0.0.0/0            0.0.0.0/0
    8   560 ACCEPT     0    --  eth0   *       192.168.0.0/24       192.168.0.0/24
    0     0 ACCEPT     tcp  --  eth1   *       192.168.1.10         192.168.1.20        tcp dpt:135
    0     0 ACCEPT     udp  --  eth1   *       192.168.1.10         192.168.1.20        udp dpt:137
    0     0 ACCEPT     udp  --  eth1   *       192.168.1.10         192.168.1.20        udp dpt:138
    0     0 ACCEPT     tcp  --  eth1   *       192.168.1.10         192.168.1.20        tcp dpt:139
    0     0 ACCEPT     tcp  --  eth1   *       192.168.1.10         192.168.1.20        tcp dpt:445
    0     0 ULOG       0    --  *      *       0.0.0.0/0            0.0.0.0/0           ULOG copy_range 0 nlgroup 1 prefix `DefaultDrop' queue_threshold 1

Chain FORWARD (policy DROP 1 packets, 52 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     0    --  eth0   eth1    192.168.0.0/24       0.0.0.0/0           state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     0    --  eth1   eth0    0.0.0.0/0            192.168.0.0/24      state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 5 packets, 580 bytes)
 pkts bytes target     prot opt in     out     source               destination

Donc d'abord, j'aurais voulu savoir si vous aviez des remarques/critiques/propositions d'améliorations sur ce script ?

Ensuite mes soucis :
- il log des DROP sur du broadcast. Par ex :

Code : Tout sélectionner

Aug  7 21:26:33 Serveur DefaultDrop IN=eth1 OUT= MAC= SRC=192.168.1.20 DST=192.168.1.255 LEN=78 TOS=00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=137 DPT=137 LEN=58
Aug  7 21:29:28 Serveur DefaultDrop IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=192.168.0.20 DST=255.255.255.255 LEN=335 TOS=10 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=68 DPT=67 LEN=315
Donc du Samba venant de lui-même et du DHCP venant du PC fixe. Lorsqu'un PC sur 192.168.1.0 est présent, j'ai pas mal de DROP également (en particulier avec un Vista) sur les ports Samba, DHCP et d'autres que je n'ai plus en tête. Comment faire pour limiter tous ces logs pour ne pas avoir un fichier qui explose ? Dropper le broadcast sans le loguer ou le laisser passer ?
- J'ai vu sur le wiki archlinux.org des règles types :

Code : Tout sélectionner

#iptables -t filter -A INPUT -i eth1 -p tcp -j REJECT --reject-with tcp-reset
#iptables -t filter -A INPUT -i eth1 -p udp -j REJECT --reject-with icmp-port-unreachable
#iptables -t filter -A INPUT -i eth1 -p tcp ! --syn -m state --state NEW -j DROP
#iptables -t filter -A INPUT -i eth1 -f -j DROP
#iptables -t filter -A INPUT -i eth1 -p tcp --tcp-flags ALL ALL -j DROP
#iptables -t filter -A INPUT -i eth1 -p tcp --tcp-flags ALL NONE -j DROP
#iptables -t filter -I INPUT -i eth1 -s 10.0.0.0/8 -j DROP
#iptables -t filter -I INPUT -i eth1 -s 172.16.0.0/12 -j DROP
#iptables -t filter -I INPUT -i eth1 -s 192.168.0.0/16 -j DROP
#iptables -t filter -I INPUT -i eth1 -s 127.0.0.0/8 -j DROP
pour bloquer certaines attaques. A mettre en place selon vous (en particulier les 4 dernières) ? Il y en a d'autres du même genre qu'il pourrait être utile d'ajouter ?
- nmap ne voit pas les ports DHCP ouverts, savez-vous si c'est normal (le DHCP fonctionne).

Merci d'avance à tous.

EDIT : passage du réseau interne de 192.168.2.0 à 192.168.0.0.
Dernière modification par toma222 le lun. 11 août 2008, 19:15, modifié 1 fois.
Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Message par Vinvin »

Salut Thomas.

Quelques remarques :

1 - Peut-être peux-tu renommer tes variables pour plus de lisibilité ?
##Variables
serveur2=192.168.2.1
serveur1=192.168.1.20
2 - Il me semble que l'utilisation de la variable

Code : Tout sélectionner

partout=0.0.0.0/0
peut être proscrite. En effet, lorsque l'on ne précise pas la source ou la destination, c'est par défaut 0.0.0.0/0 qui est utilisé.
Mais peut-être as-tu défini la variable "partout" pour plus de lisibilité dans l'écriture de tes règles ? :D

3 - Sur le schéma de ton réseau, précise les interfaces de ton serveur. Si j'ai bien suivi, c'est :
- eth0 pour le réseau interne filaire 192.168.2.0/24
- eth1 pour le réseau externe en wifi 192.168.1.0/24

4 -
Donc du Samba venant de lui-même et du DHCP venant du PC fixe. Lorsqu'un PC sur 192.168.1.0 est présent, j'ai pas mal de DROP également (en particulier avec un Vista) sur les ports Samba, DHCP et d'autres que je n'ai plus en tête. Comment faire pour limiter tous ces logs pour ne pas avoir un fichier qui explose ? Dropper le broadcast sans le loguer ou le laisser passer ?
Je confirme que Windows envoie plein de paquets réseaux. Il s'agit surement de tas de services réseaux activés par défaut. :shock:
Comment éviter l'explosion de ton fichier de LOG ?
En créant des règles iptables qui supprimeront les paquets les plus courants AVANT qu'ils atteignent la règle de LOG.
Une autre solution est de paramétrer les ordinateurs du réseau externe pour qu'ils cessent leurs envois de paquets indésirables.
Et peut-être as-tu un serveur DHCP inutile qui tourne sur ton PC fixe ?



5 -
nmap ne voit pas les ports DHCP ouverts, savez-vous si c'est normal (le DHCP fonctionne).
Utilise nmap avec l'option -sU qui précise d'utiliser le protocole UDP (plutôt que TCP).
Ceci dit, chez moi aussi, nmap ne voit pas le port DHCP de la NeufBox ouvert, alors que la NeufBox fait serveur DHCP.
Voici le résultat chez moi :

Code : Tout sélectionner

nmap 192.168.1.1  -p65-70 -sU

Code : Tout sélectionner

Starting Nmap 4.62 ( http://nmap.org ) at 2008-08-08 12:09 CEST
Interesting ports on neufbox (192.168.1.1):
PORT   STATE         SERVICE
65/udp open|filtered tacacs-ds
66/udp open|filtered sql*net
67/udp open|filtered dhcps
68/udp closed        dhcpc
69/udp open|filtered tftp
70/udp open|filtered gopher
MAC Address: 00:11:22:33:44:55 (neuf cegetel)

Nmap done: 1 IP address (1 host up) scanned in 1.374 seconds
Je ne comprend pas non plus. :pasdidee:



6 - Dans les règles de suivi de connexion, tu peux remplacer le module "state" par le module "conntrack". Voir ici.
Concrètement, tu remplace
-m state --state NEW,ESTABLISHED,RELATED
par
-m conntrack --ctstate NEW,ESTABLISHED,RELATED
toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 »

Merci beaucoup Vinvin pour cette réponse détaillée !

1 - les serveur0 et serveur1 étaient par rapport aux interfaces eth0 et eth1, mais je vais peut être changer pour :

Code : Tout sélectionner

serveur0=192.168.0.1 (sur eth0) 
serveur1=192.168.1.20 (sur eth1)
Ce qui sera encore plus clair.

2 - en effet, le 0.0.0.0/0 ne sert à rien, c'était simplement pour essayer d'homogéniser les commandes iptables (j'avais même mis des -p all avant). C'est juste que je trouve ça plus propre.

3 - c'est bien ça, les ---- étaient sensés symboliser le filaire et les - - - - le wifi.

4 - j'ai déjà essayé de désactiver des services genre l'UPNP sur le portables sous Vista (qui n'est pas le mien), mais je ne veux pas bloquer de fonctionnalités si le portable est utilisé sur un autre réseau et que ces services peuvent être utiles. Donc le mieux selon toi est de droper ces paquets (avec des -m pkttype --pkt-type broadcast par exemple) ?
Une des difficultés que j'avais avec le portable sous Vista est qu'il envoie des paquets avec des adresses sources qui ne sont pas la sienne (sur les ports 67,68,137,138 notamment). Je n'ai pas de serveur DHCP sur mon fixe (juste sur la Box).

5 - nmap Serveur -p 65-70 -sU me retourne :

Code : Tout sélectionner

Interesting ports on Serveur (192.168.2.1):
PORT   STATE         SERVICE
65/udp closed        tacacs-ds
66/udp closed        sql*net
67/udp open|filtered dhcps
68/udp closed        dhcpc
69/udp closed        tftp
70/udp closed        gopher
"67/udp open|filtered dhcps" signifie bien que le port est ouvert non ?

6 - je vais jeter un oeil à conntrack (je l'avais déjà utilisé pour le ftp passif il me semble).

Merci encore et si d'autres ont des compléments à ajouter, n'hésitez pas.
Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Message par Vinvin »

toma222 a écrit :4 - j'ai déjà essayé de désactiver des services genre l'UPNP sur le portables sous Vista (qui n'est pas le mien), mais je ne veux pas bloquer de fonctionnalités si le portable est utilisé sur un autre réseau et que ces services peuvent être utiles. Donc le mieux selon toi est de droper ces paquets (avec des -m pkttype --pkt-type broadcast par exemple) ?
Je n'ai jamais utilisé ce type de paramètre.
/me ne sait pas trop. :no:
toma222 a écrit :Une des difficultés que j'avais avec le portable sous Vista est qu'il envoie des paquets avec des adresses sources qui ne sont pas la sienne (sur les ports 67,68,137,138 notamment.
Essaie de bloquer les paquets réseaux venant du portable en utilisant son adresse MAC. D'après les pages man d'iptables, ça doit ressembler à ceci :

Code : Tout sélectionner

iptables -t filter -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP;
Dans ton premier message, tu disais que le serveur recevait des paquets réseaux envoyés par le PC fixe :

Code : Tout sélectionner

Aug  7 21:29:28 Serveur DefaultDrop IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=192.168.2.20 DST=255.255.255.255 LEN=335 TOS=10 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=68 DPT=67 LEN=315
Tu pourrais configurer Netfilter sur ce PC fixe pour qu'il n'envoie plus ce genre de paquets ?

Concernant le LOG des paquets réseaux, j'y ai renoncé complètement.
Le propriétaire de mon immeuble partage sa connexion internet avec tous les locataires. Ainsi, mon ordinateur et ceux de mes voisins de paliers forment un réseau local.
Résultat : les PC Windows de mes voisins balancent une quantité gargantuesque de paquets réseaux.
Hop ! On envoie tout ça à la poubelle directement, sans LOG ! Image


#############################################
#############################################

Autre conseil : Supprime les paquets INVALID au début de chaque table :

Code : Tout sélectionner

iptables -t filter -A INPUT       -m conntrack --ctstate INVALID -j DROP
iptables -t filter -A OUTPUT    -m conntrack --ctstate INVALID -j DROP
iptables -t filter -A FORWARD -m conntrack --ctstate INVALID -j DROP
#############################################
#############################################

Concernant nmap et le DHCP, je ne sais pas du tout.
/me botte en touche.

#############################################
#############################################

Autre chose que j'ai apprise récemment :
1 - Netfilter est la partie du noyau qui s'occupe des paquets réseaux. Bon.
2 - Pour configurer la gestion des paquets IPv4, la commande est iptables. Bon.
3 - Et pour configurer la gestion des paquets IPv6, la commande est ip6tables.

Et oui ! Il existe un « second iptables ».
Il existe 3 tables pour les paquets IPv6 : filter, mangle et raw. Les commandes suivantes t'indiqueront l'état de ces 3 tables :

Code : Tout sélectionner

ip6tables -nvL -t filter
ip6tables -nvL -t mangle
ip6tables -nvL -t raw
Désagréable surprise : tout est configuré à ACCEPT par défaut.
Cette situation dangereuse doit être corrigée :

Code : Tout sélectionner

ip6tables -t filter -F
ip6tables -t filter -X
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P OUTPUT DROP
ip6tables -t filter -P FORWARD DROP

ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -t mangle -P PREROUTING DROP
ip6tables -t mangle -P INPUT DROP
ip6tables -t mangle -P FORWARD DROP
ip6tables -t mangle -P OUTPUT DROP
ip6tables -t mangle -P POSTROUTING DROP

ip6tables -t raw -F
ip6tables -t raw -X
ip6tables -t raw -P PREROUTING DROP
ip6tables -t raw -P OUTPUT DROP
#############################################
#############################################

Pour améliorer la sécurité de mon ordinateur (je suis dans un réseau local bourré de machines Microsoft !), je m'intéresse actuellement au protocole de résolution d'adresse ARP, qui permet de facilement foutre le boxon sur un réseau local.
Il existe un outil nommé arptables que je dois étudier.

@+ Thomas
toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 »

Salut,

Alors voilà où j'en suis suite à tes premières remarques :

Code : Tout sélectionner

##Variables
interne=192.168.0.0/24
externe=192.168.1.0/24
partout=0.0.0.0/0
serveur0=192.168.0.1
serveur1=192.168.1.20
Portable=192.168.1.10

##Initialisation des tables

#filter
iptables -t filter -F
iptables -t filter -X

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

#nat
iptables -t nat -F
iptables -t nat -X

iptables -t nat -P PREROUTING  ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

#mangle
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT

##Règles pour l'interface lo
iptables -t filter -A INPUT  -i lo -j ACCEPT

##Règles pour l'interface eth0 (on accepte tout sur le réseau interne)
iptables -t filter -A INPUT -i eth0 -s $interne -d $interne -j ACCEPT
iptables -t filter -A INPUT -i eth0 -m pkttype --pkt-type broadcast -j ACCEPT
iptables -t filter -A INPUT -i eth0 -m pkttype --pkt-type multicast -j ACCEPT

##Règles pour l'interface eth1
#On laisse passer ce qui vient de eth1
iptables -t filter -A INPUT -i eth1 -s $serveur1 -d $partout -p udp --dport 138 -j ACCEPT

#Samba pour Portable
iptables -t filter -A INPUT -i eth1 -s $Portable -d $serveur1 -p tcp --dport 135 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $Portable -d $serveur1 -p udp --dport 137 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $Portable -d $serveur1 -p udp --dport 138 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $Portable -d $serveur1 -p tcp --dport 139 -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s $Portable -d $serveur1 -p tcp --dport 445 -j ACCEPT

#Sécurité
iptables -t filter -A INPUT -i eth1 -p tcp -j REJECT --reject-with tcp-reset
iptables -t filter -A INPUT -i eth1 -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -t filter -A INPUT -i eth1 -p tcp ! --syn -m state --state NEW -j DROP
iptables -t filter -A INPUT -i eth1 -f -j DROP
iptables -t filter -A INPUT -i eth1 -p tcp --tcp-flags ALL ALL -j DROP
iptables -t filter -A INPUT -i eth1 -p tcp --tcp-flags ALL NONE -j DROP
iptables -t filter -I INPUT -i eth1 -s 10.0.0.0/8 -j DROP
iptables -t filter -I INPUT -i eth1 -s 172.16.0.0/12 -j DROP
#iptables -t filter -I INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -t filter -I INPUT -i eth1 -s 127.0.0.0/8 -j DROP

##Suivi de connexion
#Toutes les connexions qui sortent du LAN vers le Net sont acceptées
iptables -t filter -A FORWARD -i eth0 -o eth1 -s $interne -d $partout -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
#Seules les connexions déjà établies ou en relation avec des connexions établies sont acceptées venant du Net vers le LAN
iptables -t filter -A FORWARD -i eth1 -o eth0 -s $partout -d $interne -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

##Nat
iptables -t nat -A POSTROUTING -o eth1 -s $interne -j MASQUERADE

##LOGs
iptables -t filter -A INPUT -j ULOG --ulog-prefix=DefaultDrop
Ce que j'ai changé :
- j'ai passé le réseau interne (filaire) en 192.168.0.0 et laissé l'autre en 192.168.1.0 (sans-fil) pour plus de lisibilité, je vais éditer le schéma du premier post pour que ça corresponde.
- j'ai ajouté :

Code : Tout sélectionner

iptables -t filter -A INPUT -i eth0 -m pkttype --pkt-type broadcast -j ACCEPT
iptables -t filter -A INPUT -i eth0 -m pkttype --pkt-type multicast -j ACCEPT
Pour laisser passer le broadcast et le multicast en local.
- je laisse passer le port udp 138 quand ça vient du serveur :

Code : Tout sélectionner

iptables -t filter -A INPUT -i eth1 -s $serveur1 -d $partout -p udp --dport 138 -j ACCEPT
- j'ai utilisé les -m conntrack --ctstate au lieu des -m state --state.
- j'ai mis les règles du wiki archlinux.org même si je ne suis pas convaincu de l'utilité vu que je suis en policy DROP sur la chaine INPUT. Je n'ai pas activé :

Code : Tout sélectionner

#iptables -t filter -I INPUT -i eth1 -s 192.168.0.0/16 -j DROP
vu que je ne sais pas trop si ça peut poser problème avec mon réseau interne.
- et c'est tout je crois pour le moment...

Je n'ai plus de log saturé avec ces règles, mais le portable sous Vista n'est pas là (il est là que certains week end).

Pour le DHCP, ça fonctionne parfaitement pour ce que je voulais en faire (détection du démarrage du service sur le serveur pour le WakeOnLan, voir autre topic qu'il faut que j'édite).

Je vais maintenant me pencher sur ton dernier commentaire pour améliorer tout ça. Déjà :
- le filtrage MAC m'intéresse.
- je ne configure pas netfilter sur le PC fixe, c'est justement un des buts d'avoir le serveur en frontal.
- Ok pour les INVALID.
- je n'utilise pas l'IPv6 pour le moment mais je ne crois pas l'avoir désactivé sur le serveur, donc je vais y jeter un oeil.

Merci pour tous tes précieux conseils.

@+.
Répondre