OVH Cloud OVH Cloud

HELP ! ipfw et natd

22 réponses
Avatar
ferdydurke
Bonjour,
je me trouve confronté à un problème avec natd et ipfw ; je me décide donc à
poster suite à plusieurs jours d'arrachage de cheveux...
Je tourne sous FreeBSD 4.8, avec deux interfaces ethernet : rl0 en DHCP
(connectée à un modem ADSL qui fait aussi serveur DHCP) et rl1 avec une IP
fixe 192.168.0.11 et qui sert de passerelle ADSL ou autre pour tout mon
réseau local. La translation d'adresse s'effectue bien, je n'ai aucun
problème de reconnexion à mon FAI, etc.
J'ai donc décidé de construire un pare-feu avec ipfw : handbook et diverses
docs de rigueur (onlamp, etc)... Ca marche bien, je suis content de mon
firewall, sauf... que je n'ai plus de connexion internet sur mon réseau
local ! plus de translation d'adresses ! plus de passerelle sur rl1 !
Quelqu'un peut m'aider ? regarder mes fichiers de configuration ci-dessous ?
Merci d'avance.

***LE RC.CONF :

gateway_enable="YES"

#firewall
firewall_enable="YES"
firewall_script="/etc/rc.firewall"
firewall_type="/etc/ipfw.rules" #"OPEN"
firewall_quiet="NO"
firewall_logging_enable="YES"

natd_program="/sbin/natd"
natd_enable="YES"
natd_interface="rl0"
natd_flags="-f /etc/natd.conf"

#extra firewalling options
log_in_vain="YES"
tcp_drop_synfin="YES"
icmp_drop_redirect="YES"
icmp_log_redirect="YES"

accounting_enable="YES"



***LE IPFW.RULES :

add 00050 divert natd all from any to any via rl0
add 00100 pass all from any to any via lo0
add 00200 deny all from any to 127.0.0.0/8
add 00300 deny ip from 127.0.0.0/8 to any

#from man 8 ipfw: allow only outbound TCP connections I've created
add 00301 check-state
add 00302 deny tcp from any to any in established
add 00303 allow tcp from any to any out setup keep-state

#allow DNS
add 00400 allow udp from 80.10.246.130 53 to any in recv rl0
add 00401 allow udp from any to any out

#allow DHCP
add 00501 allow udp from 81.249.237.84 67 to any 68 in via rl0
add 00502 allow udp from any 68 to 255.255.255.255 67 out via rl0
add 00503 allow udp from any 67 to 255.255.255.255 68 in via rl0

#allow some icmp types (codes not supported)
##########allow path-mtu in both directions
add 00600 allow icmp from any to any icmptypes 3

##########allow source quench in and out
add 00601 allow icmp from any to any icmptypes 4

##########allow me to ping out and receive response back
add 00602 allow icmp from any to any icmptypes 8 out
add 00603 allow icmp from any to any icmptypes 0 in

#########allow me to run traceroute
add 00604 allow icmp from any to any icmptypes 11 in


LES OPTIONS DU KERNEL :

options IPFIREWALL #firewall
options IPDIVERT #divert sockets
options IPFIREWALL_VERBOSE #print information about
#dropped packets
options IPFIREWALL_VERBOSE_LIMIT=10 #limit verbosity
options IPSTEALTH

10 réponses

1 2 3
Avatar
ferdydurke
Jacques Caron wrote:

On Tue, 25 Nov 2003 19:39:59 +0000 (UTC), Jean-Pierre PARISY
wrote:

Ce fichier est un shell-script, il doit être exécutable (chmod 744) et
chaque ligne doit commencer par "/sbin/ipfw".


Oui s'il est référencé par firewall_script, pas par firewall_type comme
c'est le cas ici.

Pour référence, rc.firewall:

[...]

case ${firewall_type} in

[... les cas prédéfinis ...]

*)
if [ -r "${firewall_type}" ]; then
${fwcmd} ${firewall_flags} ${firewall_type}
fi
;;
esac

[...]

Par contre il faut noter que rc.firewall ajoutera un certain nombre de
règles "tout seul", en parciulier celles relatives à natd, aux interfaces
loopback, etc. Il est donc prudent de vérifier le résultat avec ipfw show.

Ou effectivement utiliser un script shell à la palce de rc.firewall dans
firewall_script, mais on y perd un certain nombre d'automatismes.

Jacques.



oui c'est exactement ça, j'ai vérifié avec ipfw show :


00050 1030 378629 divert 8668 ip from any to any via rl0
00100 4 200 allow ip from any to any via lo0
00150 19 1915 allow ip from any to any via rl1
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
00301 0 0 check-state
00302 20 896 deny tcp from any to any in established
00303 789 351841 allow tcp from any to any keep-state out setup
00400 31 6070 allow udp from 80.10.246.130 53 to any in recv rl0
00401 50 8175 allow udp from any to any out
00501 0 0 allow udp from 81.249.237.84 67 to any 68 in recv rl0
00502 0 0 allow udp from any 68 to 255.255.255.255 67 out xmit rl0
00503 19 6023 allow udp from any 67 to 255.255.255.255 68 in recv rl0
00600 0 0 allow icmp from any to any icmptype 3
00601 0 0 allow icmp from any to any icmptype 4
00602 0 0 allow icmp from any to any out icmptype 8
00603 0 0 allow icmp from any to any in icmptype 0
00604 0 0 allow icmp from any to any in icmptype 11
65535 210 10702 deny ip from any to any


Avatar
ferdydurke
Jacques Caron wrote:

ipfw show te donnera l'état courant (le fichier indiqué donne l'état
pendant le daily run). En regardant ce qui augmente, tu verras quelle
règle bloque.


voici ipfw show :

00050 1030 378629 divert 8668 ip from any to any via rl0
00100 4 200 allow ip from any to any via lo0
00150 19 1915 allow ip from any to any via rl1
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
00301 0 0 check-state
00302 20 896 deny tcp from any to any in established
00303 789 351841 allow tcp from any to any keep-state out setup
00400 31 6070 allow udp from 80.10.246.130 53 to any in recv rl0
00401 50 8175 allow udp from any to any out
00501 0 0 allow udp from 81.249.237.84 67 to any 68 in recv rl0
00502 0 0 allow udp from any 68 to 255.255.255.255 67 out xmit rl0
00503 19 6023 allow udp from any 67 to 255.255.255.255 68 in recv rl0
00600 0 0 allow icmp from any to any icmptype 3
00601 0 0 allow icmp from any to any icmptype 4
00602 0 0 allow icmp from any to any out icmptype 8
00603 0 0 allow icmp from any to any in icmptype 0
00604 0 0 allow icmp from any to any in icmptype 11
65535 210 10702 deny ip from any to any


c'est la 303 qui bloque ? pourquoi ?

Avatar
ferdydurke
Laurent Lefevre wrote:

ferdydurke writes:

Dernière chose : c'est bien ipfw.rules qui est lu même si dans mon
rc.conf j'ai :
firewall_script="/etc/rc.firewall"
firewall_type="/etc/ipfw.rules" #"OPEN"


Bon... ya du boulot....

Ton fichier de conf du firewall, c'est /etc/ipfw.rules, c'est ce
fichier qui contient les regles d'ipfw.

Dans ton rc.conf, tu vires "firewall_type="/etc/ipfw.rules" #"OPEN"" ca
sort d'ou ce truc ? et tu met firewall_script="/etc/ipfw.rule" à la
place de firewall_script="/etc/rc.firewall"

il doit y avoir, hormis ta conf precedent le firewall, dans ton rc.conf:

firewall_enable="YES"
firewall_script="/etc/rc.firewall"
natd_enable="YES"
natd_program="/sbin/natd"
natd_interface="rl0"
natd_flags="-dynamic"
network_interface="tun0 rl0 rl1 lo0"

Prends le temps de lire les docs tranquillement....

Je ne crois pas qu'il y ait contradiction avec le DHCP et ce que je
raconte...



je ne vois pas pourquoi je devrais changer mon rc.conf (natd_flags est
différent c'est vrai), il marche bien comme ça, M. CARON a bien expliqué
pourquoi plus haut ; j'ai suivi une doc sur ipfw venant de onlamp.com, très
bien faites d'ailleurs, très pédagogique, seulement elle n'est valable que
pour un poste seul ; c'est d'ailleurs au niveau du natd que ça marche pas
pour moi, sinon je pense que le pare-feu est très bien ficelé comme ça...


Avatar
Jacques Caron
On Tue, 25 Nov 2003 22:30:36 +0100, ferdydurke wrote:

00050 1030 378629 divert 8668 ip from any to any via rl0
00100 4 200 allow ip from any to any via lo0
00150 19 1915 allow ip from any to any via rl1
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
00301 0 0 check-state
00302 20 896 deny tcp from any to any in established
00303 789 351841 allow tcp from any to any keep-state out setup
00400 31 6070 allow udp from 80.10.246.130 53 to any in recv rl0
00401 50 8175 allow udp from any to any out
00501 0 0 allow udp from 81.249.237.84 67 to any 68 in recv rl0
00502 0 0 allow udp from any 68 to 255.255.255.255 67 out xmit
rl0
00503 19 6023 allow udp from any 67 to 255.255.255.255 68 in recv rl0
00600 0 0 allow icmp from any to any icmptype 3
00601 0 0 allow icmp from any to any icmptype 4
00602 0 0 allow icmp from any to any out icmptype 8
00603 0 0 allow icmp from any to any in icmptype 0
00604 0 0 allow icmp from any to any in icmptype 11
65535 210 10702 deny ip from any to any


c'est la 303 qui bloque ? pourquoi ?


Ben non, la 303 c'est une allow, elle ne bloque pas (en tous cas pas
difrectement), c'est l'une des règles "deny" qui bloque, ou plutôt c'est
que tu n'as pas les allow qu'il faut, et ça finit dans le deny final.
Remplace tous les deny (en tous cas ceux qui sont utilisés, 302 et 65535)
par la même ligne avec "log" à la fin, vérifie que syslogd est bien
configuré, et tu verras les paquets rejetés, ça te permettra de trouver ce
qui cloche.

Un indice cependant: ta config indique (ligne 301) que tu n'acceptes des
paquets TCP avec le bit established que si tu as vu les paquets
d'établissement sortir (ligne 303), le reste étant interdit (ligne 302).
Problème: les paquets sortants seront vus après la translation NAT (donc
avec des adresses IP externes) et les paquets entrants après la
translation NAT aussi (donc avec des adresses IP internes, ce coup-ci).

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
ferdydurke
Jacques Caron wrote:

Ben non, la 303 c'est une allow, elle ne bloque pas (en tous cas pas
difrectement), c'est l'une des règles "deny" qui bloque, ou plutôt c'est
que tu n'as pas les allow qu'il faut, et ça finit dans le deny final.
Remplace tous les deny (en tous cas ceux qui sont utilisés, 302 et 65535)
par la même ligne avec "log" à la fin, vérifie que syslogd est bien
configuré, et tu verras les paquets rejetés, ça te permettra de trouver ce
qui cloche.


mon firewall ne marche plus, tout est bloqué si je rajoute "log" à la fin
d'une ligne dans "ipfw.rules"... Comment voir les paquets rejettés donc ?
je ne connais pas syslogd :-( je débute avec FreeBSD...


Un indice cependant: ta config indique (ligne 301) que tu n'acceptes des
paquets TCP avec le bit established que si tu as vu les paquets
d'établissement sortir (ligne 303), le reste étant interdit (ligne 302).
Problème: les paquets sortants seront vus après la translation NAT (donc
avec des adresses IP externes) et les paquets entrants après la
translation NAT aussi (donc avec des adresses IP internes, ce coup-ci).


Je n'ai pas trouvé :-( je ne suis pas bien là, je dois encore étudier tout
ça, je débute et c'est mon premier firewall...
Sinon peut-on se passer de ces lignes 300 ? ou plutôt ce firewall est-il
convenable, fiable, bien écrit ?
Ne vaut-il pas mieux travailler sur le rc.firewall uniquement ?

Avatar
Jacques Caron
On Wed, 26 Nov 2003 00:28:05 +0100, ferdydurke wrote:

mon firewall ne marche plus, tout est bloqué si je rajoute "log" à la fin
d'une ligne dans "ipfw.rules"...


Ah pardon, ce n'est pas à la fin mais entre le deny et le reste (cf man
ipfw).

Comment voir les paquets rejettés donc ?
je ne connais pas syslogd :-( je débute avec FreeBSD...


man syslogd, man syslog.conf et man ipfw pour les détails.

Normalement tu devrais avoir les paquets en question dans
/var/log/security.

Je n'ai pas trouvé :-( je ne suis pas bien là, je dois encore étudier
tout ça, je débute et c'est mon premier firewall...
Sinon peut-on se passer de ces lignes 300 ? ou plutôt ce firewall est-il
convenable, fiable, bien écrit ?


Ben vu qu'il marche pas, pas vraiment :-)

En fait, le problème est de savoir si tu veux protéger la machine
elle-même, ou seulement les machines sur le LAN. Pour ces dernières, le
NAT suffit. Pour la machine elle-même, si tu ne laisses pas traîner de
services inutiles et de CGI idiots, elle se gardera bien toute seule :-)

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
ferdydurke
Jacques Caron wrote:


Normalement tu devrais avoir les paquets en question dans
/var/log/security.



ernel: ipfw: 302 Deny TCP 193.252.117.12:80 81.51.202.74:2382 in via rl0
/kernel: ipfw: 302 Deny TCP 195.101.94.201:80 81.51.202.74:2384 in via rl0
/kernel: ipfw: 302 Deny TCP 193.149.121.11:80 81.51.202.74:2373 in via rl0
/kernel: ipfw: 302 Deny TCP 193.149.121.11:80 81.51.202.74:2405 in via rl0
/kernel: ipfw: 302 Deny TCP 195.101.94.201:80 81.51.202.74:2432 in via rl0
/kernel: ipfw: 302 Deny TCP 195.101.94.109:80 81.51.202.74:2434 in via rl0
/kernel: ipfw: 302 Deny TCP 195.101.94.109:80 81.51.202.74:2435 in via rl0
/kernel: ipfw: 302 Deny TCP 195.101.94.109:80 81.51.202.74:2436 in via rl0
/kernel: ipfw: 302 Deny TCP 193.252.117.12:80 81.51.202.74:2438 in via rl0
/kernel: ipfw: 302 Deny TCP 195.101.94.54:80 81.51.202.74:2437 in via rl0


Voilà le problème donc ? la ligne 302 avec le deny via rl0 ?
Par contre je fais quoi là ?
Je change quand même pas le deny par un allow via rl0 en ligne 302 ? Mon
paragraphe outbound TCP connections tomberait à l'eau non ?


Ben vu qu'il marche pas, pas vraiment :-)

En fait, le problème est de savoir si tu veux protéger la machine
elle-même, ou seulement les machines sur le LAN. Pour ces dernières, le
NAT suffit. Pour la machine elle-même, si tu ne laisses pas traîner de
services inutiles et de CGI idiots, elle se gardera bien toute seule :-)


Si j'arrive à le faire marcher ? c'est assez pour protéger machine et réseau
local ? ok pour le nat qui protège le LAN... ok pour les services inutiles.
Elle se gardera bien toute seule : ç veut dire que le firewall est inutile
et ne protège pas, quel qu'il soit, comme je l'ai entendu dire parfois, la
sécurité étant une lubie ?

Avatar
Jacques Caron
Salut,

On Wed, 26 Nov 2003 01:13:10 +0100, ferdydurke wrote:

/kernel: ipfw: 302 Deny TCP 195.101.94.54:80 81.51.202.74:2437 in via
rl0


Voilà le problème donc ? la ligne 302 avec le deny via rl0 ?


Oui, mais indirectement. Comme je le disais, le problème vient du fait que
les packets entrants et sortants ne sont pas traités dans le même "état"
(i.e. avec des adresses IP internes ou externes, suivant les cas), vu que
toutes les règles interviennent après le NAT.

Par contre je fais quoi là ?


Tu peux mettre le diver en "out xmit rl0" au début, et rajouter le même en
"in recv rl0" après les lignes 301-303, je pense que ça devrait régler le
problème. Tu peux aussi déplacer le NAT entre 302 et 303, ça devrait avoir
le même effet (et tu apprends tout d'un coup que c'est une bonne idée de
laisser de la place entre deux numéros...).

Je change quand même pas le deny par un allow via rl0 en ligne 302 ? Mon
paragraphe outbound TCP connections tomberait à l'eau non ?


C'est clair.

Elle se gardera bien toute seule : ç veut dire que le firewall est
inutile et ne protège pas, quel qu'il soit, comme je l'ai entendu
dire parfois, la sécurité étant une lubie ?


En général les gens qui mettent des gros firewalls dans tous les sens ils
laissent des trous béants à côté. C'est un peu comme en Egypte antique, où
il était plus simple de passer à travers le mur qu'à travers la porte :-)
Genre je mets un firewall qui filtre tout, sauf le port 80 vu que j'ai un
serveur web, et je laisse tourner des cgi qui peuvent tout casser. Un
grand classique.

En fait, ça dépend de ce que ta machine doit faire, mais si tu n'as pas de
services inutiles il y a peu d'attaques efficaces qu'un firewall saura
arrêter. Le firewall peut être utile pour protéger des machines "derrière"
elle, mais le NAT jouera le même rôle. Il peut être utile aussi si
certains services doivent être accessibles depuis les machines locales,
mais pas depuis l'extérieur, mais ne sachant pas quelle est la config de
ta machine et les services qu'elle doit rendre, je ne saurais me
prononcer...

Mais bon, y'en a qui adorent les firewalls :-)

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
ferdydurke
Jacques Caron wrote:

Tu peux mettre le diver en "out xmit rl0" au début, et rajouter le même en
"in recv rl0" après les lignes 301-303, je pense que ça devrait régler le
problème. Tu peux aussi déplacer le NAT entre 302 et 303, ça devrait avoir
le même effet (et tu apprends tout d'un coup que c'est une bonne idée de
laisser de la place entre deux numéros...).


J'ai essayé les deux possibilités mais ça ne marche pas :-(
Voilà le ipfw show :

00050 580 86992 divert 8668 ip from any to any out xmit rl0
00100 4 200 allow ip from any to any via lo0
00150 10 480 allow ip from any to any via rl1
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
00301 0 0 check-state
00302 15 13584 deny tcp from any to any in established
00303 930 324879 allow tcp from any to any keep-state out setup
00350 42 7151 divert 8668 ip from any to any in recv rl0
00400 28 5134 allow udp from 80.10.246.130 53 to any in recv rl0
00401 33 3381 allow udp from any to any out
00501 0 0 allow udp from 81.249.237.84 67 to any 68 in recv rl0
00502 0 0 allow udp from any 68 to 255.255.255.255 67 out xmit rl0
00503 5 1585 allow udp from any 67 to 255.255.255.255 68 in recv rl0
00600 0 0 allow icmp from any to any icmptype 3
00601 0 0 allow icmp from any to any icmptype 4
00602 0 0 allow icmp from any to any out icmptype 8
00603 0 0 allow icmp from any to any in icmptype 0
00604 0 0 allow icmp from any to any in icmptype 11
65535 9642 484246 deny ip from any to any

Je vais essayer de faire marcher celui-ci demain encore. Si c'est pas si
important que ça, je vais peut être faire un pare-feu plus simple...
Il est très tard, même si c'est passionnant les firewalls :-) dodo !
Merci infiniment, Jacques, pour vos lumières, bonne continuation.

Avatar
Sylvain Tertois
ferdydurke a écrit:
65535 9642 484246 deny ip from any to any
Ceux-là il faudrait les voir, il y en a beaucoup...


Tu peux ajouter une règle comme:
ipfw add 65534 deny log ip from any to any

et regarder dans /var/log/security les paquets qui sont rejetés par la règle
65534

--
Sylvain

1 2 3