Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

iptables et filtrage sur les regles forward

3 réponses
Avatar
Telga EL BARONO
Bonjour,

Je sais créer la retransmission de paquets IP entre le modem (ppp0) et
le réseau local (eth0) :

/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
-- jump ACCEPT
/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
-- jump ACCEPT
/sbin/iptables --table nat --append POSTROUTING --jump MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward

Mais cela autorise la retransmission de tous les protocoles et je
souhaiterais simplement autoriser certains protocoles.

J'ai commencé par interdire le tout et j'ai tenté d'autoriser le
protocole 80 de la façon suivante :

/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
-- jump DROP
/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
-- jump DROP

/sbin/iptables --new-chain NET_TO_LOC
/sbin/iptables --new-chain LOC_TO_NET

/sbin/iptables --append NET_TO_LOC --protocol tcp --source-port 80
--match state --state ESTABLISHED,RELATED --jump ACCEPT
/sbin/iptables --append LOC_TO_NET --protocol tcp --syn
--destination-port 80 --match state --state NEW --jump ACCEPT
/sbin/iptables --append LOC_TO_NET --protocol tcp --destination-port 80
--match state --state ESTABLISHED,RELATED --jump ACCEPT

/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
--jump LOC_TO_NET
/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
--jump NET_TO_LOC
/sbin/iptables --table nat --append POSTROUTING --jump MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward

Mais je me rends compte que le protocole 80 ne passe pas le routeur.

J'en conclue que je n'ai pas compris un truc mais quoi, impossible à savoir.

Si une âme charitable pouvais m'aider à résoudre mon problème, cela
m'ôterais une épine du pied.

D'avance merci

Telga

3 réponses

Avatar
Ronald
On Sat, 06 Mar 2004 19:44:41 +0000, Telga EL BARONO wrote:


J'ai commencé par interdire le tout et j'ai tenté d'autoriser le
protocole 80 de la façon suivante :

/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
-- jump DROP
/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
-- jump DROP
Il serait tout d'abord préférable de mettre les politiques par défaut

pour FORWARD, INPUT et OUTPUT en drop.
Enfin c'est la façon de procéder la plus simple.


/sbin/iptables --new-chain NET_TO_LOC /sbin/iptables --new-chain
LOC_TO_NET

/sbin/iptables --append NET_TO_LOC --protocol tcp --source-port 80
--match state --state ESTABLISHED,RELATED --jump ACCEPT /sbin/iptables
--append LOC_TO_NET --protocol tcp --syn --destination-port 80 --match
state --state NEW --jump ACCEPT /sbin/iptables --append LOC_TO_NET
--protocol tcp --destination-port 80 --match state --state
ESTABLISHED,RELATED --jump ACCEPT

/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
--jump LOC_TO_NET
/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
--jump NET_TO_LOC
/sbin/iptables --table nat --append POSTROUTING --jump MASQUERADE echo
"1"
/proc/sys/net/ipv4/ip_forward


Mais je me rends compte que le protocole 80 ne passe pas le routeur.
Tes deux premières règles correspondent à l'ensemble des paquets routés

de ppp0 vers eth0 et donc ceux avec pour origine ou destination le port
80 ou, pour reformuler la cible DROP est terminale, un paquet
qui correspond ne sera pas 'passé' à la règle suivante.

Ce que je ferais, c'est tout mettre en DROP par défaut (déjà dit), puis
autoriser explicitement le trafic depuis ou vers les ports dont j'ai
besoin.


Avatar
Telga EL BARONO
Ronald a écrit:
On Sat, 06 Mar 2004 19:44:41 +0000, Telga EL BARONO wrote:



J'ai commencé par interdire le tout et j'ai tenté d'autoriser le
protocole 80 de la façon suivante :

/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
-- jump DROP
/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
-- jump DROP


Il serait tout d'abord préférable de mettre les politiques par défaut
pour FORWARD, INPUT et OUTPUT en drop.
Enfin c'est la façon de procéder la plus simple.




Ceci n'est qu'un extrait du script mais effectivement FORWARD, INPUT et
OUTPUT sont droppées.

/sbin/iptables --new-chain NET_TO_LOC /sbin/iptables --new-chain
LOC_TO_NET

/sbin/iptables --append NET_TO_LOC --protocol tcp --source-port 80
--match state --state ESTABLISHED,RELATED --jump ACCEPT /sbin/iptables
--append LOC_TO_NET --protocol tcp --syn --destination-port 80 --match
state --state NEW --jump ACCEPT /sbin/iptables --append LOC_TO_NET
--protocol tcp --destination-port 80 --match state --state
ESTABLISHED,RELATED --jump ACCEPT

/sbin/iptables --append FORWARD --in-interface ppp0 --out-interface eth0
--jump LOC_TO_NET
/sbin/iptables --append FORWARD --in-interface eth0 --out-interface ppp0
--jump NET_TO_LOC
/sbin/iptables --table nat --append POSTROUTING --jump MASQUERADE echo
"1"

/proc/sys/net/ipv4/ip_forward


Mais je me rends compte que le protocole 80 ne passe pas le routeur.


Tes deux premières règles correspondent à l'ensemble des paquets routés
de ppp0 vers eth0 et donc ceux avec pour origine ou destination le port
80 ou, pour reformuler la cible DROP est terminale, un paquet
qui correspond ne sera pas 'passé' à la règle suivante.

Ce que je ferais, c'est tout mettre en DROP par défaut (déjà dit), puis
autoriser explicitement le trafic depuis ou vers les ports dont j'ai
besoin.


C'est ce que je pensais avoir fait...

Je vous transmets un extrait plus important de mon script. J'ai
l'impression de ne pas avoir compris quelques choses d'essentielles.

#!/bin/bash

# On definit quelques variables pour le script

IPTABLES="/sbin/iptables"

LOCALE_DEV="eth0"

INTERNET_DEV="ppp0"

# On definit quelques fonctions pour alleger le script

# On desactive la retransmission de paquets pendant la configuration

echo "0" > /proc/sys/net/ipv4/ip_forward

modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe iptable_filter
modprobe iptable_nat

# On vide les tables de filtrages

$IPTABLES $1 --flush
$IPTABLES $1 --delete-chain

# On vide les tables de translation d'adresse

$IPTABLES $1 --table nat --flush
$IPTABLES $1 --table nat --delete-chain

# On cree une regle pour surveiller les infractions aux regles

$IPTABLES $1 --new-chain LOG_DROP
$IPTABLES $1 --append LOG_DROP --jump LOG --log-prefix '(drop) '
$IPTABLES $1 --append LOG_DROP --match limit --limit 3/minute
--limit-burst 3
--jump LOG --log-prefix '(drop) '
$IPTABLES $1 --append LOG_DROP --jump DROP

...

# On interdit tout par defaut

$IPTABLES $1 --policy INPUT DROP
$IPTABLES $1 --policy OUTPUT DROP
$IPTABLES $1 --policy FORWARD DROP

...

################################################################################
################# On s'occupe de la restransmission de paquets
#################
################################################################################

# On commence par interdire toute retransmission de paquets

$IPTABLES $1 --append FORWARD --in-interface $LOCALE_DEV
--out-interface $INTERNET_DEV --jump LOG_DROP
$IPTABLES $1 --append FORWARD --out-interface $LOCALE_DEV
--in-interface $INTERNET_DEV --jump LOG_DROP

# On prepare les echanges entre le reseau local et l'internet

$IPTABLES $1 --new-chain NET_TO_LOC
$IPTABLES $1 --new-chain LOC_TO_NET

# On autorise les connexions vers des serveurs WEB(80) depuis le reseau
# local

$IPTABLES $1 --append NET_TO_LOC --protocol tcp --source-port 80 --match
state
--state ESTABLISHED,RELATED --jump ACCEPT
$IPTABLES $1 --append LOC_TO_NET --protocol tcp --syn --destination-port
80
--match state --state NEW --jump ACCEPT
$IPTABLES $1 --append LOC_TO_NET --protocol tcp --destination-port 80
--match state --state ESTABLISHED,RELATED --jump ACCEPT

# On valide les regles de traffic entre le reseau local et l'internet

$IPTABLES $1 --append FORWARD --in-interface $LOCALE_DEV
--out-interface $INTERNET_DEV --jump LOC_TO_NET
$IPTABLES $1 --append FORWARD --out-interface $LOCALE_DEV
--in-interface $INTERNET_DEV --jump NET_TO_LOC

# On effectue la translation d'adresse

$IPTABLES $1 --table nat --append POSTROUTING --jump MASQUERADE

################################################################################
############# Il ne faut pas rajouter de regles au-dela de ce point
############
################################################################################

# On enregistre toutes les infractions aux regles

$IPTABLES $1 --append FORWARD --jump LOG_DROP
$IPTABLES $1 --append INPUT --jump LOG_DROP
$IPTABLES $1 --append OUTPUT --jump LOG_DROP

# On active la retransmission de paquets

echo "1" > /proc/sys/net/ipv4/ip_forward



Avatar
Ronald
On Sun, 07 Mar 2004 08:13:31 +0000, Telga EL BARONO wrote:


Je vous transmets un extrait plus important de mon script. J'ai
l'impression de ne pas avoir compris quelques choses d'essentielles.

[...]

# On vide les tables de filtrages

$IPTABLES $1 --flush
$IPTABLES $1 --delete-chain
Il y a passage d'un argument au script et iptables?


# On cree une regle pour surveiller les infractions aux regles

$IPTABLES $1 --new-chain LOG_DROP
$IPTABLES $1 --append LOG_DROP --jump LOG --log-prefix '(drop) ' $IPTABLES
$1 --append LOG_DROP --match limit --limit 3/minute --limit-burst 3
--jump LOG --log-prefix '(drop) '
$IPTABLES $1 --append LOG_DROP --jump DROP

[...]


# On interdit tout par defaut

$IPTABLES $1 --policy INPUT DROP
$IPTABLES $1 --policy OUTPUT DROP
$IPTABLES $1 --policy FORWARD DROP
[...]

# On commence par interdire toute retransmission de paquets

$IPTABLES $1 --append FORWARD --in-interface $LOCALE_DEV
--out-interface $INTERNET_DEV --jump LOG_DROP
$IPTABLES $1 --append FORWARD --out-interface $LOCALE_DEV
--in-interface $INTERNET_DEV --jump LOG_DROP
Tous paquets arrivant de eth0 et routés vers ppp0 (et inversement)

est passé à la chaine LOG_DROP qui remplie son rôle c-a-d logue et
droppe le paquet donc le reste des règles pour la table FORWARD n'est
jamais vérifié.
Maintenant en supprimant la dernière règle de la chaine LOG_DROP, la
prochaine règle en FORWARD sera examinée, ou bien en déplaçant ces
deux règles après celles relatives au port 80. En ayant mis les cibles
par défaut en DROP elle est de toute façon inutile.
[...]
$IPTABLES $1 --append FORWARD --in-interface $LOCALE_DEV
--out-interface $INTERNET_DEV --jump LOC_TO_NET
$IPTABLES $1 --append FORWARD --out-interface $LOCALE_DEV
--in-interface $INTERNET_DEV --jump NET_TO_LOC
[...]

# On enregistre toutes les infractions aux regles

$IPTABLES $1 --append FORWARD --jump LOG_DROP $IPTABLES $1 --append
INPUT --jump LOG_DROP $IPTABLES $1 --append OUTPUT --jump LOG_DROP
Là encore tout est jeté à cause du DROP terminal de LOG_DROP, la règle

en FORWARD est redondante voire inutile puisque elle fait la même chose
que les deux premières règles.