Fichier de configuration pour PF sous FreeBSD

Bonjour à tous,

je me suis décidé récemment à utiliser mon NAS comme firewall / routeur pour remplacer ma freebox.

On m’a aidé pour la configuration du réseau chez moi, la configuration des adresses IP des 2 cartes réseau du NAS, et pour le choix de PF pour réaliser le filtrage / routage.

J’ai pas mal potassé la doc de PF, ainsi que 2/3 exemples que j’ai vu sur internet, mais je voulais avoir votre avis sur mon fichier pf.conf, avant de lancer le bouzin chez moi, et de tout planter :slight_smile:

Tout d’abord, voici ce que je veux avoir (du très standard je pense):

Bloquer tout le traffic venant de l’extérieur par défaut, et l’enregistrer
Me permettre depuis internet de me connecter sur mon webserver (qui est la même machine que le NAS, 192.168.0.1) via les port 80 et 443
Me permettre depuis internet de me connecter sur le NAS en SSH (donc port 22)
Me permettre depuis internet de me connecter sur le switch (192.168.0.2) sur le port 80
Pouvoir depuis le réseau local accéder à internet

Je suis arrivé à ce résultat:

[quote]# Configuration file for PF

Declaration of network interfaces

ext_inf = « xl0 »
int_inf = « nfe0 »
loop_inf = « lo »

Declaration of ports which shouldn’t be logged

ports_not_logged = « { netbios-ssn, microsoft-ds, epmap, ms-sql-s } »

ICMP types allowed

icmp_types = « { echoreq } »

Declaration of ports to redirect to the NAS

ports_to_webserver = « { 80, 443 } »
ports_to_nas = « { 22 } »
all_ports_to_nas = {" ports_to_nas + ports_to_webserver "}

Declaration of ports to redirect to the switch

ports_to_switch = « { 8080 } »

Declaration of hosts on the local network

nas = « 192.168.0.1 »
switch = « 192.168.0.2 »
desktop = « 192.168.0.10 »
laptop = « 192.168.0.11 »

Default answer for « block » filter rules

set block-policy return

Don’t work on the loopback interface

set skip on lo

Normalize ingoing packets

scrub in

NAT on local network

nat on $ext_inf from $int_inf to any → $ext_inf

Redirect communications to NAS from the external interface

rdr on $ext_inf proto tcp from any to any port $all_ports_to_nas → $nas

Redirect communications to the switch from the external interface

rdr on $ext_inf proto tcp from any to any port $ports_to_switch → $switch

Default block all packets coming from the outside

block in on $ext_inf log all
block in on $ext_inf inet proto tcp from any to any port $ports_not_logged

Filter all ingoing traffic

pass out keep state

Don’t filter packets on the internal interface

pass quick on $int_inf

Protection against address spoofing

antispoof quick for { lo $int_inf }

Open ports used by the NAS

pass in on $ext_inf inet proto tcp from any to $ext_if port $ports_to_nas flags S/SA keep state

Open ports used by the Webserver

pass in on $ext_inf proto tcp from any to $nas port $ports_to_nas flags S/SA synproxy state

Allow ICMP traffic

pass in on $ext_inf inet proto icmp all icmp-type $icmp_types[/quote]

Est-ce que ça vous semble OK? Si ce n’est pas le cas, qu’est-ce que vous conseilleriez de changer?

Merci d’avance

Mike

[quote=“Zoubi, post:1, topic: 49067”]# Redirect communications to NAS from the external interface
rdr on $ext_inf proto tcp from any to any port $all_ports_to_nas -> $nas[/quote]
Je serais curieux de savoir pourquoi tu nates le nas vers lui même (wan -> lan) ? Si tes services écoutent sur l’if wan, t’as pas besoin de nater.

OK. Dans les exemples que j’avais vu, le webserver était sur une autre machine, ou bien ils voulaient accéder en SSH à une autre machine que le gateway.

Sinon, ça te paraît pas trop mal comme config?

[quote=“Zoubi, post:1, topic: 49067”]# Declaration of ports to redirect to the NAS
ports_to_webserver = "{ 80, 443 }"
ports_to_nas = "{ 22 }“
all_ports_to_nas = {” ports_to_nas + ports_to_webserver "}[/quote]
La première chose que tu aurais pu faire avant de poster ici c’est de vérifier la syntaxe de ton pf.conf (avec pfctl -nf /etc/pf.conf, ça ne charge pas les règles mais vérifie juste si le fichier est correct).
Tu aurais vu que la partie citée ci-dessus n’est pas valide. Il faut que tu fasses quelques chose dans le genre :

ports_to_webserver = "80 443" ports_to_nas = "22" all_ports_to_nas = "{" $ports_to_nas $ports_to_webserver "}"

Normalement en lisant la partie sur les macros de la FAQ PF tu aurais dû le remarquer.

[quote=« kineox, post:4, topic: 49067 »]La première chose que tu aurais pu faire avant de poster ici c’est de vérifier la syntaxe de ton pf.conf (avec pfctl -nf /etc/pf.conf, ça ne charge pas les règles mais vérifie juste si le fichier est correct).
Tu aurais vu que la partie citée ci-dessus n’est pas valide. Il faut que tu fasses quelques chose dans le genre :

ports_to_webserver = "80 443" ports_to_nas = "22" all_ports_to_nas = "{" ports_to_nas ports_to_webserver "}"

Normalement en lisant la partie sur les macros de la FAQ PF tu aurais dû le remarquer.[/quote]

J’avais pas vu que je pouvais tester le fichier :slight_smile:

Mais dans l’exemple qu’ils donnent sur leur site, c’est comme j’ai fait pourtant

Mais j’ai des erreurs autre part, je vais voir ça.

Merci en tout cas pour ta réponse

Il faut aller chez l’ophtalmo là :slight_smile: A aucun endroit dans la page ils ne font une concaténation de deux macros avec un +.

Mmm en fait j’avais focalisé sur l’absence de { et } dans ports_to_server = « 80 443 » et pas sur le + manquant.

[quote=« kineox, post:4, topic: 49067 »]ports_to_webserver = "80 443" ports_to_nas = "22" all_ports_to_nas = "{" ports_to_nas ports_to_webserver "}"[/quote]

Pour ce qui est du +, j’ai vu ça , à la ligne IntNet = « { Residents+Guests } »

Le souci que j’avais était que j’avais écrit

au lieu de

En tout cas, je n’ai plus d’erreurs dans mon fichier ceci-dit :slight_smile:

Pour ce qui est du WIFI, les pcs qui se connectent au réseau avec le font sur un switch placé avant le NAS, donc je suppose que c’est transparent au niveau de PF? J’ai pas de règles spécifiques à mettre pour le WIFI?

PC -- ethernet -- | --> Switch --> NAS --> Internet PC -- WIFI ------

Bah ca dépend… Tu veux que les ordis wifi puissent faire la même chose que les ordis cuivre ?

En général, les AP wifi fonctionnement comme un bridge ; le réseau wifi est donc sur le même ségment Ethernet que le switch.

[quote=“unreal, post:8, topic: 49067”]Bah ca dépend… Tu veux que les ordis wifi puissent faire la même chose que les ordis cuivre ?

En général, les AP wifi fonctionnement comme un bridge ; le réseau wifi est donc sur le même ségment Ethernet que le switch.[/quote]

bah oui, même comportement pour les 2 types de connexions.

Par simple curiosité, qu’est-ce qui motiverait des règles différentes selon la connexion?

Je ne comprends pas comment cela est possible, le « + » n’est pas autorisé dans la grammaire.

D’ailleurs j’ai fait une petite erreur en recopiant sur mon exemple, il manque les $ pour obtenir le contenu des macros (j’ai édité mon post).
Pour l’absence d’accolades, c’était pour pouvoir ensuite construire la liste all_ports_to_nas. Le seul problème est que je n’avais pas fait attention que tu utilisais $ports_to_nas après (d’ailleurs il y a une erreur à un endroit, je suppose que c’est $ports_to_webserver que tu veux).

Si tu supprimes les rdr inutiles (vu que ton firewall, ton nas et ton webserver sont une seule et même machine), tu n’auras plus qu’une seule liste (nommée allowed_ports par exemple), ça sera plus simple. Et il n’y a aucun intérêt à séparer les ports pour utiliser synproxy pour ton serveur web, vu que c’est la même machine !

Bref, répète 100 fois : « Je ne copierais pas depuis un HOWTO sans réfléchir ». Puis relis la doc une nouvelle fois, et fais un pf.conf qui correspond à TON réseau, pas à ceux des auteurs des docs que tu lis sur le web.

Bah ça depend de tes besoins… Pour ma part, mon AP est configuré avec 2 SSID : un privé avec WPA et une grosse clef et un grand ouvert, si jamais des voisins veulent surfer sans payer un abo. Mais comme il ne faut pas déconner, l’accès ouvert est très fortement filtré en sortie.

Pour toi, ca se trouve que t’as des amis infectés de spambots qui viennent se connecter chez toi en wifi, et t’as pas trop envie que ton IP soit blacklistée de partout…

Bon, j’ai enfin un fichier qui fonctionne, excepté pour 1 point: la redirection du port 8080 vers le switch: impossible de me connecter desus aussi bien en local que depuis internet…

[quote]# Configuration file for PF

Declaration of network interfaces

ext_inf = "xl0"
int_inf = "nfe0"
loop_inf = “lo”

Declaration of ports and ips to use

ports_to_open_to_nas = “{ 22, 80, 443 }”

ports_to_switch = “8080”

ports_allowed_tcp = “{ 22, 80, 443, 8080 }”

bad_ports = "{ 69, 135, 137, 138, 139, 445, 524, 1433, 6000, 31337, 666, 12345 }"
no_route = “{ 127.0.0.1/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 255.255.255.255/32 }”

nas = "192.168.0.1"
switch = "192.168.0.2"
desktop = "192.168.0.10"
laptop = “192.168.0.11”

set block-policy return

set skip on $loop_inf
scrub in all

NAT RULES

nat on $ext_inf from $int_inf/24 to any -> $ext_inf

REDIRECTIONS

rdr on $ext_inf proto tcp from any to any port $ports_to_switch -> $switch

BLOCK ALL BY DEFAULT

block in

IMMEDIATE BLOCKS ON WEIRD PORTS OR SPOOFING ATTEMPTS

block in quick proto {udp,tcp } from any to any port $bad_ports
block in quick on $ext_inf from any to 255.255.255.255

block in quick on $ext_inf inet proto tcp all flags FUP/FUP
block in quick on $ext_inf inet proto tcp all flags SF/SFRA
block in quick on $ext_inf inet proto tcp all flags /SFRA

block in quick on $ext_inf inet from $no_route to any
block in quick on $ext_inf inet from any to $no_route

ALLOW OUTGOING TRAFFIC

pass out keep state

antispoof quick for { lo $int_inf }

pass in inet proto icmp all icmp-type echoreq keep state

ALLOW TRAFFIC FOR THE NAS AND THE SWITCH

pass in on $ext_inf inet proto tcp from any to any port $ports_allowed_tcp flags S/SA keep state

pass in quick on $int_inf[/quote]

Une idée?

[quote=“Zoubi, post:12, topic: 49067”]Bon, j’ai enfin un fichier qui fonctionne, excepté pour 1 point: la redirection du port 8080 vers le switch: impossible de me connecter desus aussi bien en local que depuis internet…

Une idée?[/quote]
Rajoute la directive “log” sur plus de règles et utilise pflog pour voir où ça bloque.