• [^] # Re: Alternative à Linux ?

    Posté par . En réponse à la dépêche Sortie de la 60e version d’OpenBSD. Évalué à 6 (+4/-0).

    Par exemple pf moi la syntaxe me rentre pas dans la tête. Je sais que le but c'est que ça ressemble à du langage naturel, mais je sais pas si c'est que mon niveau en anglais est pourri ou si c'est une sorte de vallée de l'étrange.

    Ben je ne sais pas pourquoi tu n'accroches pas mais honnetement, j'ai essayé IPFilter (puis Packet Filter plus tard), et honnetement je ne reviendrai jamais à IPTable ou dérivés. Mais comme tu le dis c'est peut-être un problème avec l'anglais ... D'ailleurs un exemple pour s'en convaincre.

    Le code Packet Filter :

    
    # Macros
    int_if="rl0"
    ports_ouverts_pour_tous="{ http https }"
    ports_ouverts_pour_lequipe="{ ssh 21 60000:60100 }"
    # Tables
    table <ip_de_lequipe> { XYZ.XYZ.XYZ.XYZ, XYZ.XYZ.XYZ.XYZ, XYZ.XYZ.XYZ.XYZ }
    # Normalisation du trafic
    scrub in no-df
    # NAT
    nat on egress -> (egress)
    # Règles de filtrage
    block in
    pass out keep state
    pass in on egress proto tcp from <ip_de_lequipe> to port $ports_ouverts_pour_lequipe
    pass in on egress proto tcp to port $ports_ouverts_pour_tous
    block in quick on $int_if proto tcp from $int_if:network to port 4662
    pass quick on !egress
    

    La même chose en iptable (issu de chatgpt donc à prendre avec des pincettes) :

    #!/bin/sh
    set -eu
    int_if="rl0"
    egress_if="eth0"
    int_net="192.168.1.0/24"
    ip1="XYZ.XYZ.XYZ.XYZ"
    ip2="XYZ.XYZ.XYZ.XYZ"
    ip3="XYZ.XYZ.XYZ.XYZ"
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    # Différence avec "scrub in no-df" : iptables n'a pas d'équivalent direct ; TCPMSS ne traite que le MSS TCP sur les paquets SYN routés.
    iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
    iptables -t nat -A POSTROUTING -o "$egress_if" -j MASQUERADE
    iptables -A INPUT -i "$int_if" -s "$int_net" -p tcp --dport 4662 -j DROP
    iptables -A FORWARD -i "$int_if" -s "$int_net" -p tcp --dport 4662 -j DROP
    iptables -A INPUT -i "$int_if" -j ACCEPT
    iptables -A FORWARD -i "$int_if" -j ACCEPT
    iptables -A INPUT -i "$egress_if" -p tcp -s "$ip1" -m multiport --dports 22,21,60000:60100 -j ACCEPT
    iptables -A INPUT -i "$egress_if" -p tcp -s "$ip2" -m multiport --dports 22,21,60000:60100 -j ACCEPT
    iptables -A INPUT -i "$egress_if" -p tcp -s "$ip3" -m multiport --dports 22,21,60000:60100 -j ACCEPT
    iptables -A INPUT -i "$egress_if" -p tcp -m multiport --dports 80,443 -j ACCEPT
    

    Avec nftables (toujours issu de chatgpt pour être transparent) :

    #!/usr/sbin/nft -f
    flush ruleset
    define int_if = "rl0"
    define egress_if = "eth0"
    define int_net = 192.168.1.0/24
    table inet firewall {
     set ip_de_lequipe {
     type ipv4_addr
     elements = { 198.51.100.10, 198.51.100.11, 198.51.100.12 }
     }
     set ports_ouverts_pour_tous {
     type inet_service
     elements = { 80, 443 }
     }
     set ports_ouverts_pour_lequipe {
     type inet_service
     flags interval
     elements = { 22, 21, 60000-60100 }
     }
     chain input {
     type filter hook input priority filter; policy drop;
     ct state established,related accept
     iifname "lo" accept
     iifname $int_if ip saddr $int_net tcp dport 4662 drop
     iifname != $egress_if accept
     iifname $egress_if ip saddr @ip_de_lequipe tcp dport @ports_ouverts_pour_lequipe accept
     iifname $egress_if tcp dport @ports_ouverts_pour_tous accept
     }
     chain forward {
     type filter hook forward priority filter; policy drop;
     ct state established,related accept
     iifname $int_if ip saddr $int_net tcp dport 4662 drop
     iifname != $egress_if accept
     iifname $egress_if ip saddr @ip_de_lequipe tcp dport @ports_ouverts_pour_lequipe accept
     iifname $egress_if tcp dport @ports_ouverts_pour_tous accept
     }
     chain output {
     type filter hook output priority filter; policy accept;
     }
    }
    table ip nat {
     chain postrouting {
     type nat hook postrouting priority srcnat; policy accept;
     oifname $egress_if masquerade
     }
    }
    table inet mangle {
     chain forward {
     type filter hook forward priority mangle; policy accept;
     # Différence avec "scrub in no-df" : nftables n'a pas d'équivalent direct complet ; cette règle ne traite que l'ajustement MSS TCP, pas la normalisation PF ni le retrait global du bit DF.
     tcp flags syn tcp option maxseg size set rt mtu
     }
    }
    

    Pour ma part je trouve que Packet Filter reste bien plus lisible et compréhensible que IPTable ou NFtable.