3 votes

PF set condition for not equal to a list of ports for MacOS

J'aimerais définir une condition pour qu'une règle de pare-feu ne s'applique pas à une liste de ports, quelque chose comme ceci :

 table <my_table> persist file "/etc/pf.anchors/entries"
 set skip on lo
 block out quick proto { tcp, udp } from any to ! <my_table> port != { 66 80 } 

Cela donne une erreur de syntaxe lors de l'exécution de 'sudo pfctl -vnf /etc/pf.conf'.

Si je mets ce qui suit, cela fonctionne (en ne spécifiant qu'un seul port).

 block out quick proto { tcp, udp } from any to ! <my_table> port != 80

Comment puis-je spécifier une liste de ports avec l'opérateur "!=" ?

2voto

Prado Points 1415

Vous pouvez rendre la commande inverse logique.

D'abord Bloquer tout, puis ouvrir seulement ceux que vous voulez :

Le résultat est le même que celui que vous avez essayé d'obtenir en annulant tout sauf ceux qui ont été choisis pour être ouverts :)

set skip on lo
port_pass = "{ 80 66 53 22 }"
block all
pass out on en0 proto { tcp, udp } to any port $port_pass keep state

2voto

GreekFire Points 53

J'ai compris :

C'est en niant chaque port individuel, à l'intérieur du délimiteur { }.

 block out quick proto { tcp, udp } from any to ! <my_table> port { != 66, != 80 } 

J'ai trouvé la section 'op-list' pour spécifier le port ici : https://man.openbsd.org/pf.conf.5

Cela vous montre comment appliquer la logique d'ajouter plus de ports

2voto

poige Points 898

Il faut bien comprendre ce que Les "listes" de Pf sont. Ils ne font pas partie des règles qui sont chargées dans le noyau en fait, mais les macros à la place. Cela signifie qu'ils sont développés pendant la phase de prétraitement du chargement des règles - contrairement aux tableaux . En gardant cela à l'esprit, on évite de se "tirer dans le pied".

Voyons maintenant ce que vous essayez de faire :

block out quick proto { tcp, udp } from any to ! <my_table> port != { 66 80 } 
  • Bloc immédiatement Si
    • c'est TCP ou c'est UDP
    • ET il est destiné à
      • Les IP qui ne sont pas dans my_table
      • ET ports, qui ne sont pas dans la liste

Comme je vous l'ai dit Les éléments des listes seraient développés dans une règle distincte pour chaque élément de la liste. . Et cela casserait la logique que je viens d'expliquer : seul le premier port de la liste serait traité correctement, si vous bloquez immédiatement ( quick ), cela signifie évidemment qu'il n'y a pas de deuxième vérification - "port non autorisé, ok, le bloquer".

Pour maîtriser le jeu de règles du pare-feu, il vaut mieux garder les choses aussi simples que possible. En fait, ce n'est pas seulement pour les pare-feu - c'est du bon sens général et de la programmation. Les doubles négations, les exceptions des exceptions ne sont pas si simples à suivre.

Quelles sont vos options alors ? - Vous pouvez examiner les différents angles : que voulez-vous passer et quand voulez-vous le faire ?

# If it's destined to IP in <my_table> -- pass:
pass  out quick proto { tcp, udp } from any to <my_table>

# ElseIf it's to allowed ports -- pass:
pass  out quick proto { tcp, udp } to port { 66 80 }

# And this point would be reached only if it wasn't to <my_table>
# and to some ports other than allowed ones:
block out quick proto { tcp, udp }

Ce jeu de règles est en effet beaucoup plus lisible. De plus, l'expansion des macros ne gâche pas sa logique.

Bien sûr, Pf a d'autres moyens de résoudre cette tâche, mais les décrire tous correctement rendrait cette réponse beaucoup trop longue.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X