Traduction japonaise du manuel affiché par `` man nftables ''.
Outil de gestion du framework nft-Nftables pour le filtrage et la classification des paquets
nft [ -nNscae ] [ -I directory ] [ -f filename | -i | cmd ...]
nft -h
nft -v
nft est un outil de ligne de commande utilisé par le noyau Linux du framework nftables pour définir, gérer et inspecter les règles de filtrage et de classification des paquets.
Le sous-système du noyau Linux est connu sous le nom de nf_tables, où nf '' signifie
Netfilter ''.
Exécutez nft --help
pour voir un résumé complet des options.
- '', lire à partir de l'entrée standard. Le script nft doit commencer par
#! / Usr / sbin / nft -f ''.L'entrée est analysée ligne par ligne.
Si le dernier caractère sur une ligne (immédiatement avant le caractère de saut de ligne) est une barre oblique inverse ( \ '') sans guillemets, la ligne suivante est traitée comme une continuation. Plusieurs commandes sur la même ligne peuvent être séparées à l'aide d'un point-virgule (
; '').
Le symbole dièse (`` # '') démarre le commentaire. Tous les caractères suivants sur la même ligne sont ignorés.
Les identificateurs commencent par un caractère alphabétique (az, AZ), avec zéro ou plusieurs caractères alphanumériques (az, AZ, 0-9), une barre oblique (/
), une barre oblique inverse (\ '') et un trait de soulignement ( Il est suivi des caractères
_ '') et des points (. ''). Les identificateurs qui utilisent des caractères différents ou sont en conflit avec des mots-clés doivent être placés entre guillemets (
"
).
Vous pouvez utiliser l'instruction include pour lire d'autres fichiers.
Le répertoire dans lequel rechercher les fichiers d'inclusion peut être spécifié à l'aide de l'option -I / --includepath ''. Pour remplacer ce comportement, préfixez le chemin avec
. / '' Pour forcer les fichiers dans le répertoire de travail actuel (c'est-à-dire les chemins relatifs) à être inclus, ou utilisez le chemin absolu `` / ''. Spécifie l'emplacement du fichier représenté.
Si -I / --includepath
n'est pas spécifié, nft utilisera le répertoire par défaut spécifié lors de la compilation.
Ce répertoire par défaut peut être obtenu avec l'option -h / --help
.
L'instruction include prend en charge les symboles génériques habituels du shell (* '',
? '', []
).
Si un symbole générique est utilisé dans l'instruction include, aucune erreur ne se produira même s'il n'y a pas de correspondance pour l'instruction include.
Cela vous permet de spécifier un répertoire d'inclusion potentiellement vide, tel que ʻinclude / etc / firewall / rules / *
`.
Les correspondances génériques sont lues par ordre alphabétique.
Les fichiers commençant par un point (``. '') Ne correspondent pas dans l'instruction d'inclusion.
$variable
Les symboles de variable peuvent être définis à l'aide de l'instruction `` define ''. Les références de variable sont des expressions qui peuvent être utilisées pour initialiser d'autres variables. La portée de la définition est le bloc actuel et tous les blocs qu'il contient.
Exemple d'utilisation de variables
define int_if1 = eth0
define int_if2 = eth1
define int_ifs = { $int_if1, $int_if2 }
filter input iif $int_ifs accept
La famille d'adresses détermine le type de paquet traité. Pour chaque famille d'adresses, le noyau contient des hooks qui représentent des étapes spécifiques du processus de traitement des paquets. Ces hooks appellent nftables si les règles du hook existent.
Tous les identificateurs incluent une famille d'adresses car tous les objets nftables résident dans un espace de noms spécifique à une famille d'adresses. Si vous spécifiez un identifiant sans famille d'adresses, la famille ip est utilisée par défaut.
La famille d'adresses IPv4 / IPv6 / Inet gère IPv4, IPv6 ou les deux types de paquets. Ils contiennent cinq hooks à différentes étapes de traitement des paquets de la pile réseau.
crochet | La description |
---|---|
prerouting | Tous les paquets entrant dans le système sont traités par le crochet de prerouting. Il est appelé avant le processus de routage et est utilisé pour le filtrage précoce ou la modification des attributs de paquet qui affectent le routage. |
input | Les paquets livrés au système local sont traités par le hook d'entrée. |
forward | Les paquets transmis à un autre hôte sont traités par le hook avant. |
output | Les paquets envoyés par les processus locaux sont traités par le hook de sortie. |
postrouting | Tous les paquets quittant le système sont traités par le crochet de post-acheminement. |
La famille d'adresses ARP gère les paquets ARP envoyés et reçus par le système. Ceci est généralement utilisé pour modifier les paquets ARP pour le clustering.
crochet | La description |
---|---|
input | Les paquets livrés au système local sont traités par le hook d'entrée. |
output | Les paquets envoyés par le système local sont traités par le hook de sortie. |
La famille d'adresses de pont gère les paquets Ethernet qui transitent par le périphérique de pont.
La liste des hooks pris en charge est la même que celle de la famille d'adresses IPv4 / IPv6 / Inet ci-dessus.
La famille d'adresses Netdev gère les paquets en entrée.
crochet | La description |
---|---|
ingress | Tous les paquets entrant dans le système sont traités par ce hook. Appelé avant le gestionnaire de protocole de couche 3, il peut être utilisé pour le filtrage précoce et la régulation. |
{list | flush} ruleset [family]
export [ruleset] format
Le mot-clé ruleset
est utilisé pour identifier l'ensemble complet des tables, chaînes, etc. actuellement situées dans le noyau.
Les commandes d'ensemble de règles suivantes existent.
xml '', soit
json ''.Il est possible de limiter la liste et de vider uniquement des familles d'adresses spécifiques. Voir Famille d'adresses (#Address Family) ci-dessus pour une liste des noms de famille valides.
Notez que, contrairement aux attentes, la production produite par l'exportation ne peut pas être analysée par `` nft -f ''. Au lieu de cela, la sortie de la commande list sert cet objectif.
{add | create} table [family] table [ { flags flags } ]
{delete | list | flush} table [family] table
delete table [family] handle handle
Les tables sont des conteneurs pour les chaînes, les ensembles et les objets avec état.
Ils sont identifiés par leur famille d'adresse et leur nom.
La famille d'adresses doit être une parmi ip, ip6, inet, arp, bridge, netdev.
La famille d'adresses inet est une famille factice utilisée pour créer des tables hybrides IPv4 / IPv6.
Vous pouvez utiliser le mot-clé méta-expression nfproto
pour tester le contexte de la famille (IPv4 ou IPv6) dans lequel le paquet est traité.
Si aucune famille d'adresses n'est spécifiée, ip est utilisé par défaut.
La seule différence entre add et create est que create renvoie une erreur, tandis que add ne renvoie pas d'erreur si la table spécifiée existe déjà.
drapeau | La description |
---|---|
dormant | La table n'est pas évaluée(La chaîne de base n'est pas enregistrée) |
Exemple d'ajout, de modification ou de suppression d'une table
#Lancez nft en mode interactif
nft --interactive
#Créez une nouvelle table.
create table inet mytable
#Ajouter une nouvelle chaîne de base:Obtenir le paquet d'entrée
add chain inet mytable myin { type filter hook input priority 0; }
#Ajouter un seul compteur à la chaîne
add rule inet mytable myin counter
#Désactiver temporairement la table(Les règles ne sont pas évaluées)
add table inet mytable { flags dormant; }
#Réactiver le tableau:
add table inet mytable
{add | create} chain [family] table chain [ { type type hook hook [device device] priority priority ; [policy policy ;] } ]
{delete | list | flush} chain [family] table chain
delete chain [family] table handle handle
rename chain [family] table chain newname
Une chaîne est un conteneur de règles. Il existe deux types de chaînes, les chaînes de base et les chaînes régulières. La chaîne de base est le point d'entrée des paquets de la pile réseau. Les chaînes régulières peuvent être utilisées comme cibles de saut et sont utilisées pour une meilleure formation des règles.
Pour la chaîne de base, les paramètres type, hook et priorité sont requis.
type | famille | crochet | La description |
---|---|---|---|
filter | all | all | Type de chaîne standard qui peut être utilisé sans hésitation. |
nat | ip, ip6 | prerouting, input, output, postrouting | Ce type de chaîne effectue la traduction d'adresses réseau en fonction de l'entrée conntrack. Seul le premier paquet de la connexion passe réellement par cette chaîne. La règle est généralement une entrée conntrack créée(Par exemple, instruction NAT)Définissez les détails de. |
route | ip, ip6 | output | Si un paquet passe par ce type de chaîne et est sur le point de l'accepter, une nouvelle recherche d'itinéraire sera effectuée si la partie pertinente de l'en-tête IP a changé. Cela implémente un sélecteur de routage de politique, par exemple dans nftables. |
Hormis le cas particulier ci-dessus (par exemple, le type nat ne prend pas en charge les hooks avant, ou le type de route ne prend en charge que les hooks de sortie), il existe deux autres bizarreries notables.
La famille netdev ne prend en charge qu'une seule combinaison: le type de filtre et le hook d'entrée. La chaîne de base de cette famille existe pour chaque interface de réception, les paramètres de périphérique doivent donc également être présents.
La famille arp est une chaîne de type filtre qui ne prend en charge que les hooks d'entrée et de sortie.
Le paramètre `` priority '' accepte une valeur entière signée qui spécifie l'ordre dans lequel les chaînes avec la même valeur de hook sont traversées. L'ordre est croissant. Autrement dit, les valeurs de faible priorité ont priorité sur les valeurs élevées.
La chaîne de base vous permet également de définir des stratégies de chaîne. La politique définit ce qui arrive aux paquets qui ne sont pas explicitement acceptés ou rejetés par les règles prédéfinies. Les valeurs de politique prises en charge sont «accept» (par défaut) ou «drop».
[add | insert] rule [family] table chain [ {handle | position} handle | index index] statement...
replace rule [family] table chain handle handle statement...
delete rule [family] table chain handle handle
La règle est ajoutée à la chaîne de la table spécifiée. Si aucune famille n'est spécifiée, la famille ip sera utilisée. Une règle se compose de deux types de composants selon un ensemble de règles grammaticales. Expressions et déclarations.
Les commandes add et insert prennent en charge les spécificateurs de position arbitraires. Il s'agit d'un descripteur ou d'un index (à partir de zéro) d'une règle existante. En interne, l'emplacement de la règle est toujours identifié par le handle, et la conversion à partir de l'index se fait dans l'espace utilisateur. Si des changements simultanés de jeu de règles se produisent après la conversion, cela a deux implications potentielles. Si une règle est insérée ou supprimée avant la règle référencée, l'index de règle valide peut changer. Si la règle référencée est supprimée, la commande sera rejetée par le noyau, comme si un handle non valide était spécifié.
Exemple d'ajout d'une règle à la chaîne d'entrée de la table ip
# 'ip filter'Devrait
nft add rule filter output ip daddr 192.168.0.0/24 accept
#Même commande, un peu plus de détails
nft add rule ip filter output ip daddr 192.168.0.0/24 accept
Exemple de suppression d'une règle de la table inet
nft -a list ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
ct state established,related accept # handle 4
ip saddr 10.1.1.1 tcp dport ssh accept # handle 5
...
#Supprimer la règle de poignée 5.
nft delete rule inet filter input handle 5
nftables fournit deux types de concepts d'ensemble. Les ensembles anonymes sont des ensembles qui n'ont pas de nom spécifique. Les membres de l'ensemble sont placés entre accolades et les éléments sont séparés par des virgules lors de la création de règles qui utilisent l'ensemble. Lorsque la règle est supprimée, l'ensemble l'est aussi. Vous ne pouvez pas les mettre à jour. Autrement dit, une fois qu'un ensemble anonyme est déclaré, il ne peut être mis à jour que si les règles qui utilisent l'ensemble anonyme sont supprimées ou modifiées.
Un exemple d'acceptation d'un sous-réseau et d'un port spécifiques à l'aide d'un ensemble anonyme
nft add rule filter input ip saddr { 10.0.0.0/8, 192.168.0.0/16 } tcp dport { 22, 443 } accept
Les ensembles nommés sont le premier ensemble qui doit être défini avant de pouvoir être référencés dans une règle. Contrairement aux ensembles anonymes, les éléments peuvent être ajoutés ou supprimés des ensembles nommés à tout moment. L'ensemble est référencé par la règle avec le nom de l'ensemble précédé de `` @ ''.
Un exemple d'acceptation d'une adresse et d'un port à l'aide d'un ensemble nommé
nft add rule filter input ip saddr @allowed_hosts tcp dport @allowed_ports accept
Les ensembles ʻallowed_hosts`` et
ʻallowed_ports`` doivent être créés en premier.
La section suivante détaille la syntaxe de l'ensemble nft.
add set [family] table set { type type ; [flags flags ;] [timeout timeout ;] [gc-interval gc-interval ;] [elements = { element[,...] } ;] [size size ;] [policy policy ;] [auto-merge auto-merge ;] }
{delete | list | flush} set [family] table set
delete set [family] table handle handle
{add | delete} element [family] table set { element[,...] }
Un ensemble est un conteneur d'éléments d'un type de données défini par l'utilisateur qui est identifié de manière unique par un nom défini par l'utilisateur et attaché à une table.
mot-clé | La description | type |
---|---|---|
type | Définir le type de données d'élément | Chaîne: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark |
flags | Définir le drapeau | Chaîne: constant, interval, timeout |
timeout | Durée pendant laquelle un élément reste dans l'ensemble. L'ensemble est le chemin du paquet(Ensemble de règles)Obligatoire si ajouté à partir de. | Chaîne:Unité après le nombre décimal(d, h, m, s)Est ajouté. |
gc-interval | Intervalle de collecte des ordures. Uniquement disponible lorsque le délai d'expiration ou le délai d'expiration du drapeau est actif | Chaîne:Unité après le nombre décimal(d, h, m, s)Est ajouté. |
elements | Éléments inclus dans l'ensemble | Définissez le type de données. |
size | Nombre maximum d'éléments dans l'ensemble. L'ensemble est le chemin du paquet(Ensemble de règles)Obligatoire si ajouté à partir de. | Entier non signé(64 bits) |
policy | Définissez la politique. | Chaîne: performance [default], memory |
auto-merge | adjacent/Fusion automatique des éléments de jeu en double(intervalle défini uniquement) |
add map [family] table map { type type [flags flags ;] [elements = { element[,...] };] [size size ;] [policy policy ;] }
{delete | list | flush} map [family] table map
{add | delete} element [family] table map { elements = { element[,...] } ; }
Les cartes stockent des données basées sur une clé spécifique utilisée comme entrée, sont identifiées de manière unique par un nom défini par l'utilisateur et sont attachées à une table.
mot-clé | La description | type |
---|---|---|
type | Type de données d'élément de carte | key_name:value Spécifiez au format. Types pouvant être utilisés comme valeurs: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark, counter, quota。 couter Quandquota Ne peut pas être utilisé comme nom de clé. |
flags | Drapeau de la carte | Chaîne: constant, interval |
elements | Éléments inclus dans la carte | Type de données cartographiques |
size | Nombre maximum d'éléments dans la carte | Entier non signé(64 bits) |
policy | Politique de la carte | Chaîne: performance [default], memory |
{add | create} flowtable [family] table flowtable { hook hook priority priority ; devices = { device[,...] } ; }
{delete | list} flowtable [family] table flowtable
Les tableaux de flux peuvent être utilisés pour accélérer le transfert de paquets dans le logiciel. Les entrées de la table de flux sont représentées par un tuple composé d'une interface d'entrée, des adresses source et de destination, des ports source et de destination; protocole de couche 3/4. Chaque entrée met en cache l'interface de destination et l'adresse de la passerelle, met à jour l'adresse de la couche de liaison de destination et transmet le paquet. Les champs ttl et hoplimit sont également réduits. La table de flux fournit donc un chemin alternatif qui permet au paquet de contourner le chemin de transmission traditionnel. La table de flux se trouve sur le crochet d'entrée devant le crochet de pré-acheminement. Flux de la chaîne avant Vous pouvez utiliser l'expression de déchargement pour sélectionner le flux à décharger. Les tableaux de flux sont identifiés par leur famille d'adresses et leur nom. La famille d'adresses doit être ip, ip6 ou inet. La famille d'adresses inet est une famille factice utilisée pour créer des tables hybrides IPv4 / IPv6. Si aucune famille d'adresses n'est spécifiée, ip est utilisé par défaut.
{add | delete | list | reset} type [family] table object
delete type [family] table handle handle
Les objets avec état sont attachés à la table et identifiés par un nom unique.
Ils regroupent les informations avec état de la règle et le mot-clé nom de type '' est utilisé pour y faire référence dans la règle. Exemple:
nom du compteur ''.
CT
ct helper helper { type type protocol protocol ; [l3proto family ;] }
ct helper est utilisé pour définir un assistant de suivi de connexion qui peut être utilisé en combinaison avec l'instruction ct helper set ''. le type et le protocole sont requis.
l3proto`` est dérivé de la famille de tables par défaut.
Autrement dit, si le noyau le prend en charge, le noyau essaiera de charger les backends d'assistance IPv4 et IPv6 dans la table inet.
mot-clé | La description | type |
---|---|---|
type | Nom du type d'assistance | Chaîne citée(Exemple: "ftp") |
protocol | Protocole Helper Layer 4 | Chaîne(Exemple: tcp) |
l3proto | Protocole Helper Layer 3 | Famille d'adresses(Exemple: ip) |
Définition et affectation de l'assistance FTP
Contrairement à iptables, les affectations d'assistance doivent être effectuées, par exemple, avec la priorité de hook par défaut 0 une fois la recherche conntrack terminée.
table inet myhelpers {
ct helper ftp-standard {
type "ftp" protocol tcp
}
chain prerouting {
type filter hook prerouting priority 0;
tcp dport 21 ct helper set "ftp-standard"
}
}
counter [packets bytes]
mot-clé | La description | type |
---|---|---|
packets | Nombre initial de paquets | Entier non signé(64 bits) |
bytes | Nombre initial d'octets | Entier non signé(64 bits) |
quota [over | until] [used]
mot-clé | La description | type |
---|---|---|
quota | Limite de quota. Utilisé comme nom de quota. | Entier non signé(64 bits)Et la corde(bytes, kbytes, mbytes)Spécifiez les deux arguments de.over Quanduntil Est avant ces arguments |
used | Valeur initiale du quota utilisé | Entier non signé(64 bits)Et la corde(bytes, kbytes, mbytes)Spécifiez les deux arguments de. |
L'expression représente la valeur d'une constante telle qu'une adresse réseau ou un numéro de port, ou les données collectées à partir du paquet lors de l'évaluation de l'ensemble de règles. Vous pouvez combiner des expressions à l'aide d'expressions binaires, logiques, relationnelles et autres pour former des expressions complexes ou relationnelles (correspondance). Ils sont également utilisés comme arguments pour certains types d'opérations, comme le NAT et le marquage de paquets.
Chaque expression a un type de données, qui détermine la taille, l'analyse, la représentation et la compatibilité de type de la valeur symbolique avec d'autres expressions.
describe expression
La commande `` décrire '' affiche des informations sur le type d'expression et son type de données.
$ nft describe tcp flags
payload expression, datatype tcp_flag (TCP flag) (basetype bitmask, integer), 8 bits
predefined symbolic constants:
fin 0x01
syn 0x02
rst 0x04
psh 0x08
ack 0x10
urg 0x20
ecn 0x40
cwr 0x80
Le type de données détermine la taille, l'analyse, la représentation et la compatibilité du type d'expression des valeurs symboliques. Il existe plusieurs types de données globales, et certains types d'expression définissent des types de données supplémentaires spécifiques à ce type d'expression. La plupart des types de données sont de taille fixe, mais certains sont de taille dynamique. (Exemple: type de chaîne)
Les types peuvent être dérivés de types d'ordre inférieur. Le type d'adresse IPv4 est dérivé du type entier. Autrement dit, vous pouvez également spécifier l'adresse IPv4 sous forme de valeur entière.
Dans certains contextes (définitions d'ensemble et de mappage), vous devez spécifier explicitement le type de données. Chaque type a un nom utilisé pour cela.
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
Integer | integer | variable | - |
Le type entier est utilisé pour les nombres. Vous pouvez le spécifier en décimal, hexadécimal ou octal. Le type entier n'est pas de taille fixe, sa taille est déterminée par l'expression utilisée.
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
Bitmask | bitmask | variable | integer |
Le type de masque de bits (masque de bits) est utilisé pour le masque de bits.
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
String | string | variable | - |
Le type chaîne est utilisé pour les chaînes.
La chaîne commence par un caractère alphabétique (a-zA-Z), suivi de zéro ou plusieurs caractères alphanumériques ou caractères et symboles (/
, -
, _
, .
. ) Suit.
De plus, tout ce qui est entre guillemets (") est reconnu comme une chaîne.
Spécification du type de chaîne de caractères
#Nom de l'interface
filter input iifname eth0
#Nom d'interface étrange
filter input iifname "(eth0)"
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
Link layer address | lladdr | variable | integer |
Le type d'adresse de couche liaison est utilisé pour les adresses de couche liaison. Les adresses de couche liaison sont spécifiées sous la forme d'un groupe de nombres variables hexadécimaux à deux chiffres séparés par deux points (:).
Adressage de la couche de liaison
#Adresse MAC de destination Ethernet
filter input ether daddr 20:c9:d0:43:12:d9
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
IPv4 address | ipv4_addr | 32 bits | integer |
Le type d'adresse IPv4 est utilisé pour les adresses IPv4. L'adresse peut être spécifiée sous forme de nom décimal, hexadécimal pointillé, octogone pointillé, décimal, hexadécimal, octal ou d'hôte. Les noms d'hôte sont résolus à l'aide d'un résolveur système standard.
Spécification d'adresse IPv4
#Notation décimale par points
filter output ip daddr 127.0.0.1
#nom d'hôte
filter output ip daddr localhost
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
IPv6 address | ipv6_addr | 128 bits | integer |
Le type d'adresse IPv6 est utilisé pour les adresses IPv6. L'adresse est spécifiée sous la forme d'un nom d'hôte ou d'un demi-mot hexadécimal séparé par deux-points. Les adresses peuvent être placées entre crochets (`` [] '') pour les distinguer des numéros de port.
Spécifier une adresse IPv6
#Adresse de bouclage omise
filter output ip6 daddr ::1
#Spécification d'une adresse IPv6 à l'aide de la notation entre crochets
# []Aucun numéro de port(22)Est analysé dans le cadre de l'adresse ipv6.
ip6 nat prerouting tcp dport 2222 dnat to [1ce::d0]:22
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
Boolean | boolean | 1 bit | integer |
Les types booléens sont des types d'assistance de syntaxe dans l'espace utilisateur. C'est le côté droit de l'expression relationnelle (généralement implicite) et il est utilisé pour changer l'expression du côté gauche en une vérification de valeur booléenne (généralement «existe»).
Les mots-clés suivants sont automatiquement résolus en un type booléen avec la valeur spécifiée.
mot-clé | valeur |
---|---|
exists | 1 |
missing | 0 |
La formule suivante prend en charge les comparaisons booléennes.
formule | mouvement |
---|---|
fib | Vérifiez l'existence de l'itinéraire. |
exthdr | Vérifiez l'existence d'en-têtes d'extension IPv6. |
tcp option | Vérifiez l'existence d'en-têtes d'options TCP. |
#Correspondre si l'itinéraire existe
filter input fib daddr . iif oif exists
#Correspond uniquement aux paquets non fragmentés de trafic IPv6
filter input exthdr frag missing
#Correspondance si l'option d'horodatage TCP est présente
filter input tcp option timestamp exists
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
ICMP Type | icmp_type | 8 bits | integer |
Le type ICMP est utilisé pour spécifier facilement le champ type dans l'en-tête ICMP.
Vous pouvez utiliser les mots-clés suivants lors de la spécification du type ICMP:
mot-clé | valeur |
---|---|
echo-reply | 0 |
destination-unreachable | 3 |
source-quench | 4 |
redirect | 5 |
echo-request | 8 |
router-advertisement | 9 |
router-solicitation | 10 |
time-exceeded | 11 |
parameter-problem | 12 |
timestamp-request | 13 |
timestamp-reply | 14 |
info-request | 15 |
info-reply | 16 |
address-mask-request | 17 |
address-mask-reply | 18 |
Spécification du type ICMP
#Match ping paquet
filter output icmp type { echo-request, echo-reply }
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
ICMP Code | icmp_code | 8 bits | integer |
Le type de code ICMP est utilisé pour spécifier facilement le champ de code dans l'en-tête ICMP.
Vous pouvez utiliser les mots-clés suivants lors de la spécification du code ICMP:
mot-clé | valeur |
---|---|
net-unreachable | 0 |
host-unreachable | 1 |
prot-unreachable | 2 |
port-unreachable | 3 |
net-prohibited | 9 |
host-prohibited | 10 |
admin-prohibited | 13 |
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
ICMPv6 Type | icmpv6_type | 8 bits | integer |
Le type de type ICMPv6 est utilisé pour spécifier facilement le champ de type dans l'en-tête ICMPv6.
Vous pouvez utiliser les mots-clés suivants lors de la spécification du type ICMPv6:
mot-clé | valeur |
---|---|
destination-unreachable | 1 |
packet-too-big | 2 |
time-exceeded | 3 |
parameter-problem | 4 |
echo-request | 128 |
echo-reply | 129 |
mld-listener-query | 130 |
mld-listener-report | 131 |
mld-listener-done | 132 |
mld-listener-reduction | 132 |
nd-router-solicit | 133 |
nd-router-advert | 134 |
nd-neighbor-solicit | 135 |
nd-neighbor-advert | 136 |
nd-redirect | 137 |
router-renumbering | 138 |
ind-neighbor-solicit | 141 |
ind-neighbor-advert | 142 |
mld2-listener-report | 143 |
Spécification du type ICMPv6
#Faire correspondre le paquet ping ICMPv6
filter output icmpv6 type { echo-request, echo-reply }
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
ICMPv6 Code | icmpv6_code | 8 bits | integer |
Le type de code ICMPv6 est utilisé pour spécifier facilement les champs de code dans l'en-tête ICMPv6.
Vous pouvez utiliser les mots-clés suivants lors de la spécification du code ICMPv6:
mot-clé | valeur |
---|---|
no-route | 0 |
admin-prohibited | 1 |
addr-unreachable | 3 |
port-unreachable | 4 |
policy-fail | 5 |
reject-route | 6 |
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
ICMPvX Code | icmpx_code | 8 bits | integer |
L'abstraction de type de code ICMPvX est un ensemble de valeurs dupliquées entre les types de code ICMP et ICMPv6 utilisés dans la famille inet.
Vous pouvez utiliser les mots-clés suivants lors de la spécification du code ICMPvX:
mot-clé | valeur |
---|---|
no-route | 0 |
port-unreachable | 1 |
host-unreachable | 2 |
admin-prohibited | 3 |
Ceci est un aperçu des types utilisés dans les expressions et instructions ct.
Nom | mot-clé | Taille | Type de base |
---|---|---|---|
conntrack state | ct_state | 4 octets | bitmask |
conntrack direction | ct_dir | 8 bits | integer |
conntrack status | ct_status | 4 octets | bitmask |
conntrack event bits | ct_event | 4 octets | bitmask |
conntrack label | ct_label | 128 bits | bitmask |
Vous pouvez utiliser des mots clés par commodité pour chacun des types ci-dessus.
conntrack state(ct_state)
mot-clé | valeur |
---|---|
invalid | 1 |
established | 2 |
related | 4 |
new | 8 |
untracked | 64 |
conntrack direction(ct_dir)
mot-clé | valeur |
---|---|
original | 0 |
reply | 1 |
conntrack status(ct_status)
mot-clé | valeur |
---|---|
expected | 1 |
seen-reply | 2 |
assured | 4 |
confirmed | 8 |
snat | 16 |
dnat | 32 |
dying | 512 |
conntrack event bits(ct_event)
mot-clé | valeur |
---|---|
new | 1 |
related | 2 |
destroy | 4 |
reply | 8 |
assured | 16 |
protoinfo | 32 |
helper | 64 |
mark | 128 |
seqadj | 256 |
secmark | 512 |
label | 1024 |
Les mots-clés qui peuvent être spécifiés pour le type d'étiquette conntrack (ct_label) sont lus à partir de / etc / connlabel.conf
au moment de l'exécution.
L'expression de niveau le plus bas est une expression linéaire qui représente une charge utile de paquet, des métadonnées ou des données constantes ou uniques d'un module avec état.
meta {length | nfproto | l4proto | protocol | priority}
[meta] {mark | iif | iifname | iiftype | oif | oifname | oiftype | skuid | skgid | nftrace | rtclassid | ibrname | obrname | pkttype | cpu | iifgroup | oifgroup | cgroup | random | secpath}
Une méta expression est les métadonnées associées à un paquet.
Il existe deux types de méta-expressions: les méta-expressions non modifiées et les méta-expressions modifiées.
Une méta expression qualifiée nécessite le mot clé meta '' avant le metakey. Les méta-expressions non qualifiées vous permettent de spécifier la méta-expression directement ou en tant que méta-expression qualifiée.
meta l4proto '' aide à faire correspondre les protocoles de transport spécifiques qui font partie des paquets IPv4 ou IPv6.
Il ignore également les en-têtes d'extension IPv6 présents dans les paquets IPv6.
mot-clé | La description | type |
---|---|---|
length | Longueur du paquet(Travail à temps partiel) | integer(32 bits) |
nfproto | La famille de protocoles de crochet actuelle. Uniquement utile pour les tables inet | integer(32 bits) |
l4proto | Protocole de couche 4. Ignorer l'en-tête de l'extension ipv6 | integer(8 bits) |
protocol | Valeur du protocole EtherType | ether_type |
priority | Priorité des paquets TC | tc_handle |
mark | Marque de paquet | mark |
iif | Index d'interface d'entrée | iface_index |
iifname | Nom de l'interface d'entrée | ifname |
iiftype | Type d'interface d'entrée | iface_type |
oif | Index de l'interface de sortie | iface_index |
oifname | Nom de l'interface de sortie | ifname |
oiftype | Type de matériel d'interface de sortie | iface_type |
skuid | UID associé au socket d'origine | uid |
skgid | GID associé au socket d'origine | gid |
rtclassid | Domaine de routage | realm |
ibrname | Nom de l'interface du pont d'entrée | ifname |
obrname | Nom de l'interface du pont de sortie | ifname |
pkttype | Type de paquet | pkt_type |
cpu | Numéro de processeur pour traiter le paquet | integer(32 bits) |
iifgroup | Groupe d'appareils de réception | devgroup |
oifgroup | Groupe d'appareils d'envoi | devgroup |
cgroup | ID du groupe de contrôle | integer(32 bits) |
random | Nombre pseudo aléatoire | integer(32 bits) |
secpath | Valeur booléenne | boolean(1 bit) |
type | La description |
---|---|
iface_index | Index d'interface(Numéro 32 bits).. Il peut s'agir d'un numéro ou du nom d'une interface existante. |
ifname | Nom de l'interface(Chaîne de 16 octets).. Non requis. |
iface_type | Type d'interface(Numéro 16 bits)。 |
uid | IDENTIFIANT D'UTILISATEUR(Numéro 32 bits).. Il peut être spécifié sous forme de numéro ou de nom d'utilisateur. |
gid | ID de groupe(Numéro 32 bits).. Peut être spécifié sous forme de numéro ou de nom de groupe. |
realm | Domaine de routage(Numéro 32 bits).. Valeur numérique, ou/etc/iproute2/rt_realms Il peut être spécifié comme nom de symbole défini dans. |
devgroup_type | Groupe d'appareils(Numéro 32 bits).. Valeur numérique ou/etc/iproute2/group Il peut être spécifié sous forme de nom de symbole défini dans. |
pkt_type | Type de paquet:Unicast(À l'hôte local),diffuser(À tout le monde), Multiplier(Au groupe)。 |
Exemple d'utilisation de méta expression
#Méta-expression modifiée
filter output meta oif eth0
#Méta-expression non qualifiée
filter output oif eth0
#Pack qui était la cible du traitement ipsec
raw prerouting meta secpath exists accept
fib {saddr | daddr | {mark | iif | oif}} {oif | oifname | type}
L'expression fib interroge fib (base d'informations de transfert) pour obtenir des informations telles que l'index d'interface de sortie utilisé par une adresse particulière. L'entrée est un tuple d'éléments utilisés comme entrée dans la fonction de recherche fib.
mot-clé | La description | type |
---|---|---|
oif | Index de l'interface de sortie | integer(32 bits) |
oifname | Nom de l'interface de sortie | string |
type | Type d'adresse | fib_addrtype |
Exemple d'utilisation de formule FIB
#Déposer des paquets sans chemin inverse
filter prerouting fib saddr . iif oif missing drop
#Déposer les paquets vers des adresses qui ne sont pas configurées sur l'interface
filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop
#spécifique'blackhole'Effectuer une recherche sur la table( 0xdead,Nécessite des règles IP appropriées)
filter prerouting meta mark set 0xdead fib daddr . mark type vmap { blackhole : drop, prohibit : jump prohibited, unreachable : drop }
rt {classid | nexthop}
Une expression de routage fait référence aux données de routage associées à un paquet.
mot-clé | La description | type |
---|---|---|
classid | Domaine de routage | realm |
nexthop | Routage du prochain saut | ipv4_addr / ipv6_addr |
mtu | Taille maximale du segment TCP racine | integer(16 bits) |
type | La description |
---|---|
realm | Domaine de routage(Numéro 32 bits).. Numériquement ou/etc/iproute2/rt_realms Il peut être spécifié comme nom de symbole défini dans. |
Exemple d'utilisation d'une expression de routage
#Expression RT indépendante de la famille IP
filter output rt classid 10
#Expression rt dépendante de la famille IP
ip filter output rt nexthop 192.168.0.1
ip6 filter output rt nexthop fd00::1
inet filter output rt ip nexthop 192.168.0.1
inet filter output rt ip6 nexthop fd00::1
L'expression de charge utile fait référence aux données de la charge utile du paquet.
ether [Ethernet header field]
mot-clé | La description | type |
---|---|---|
daddr | Adresse MAC de destination | ether_addr |
saddr | Adresse MAC source | ether_addr |
type | EtherType | ether_type |
vlan [VLAN header field]
mot-clé | La description | type |
---|---|---|
id | VLAN ID(VID) | integer(12 bits) |
cfi | Canonical Format Indicator | integer(1 bit) |
pcp | Priority code point | integer(3 bits) |
type | EtherType | ether_type |
arp [ARP header field]
mot-clé | La description | type |
---|---|---|
htype | Type de matériel ARP | integer(16 bits) |
ptype | EtherType | ether_type |
hlen | Longueur d'adresse matérielle | integer(8 bits) |
plen | Longueur d'adresse de protocole | integer(8 bits) |
operation | opération | arp_op |
ip [IPv4 header field]
mot-clé | La description | type |
---|---|---|
version | Version de l'en-tête IP(4) | integer(4 bits) |
hdrlength | Longueur d'en-tête IP, options comprises | integer(4 bits)Mise à l'échelle FIXME |
dscp | Differentiated Services Code Point | dscp |
ecn | Notification de congestion explicite(Explicit Congestion Notification) | ecn |
length | Longueur totale des paquets | integer(16 bits) |
id | IP ID | integer(16 bits) |
frag-off | Décalage de fragment | integer(16 bits) |
ttl | Temps de survie(Time to live) | integer(8 bits) |
protocol | Protocole de couche supérieure | inet_proto |
checksum | Somme de contrôle de l'en-tête IP | integer(16 bits) |
saddr | Adresse source | ipv4_addr |
daddr | adresse de destination | ipv4_addr |
icmp [ICMP header field]
mot-clé | La description | type |
---|---|---|
type | Champ de type ICMP | icmp_type |
code | Champ de code ICMP | integer(8 bits) |
checksum | Champ de somme de contrôle ICMP | integer(16 bits) |
id | Demande d'écho/ID de réponse | integer(16 bits) |
sequence | Demande d'écho/Numéro de séquence de la réponse | integer(16 bits) |
gateway | Rediriger la passerelle | integer(32 bits) |
mtu | MTU Path d'exploration MTU | integer(16 bits) |
ip6 [IPv6 header field]
Cette expression fait référence au champ d'en-tête ipv6. Notez que lorsque vous utilisez «ip6 nexthdr», la valeur se réfère uniquement à l'en-tête suivant. Autrement dit, «ip6 nexthdr tcp» ne correspondra que si le paquet ipv6 ne contient pas d'en-tête d'extension. Il ne sera pas mis en correspondance s'il contient des paquets fragmentés ou des en-têtes d'extension de routage. Utilisez `` meta l4proto '' si vous souhaitez faire correspondre l'en-tête de transport réel et ignorer plutôt l'en-tête d'extension supplémentaire.
mot-clé | La description | type |
---|---|---|
version | Version de l'en-tête IP(6) | integer(4 bits) |
dscp | Differentiated Services Code Point | dscp |
ecn | Notification de congestion explicite(Explicit Congestion Notification) | ecn |
flowlabel | Étiquette de flux | integer(20 bits) |
length | Longueur de la charge utile | integer(16 bits) |
nexthdr | protocole nexthdr | inet_proto |
hoplimit | Limite de saut | integer(8 bits) |
saddr | Adresse source | ipv6_addr |
daddr | adresse de destination | ipv6_addr |
Correspondre si le premier en-tête d'extension pointe vers un fragment
ip6 nexthdr ipv6-frag counter
icmpv6 [ICMPv6 header field]
mot-clé | La description | type |
---|---|---|
type | Champ de type ICMPv6 | icmpv6_type |
code | Champ de code ICMPv6 | integer(8 bits) |
checksum | Champ de somme de contrôle ICMPv6 | integer(16 bits) |
parameter-problem | Pointeur vers le problème | integer(32 bits) |
packet-too-big | MTU surdimensionné | integer(32 bits) |
id | Demande d'écho/ID de réponse | entier(16 bits) |
sequence | Demande d'écho/Numéro de séquence de la réponse | integer(16 bits) |
max-delay | Délai de réponse maximal pour les requêtes MLD | integer(16 bits) |
tcp [TCP header field]
mot-clé | La description | type |
---|---|---|
sport | Port source | inet_service |
dport | Le port de destination | inet_service |
sequence | Numéro de séquence | integer(32 bits) |
ackseq | Numéro d'autorisation | integer(32 bits) |
doff | Décalage des données | integer(4 bits)Mise à l'échelle FIXME |
reserved | Zone de réservation | integer(4 bits) |
flags | Drapeau TCP | tcp_flag |
window | fenêtre | integer(16 bits) |
checksum | Somme de contrôle | integer(16 bits) |
urgptr | Pointeur d'urgence | integer(16 bits) |
udp [UDP header field]
mot-clé | La description | type |
---|---|---|
sport | Port source | inet_service |
dport | Le port de destination | inet_service |
length | Longueur totale des paquets | integer(16 bits) |
checksum | Somme de contrôle | integer(16 bits) |
udplite [UDP-Lite header field]
mot-clé | La description | type |
---|---|---|
sport | Port source | inet_service |
dport | Le port de destination | inet_service |
checksum | Somme de contrôle | integer(16 bits) |
sctp [SCTP header field]
mot-clé | La description | type |
---|---|---|
sport | Port source | inet_service |
dport | Le port de destination | inet_service |
vtag | Balise de validation | integer(32 bits) |
checksum | Somme de contrôle | integer(32 bits) |
dccp [DCCP header field]
mot-clé | La description | type |
---|---|---|
sport | Port source | inet_service |
dport | Le port de destination | inet_service |
ah [AH header field]
mot-clé | La description | type |
---|---|---|
nexthdr | Le protocole d'en-tête suivant | inet_proto |
hdrlength | Longueur d'en-tête AH | integer(8 bits) |
reserved | Zone de réservation | integer(16 bits) |
spi | Index des paramètres de sécurité | integer(32 bits) |
sequence | Numéro de séquence | integer(32 bits) |
esp [ESP header field]
mot-clé | La description | type |
---|---|---|
spi | Index des paramètres de sécurité | integer(32 bits) |
sequence | Numéro de séquence | integer(32 bits) |
comp [IPComp header field]
mot-clé | La description | type |
---|---|---|
nexthdr | Le protocole d'en-tête suivant | inet_proto |
flags | drapeau | bitmask |
cpi | Index des paramètres de compression | integer(16 bits) |
@ [base,offset,length]
L'expression de charge utile brute vous indique de charger les bits de longueur commençant par offsetbits.
Le bit 0 pointe vers le premier bit.
Dans le langage de programmation C, cela correspond au bit le plus significatif, ou 0x80 '' pour les octets. Ils sont utiles pour faire correspondre les en-têtes qui n'ont pas encore d'expression de modèle lisible par l'homme. Notez que nft n'ajoute pas de dépendances d'expression de charge utile brute. Par exemple, pour faire correspondre le champ de protocole de l'en-tête de transport au protocole numéro 5, vous devez exclure manuellement les paquets avec des en-têtes de transport différents. Par exemple, utilisez
meta l4proto 5 '' avant l'expression Raw.
base | La description |
---|---|
ll | Couche de liaison telle que l'en-tête Ethernet |
nh | En-têtes de réseau tels que IPv4 ou IPv6 |
th | En-têtes de transport, tels que TCP |
python
#Port de destination qui correspond à la fois à UDP et à TCP
inet filter input meta l4proto {tcp, udp} @th,16,16 { dns, http }
#Si l'adresse de protocole cible correspond à l'adresse spécifiée
#réécrire l'adresse matérielle cible du paquet arp.
input meta iifname enp2s0 arp ptype 0x0800 arp htype 1 arp hlen 6 arp plen 4 @nh,192,32 0xc0a88f10 @nh,144,48 set 0x112233445566 accept
Les expressions d'en-tête étendues font référence aux données d'en-têtes de protocole de taille variable, telles que les en-têtes étendus IPv6 et les options TCP.
nftables prend actuellement en charge la correspondance (recherche) de certains en-têtes d'extension ipv6 ou options TCP.
hbh {nexthdr | hdrlength}
frag {nexthdr | frag-off | more-fragments | id}
rt {nexthdr | hdrlength | type | seg-left}
dst {nexthdr | hdrlength}
mh {nexthdr | hdrlength | checksum | type}
srh {flags | tag | sid | seg-left}
tcp option {eol | noop | maxseg | window | sack-permitted | sack | sack0 | sack1 | sack2 | sack3 | timestamp} tcp_option_field
La syntaxe suivante n'est valide que pour les expressions relationnelles qui ont un type booléen sur le côté droit et vérifient uniquement l'existence de l'en-tête.
exthdr {hbh | frag | rt | dst | mh}
tcp option {eol | noop | maxseg | window | sack-permitted | sack | sack0 | sack1 | sack2 | sack3 | timestamp}
mot-clé | La description |
---|---|
hbh | Hop par hop |
rt | En-tête de routage |
Fragment | En-tête de fragmentation |
dst | option dst |
mh | En-tête de mobilité |
srh | En-tête de routage de segment |
mot-clé | La description | Champ d'option TCP |
---|---|---|
eol | Fin de la liste d'options | kind |
noop | 1 octet TCP Non-option op | kind |
maxseg | Taille maximale du segment TCP | kind, length, size |
window | Mise à l'échelle de la fenêtre TCP | kind, length, count |
sack-permitted | SACK TCP autorisé | kind, length |
sack | Accusé de réception sélectif TCP(TCP Selective Acknowledgement)(Alias pour le bloc 0) | kind, length, left, right |
sack0 | Accusé de réception sélectif TCP(block 0) | kind, length, left, right |
sack1 | Accusé de réception sélectif TCP(block 1) | kind, length, left, right |
sack2 | Accusé de réception sélectif TCP(block 2) | kind, length, left, right |
sack3 | Accusé de réception sélectif TCP(block 3) | kind, length, left, right |
timestamp | Horodatage TCP | kind, length, tsval, tsecr |
#Rechercher les options TCP
filter input tcp option sack-permitted kind 1 counter
#Rechercher IPv6 exthdr
ip6 filter input frag more-fragments 1 counter
L'expression conntrack fait référence aux métadonnées de l'entrée de suivi de connexion associée au paquet.
Il existe trois types d'expressions conntrack.
Certaines expressions conntrack nécessitent une direction de flux avant la touche conntrack
, tandis que d'autres sont indépendantes de la direction et doivent être utilisées directement.
Les mots clés packets
, bytes
et ```avgpkt`` peuvent être utilisés avec ou sans orientation.
Si vous omettez la direction, la somme de la direction d'origine et de la direction de réponse est renvoyée.
La même chose s'applique aux zones.
Si une direction est spécifiée, les zones correspondent uniquement si l'ID de zone est associé à la direction spécifiée.
ct {state | direction | status | mark | expiration | helper | label | l3proto | protocol | bytes | packets | avgpkt | zone}
ct {original | reply} {l3proto | protocol | proto-src | proto-dst | bytes | packets | avgpkt | zone}
ct {original | reply} {ip | ip6} {saddr | daddr}
mot-clé | La description | type |
---|---|---|
state | Statut de connexion | ct_state |
direction | Direction du paquet vers la connexion | ct_dir |
status | Statut de connexion | ct_status |
mark | Marque de connexion | mark |
expiration | Date d'expiration de la connexion | time |
helper | Assistant associé à la connexion | string |
label | nftables incluent le cheminconnlabel.conf Bit d'étiquette de suivi de connexion ou nom symbolique défini dans |
ct_label |
l3proto | Protocole de connexion de couche 3 | nf_proto |
saddr | Adresse source de la connexion dans le sens spécifié | ipv4_addr / ipv6_addr |
daddr | Adresse de destination de la connexion dans le sens spécifié | ipv4_addr / ipv6_addr |
protocol | Protocole de couche 4 pour les connexions dans la direction spécifiée | inet_proto |
proto-src | Protocole source de couche 4 dans la direction spécifiée | integer(16 bits) |
proto-dst | Protocole de destination de couche 4 dans la direction spécifiée | integer(16 bits) |
packets | Le nombre de paquets détectés dans la direction spécifiée, ou le total de l'original et de la réponse | integer(64 bits) |
bytes | Nombre d'octets détectés,packets Voir la description du mot-clé |
integer(64 bits) |
avgpkt | Octets moyens par paquet,packets Voir la description du mot-clé |
integer(64 bits) |
zone | zone conntrack | integer(16 bits) |
Une description des types spécifiques à conntrack ci-dessus peut être trouvée dans la sous-section TYPES DE CONNTRACK ci-dessus.
La déclaration représente l'action à entreprendre. Vous pouvez modifier le flux de contrôle (retour, passer à une autre chaîne, accepter ou supprimer des paquets) et effectuer des actions telles que la journalisation et le rejet de paquets.
Il existe deux types de déclarations. L'instruction end termine sans condition l'évaluation de la règle actuelle. Les instructions sans fin ne terminent que conditionnellement ou ne terminent jamais l'évaluation de la règle actuelle. Autrement dit, ils sont passifs en termes d'évaluation des règles. La règle peut contenir n'importe quel nombre d'instructions sans fin, mais une seule instruction de fin peut être utilisée comme instruction finale.
La déclaration de décision modifie le flux de contrôle de l'ensemble de règles et émet une décision de politique pour le paquet.
{accept | drop | queue | continue | return}
{jump | goto} chain
sauter '', mais la position actuelle n'est pas poussée dans la pile d'appels. Autrement dit, après avoir évalué une nouvelle chaîne, elle continuera avec la dernière chaîne, et non avec la chaîne contenant l'instruction
goto ''.#Paquets de eth0 et réseau interne de_Processus avec LAN.
filter input iif eth0 ip saddr 192.168.0.0/24 jump from_lan
#Supprimez tous les paquets de la chaîne, eth0 avec des adresses sources différentes.
filter input iif eth0 drop
L'instruction de charge utile modifie le contenu du paquet. Par exemple, il peut être utilisé pour définir le champ d'en-tête ip DSCP (differv) ou l'étiquette de flux ipv6.
Acheminez certains paquets au lieu de faire un pont.
# tcp:http 192.160.0.0/Redirection de 16 vers votre machine locale et routage au lieu de pontage
# 00:11:22:33:44:On suppose que 55 est l'adresse MAC locale.
bridge input meta iif eth0 ip saddr 192.168.0.0/16 tcp dport 80 meta pkttype set unicast ether daddr set 00:11:22:33:44:55
#Définition des champs d'en-tête DSCP IPv4
ip forward ip dscp set 42
L'instruction d'en-tête étendue modifie le contenu des paquets d'en-têtes de taille variable. Cela peut maintenant être utilisé pour modifier la taille de segment maximale TCP d'un paquet, similaire à TCPMSS.
#Changer tcp mss
tcp flags syn tcp option maxseg size set 1360
#Définissez la taille en fonction des informations sur l'itinéraire
tcp flags syn tcp option maxseg size set rt mtu
log [prefix quoted_string] [level syslog-level] [flags log-flags]
log group nflog_group [prefix quoted_string] [queue-threshold value] [snaplen size]
L'instruction log active la journalisation des paquets correspondants.
Lorsque cette instruction est utilisée à partir d'une règle, le noyau Linux imprime des informations sur tous les paquets correspondants, y compris les champs d'en-tête, via le journal du noyau (qui peut être lu par dmesg (1) ou syslog).
Si un numéro de groupe est spécifié, le noyau Linux passe le paquet au nfnetlink_log '' et multidiffuse le paquet via la socket
netlink '' vers le groupe de multidiffusion spécifié.
Un ou plusieurs processus de l'espace utilisateur peuvent être enregistrés dans un groupe et recevoir des paquets.
Voir la documentation `` libnetfilter_queue '' pour plus d'informations.
Puisqu'il s'agit d'une instruction sans fin, l'évaluation de la règle se poursuivra après la journalisation du paquet.
mot-clé | La description | type |
---|---|---|
prefix | Préfixe du message du journal | Chaîne de caractères entre guillemets |
level | Niveau de journalisation Syslog | string: emerg, alert, crit, err, warn [default], notice, info, debug |
group | Groupe NFLOG pour envoyer un message | Entier non signé(16 bits) |
snaplen | Longueur de la charge utile du paquet à inclure dans le message netlink | Entier non signé(32 bits) |
que-threshold | Nombre de paquets à mettre en file d'attente dans le noyau avant l'envoi vers l'espace utilisateur | Entier non signé(32 bits) |
drapeau | La description |
---|---|
tcp sequence | Enregistrez le numéro de séquence TCP. |
tcp options | Options de journalisation pour les en-têtes de paquets TCP. |
ip options | IP /Options de journalisation pour les en-têtes de paquets IPv6. |
skuid | Enregistrez l'ID utilisateur du processus qui a généré le paquet. |
ether | Décodez l'adresse MAC et le protocole. |
all | Activez tous les indicateurs de journal ci-dessus. |
Exemple d'utilisation de l'instruction de journal
#Enregistrez l'UID qui a généré le paquet et les options IP
ip filter output log flags skuid flags ip options
#Consigner les numéros de séquence TCP et les options TCP à partir des paquets TCP
ip filter output log flags tcp sequence,options
#Activer tous les indicateurs de journal pris en charge
ip6 filter output log flags all
reject [ with {icmp | icmpv6 | icmpx} type {icmp_code | icmpv6_code | icmpx_code} ]
reject [ with tcp reset ]
L'instruction rejeter '' est utilisée pour renvoyer un paquet d'erreur en réponse à un paquet correspondant. Sinon, c'est la même chose que
drop '', c'est donc une instruction de fin qui termine le parcours de règle.
Cette instruction n'est valide que pour les chaînes d'entrée, les chaînes avant, les chaînes de sortie et les chaînes définies par l'utilisateur qui sont appelées uniquement à partir de ces chaînes.
Les différentes variables de refus ICMP sont destinées à être utilisées avec différentes familles de tables.
variable | famille | type |
---|---|---|
icmp | ip | icmp_code |
icmpv6 | ip6 | icmpv6_code |
icmpx | inet | icmpx_code |
Consultez la section Types de données (# Types de données) ci-dessus pour une description des types et une liste des mots clés pris en charge. Généralement, la valeur de refus par défaut est `` port-inaccessible ''.
Notez que dans la famille de ponts, les instructions `` rejeter '' ne sont autorisées que dans les chaînes de base qui s'accrochent à l'entrée ou au pré-routage.
L'instruction counter
définit le nombre de hits dans un paquet ainsi que le nombre d'octets.
counter [ packets number bytes number ]
Vous pouvez utiliser l'instruction conntrack pour définir la marque conntrack et l'étiquette conntrack.
ct {mark | event | label | zone} set value
L'instruction ct '' définit les métadonnées associées à la connexion. L'ID de zone doit être attribué avant qu'une recherche de conntrack puisse être effectuée. C'est-à-dire que cela devrait être fait avec le pré-routage et la sortie (si les paquets générés localement doivent être placés dans des zones séparées) et la priorité de hook est
-300 ''.
mot-clé | La description | valeur |
---|---|---|
event | bit d'événement conntrack | bitmask, integer(32 bits) |
helper | Le nom de l'objet d'assistance ct affecté à la connexion | Chaîne citée |
mark | Marque de suivi de connexion | mark |
label | Étiquette de suivi de connexion | label |
zone | zone conntrack | integer(16 bits) |
#Enregistrer le paquet nfmark dans conntrack
ct mark set meta mark
#Configurer des zones mappées via l'interface
table inet raw {
chain prerouting {
type filter hook prerouting priority -300;
ct zone set iif map { "eth1" : 1, "veth1" : 2 }
}
chain output {
type filter hook output priority -300;
ct zone set oif map { "eth1" : 1, "veth1" : 2 }
}
}
#Limiter les événements signalés par ctnetlink
ct event set new,related,destroy
L'instruction meta '' définit la valeur de la méta expression. Les méta-champs existants sont
priority '', mark '',
pkttype '', `` nftrace ''.
meta {mark | priority | pkttype | nftrace} set value
L'instruction meta définit les métadonnées associées au paquet.
mot-clé | La description | valeur |
---|---|---|
priority | Priorité des paquets TC | tc_handle |
mark | Marque de paquet | mark |
pkttype | Type de paquet | pkt_type |
nftrace | Suivi des paquets de règles sur/de. Pour surveiller la tracemonitor trace Utilisez la commande. |
0, 1 |
limit rate [over] packet_number / {second | minute | hour | day} [burst packet_number packets]
limit rate [over] byte_number {bytes | kbytes | mbytes} / {second | minute | hour | day | week} [burst byte_number bytes]
L'instruction `` limit '' correspond à un taux limité à l'aide du filtre de compartiment de jetons. Les règles qui utilisent cette instruction correspondent jusqu'à ce que cette limite soit atteinte. Vous pouvez l'utiliser en combinaison avec une instruction de journal pour limiter la journalisation. Le mot-clé optionnel «over» correspond au-delà du taux spécifié.
valeur | La description | type |
---|---|---|
packet_number | Nombre de paquets | Entier non signé(32 bits) |
byte_number | Nombre d'octets | Entier non signé(32 bits) |
snat to address [:port] [persistent, random, fully-random]
snat to address - address [:port - port] [persistent, random, fully-random]
dnat to address [:port] [persistent, random, fully-random]
dnat to address [:port - port] [persistent, random, fully-random]
masquerade to [:port] [persistent, random, fully-random]
masquerade to [:port - port] [persistent, random, fully-random]
redirect to [:port] [persistent, random, fully-random]
redirect to [:port - port] [persistent, random, fully-random]
L'instruction nat
n'est valide qu'à partir du type de chaîne nat
.
Les instructions snat '' et
masquerade '' indiquent que l'adresse source du paquet doit être modifiée.
snat n'est valide que pour les chaînes de post-acheminement et d'entrée, mais la mascarade n'est valable que pour les post-routages.
Les instructions dnat et redirect ne sont valides que dans les chaînes de pré-routage et de sortie et indiquent que l'adresse de destination du paquet doit être modifiée.
Vous pouvez également utiliser des chaînes sans base appelées à partir de chaînes de base de type chaîne nat.
Tous les futurs paquets sur cette connexion seront abandonnés et l'évaluation des règles sera abandonnée.
L'instruction masquerade '' est une forme spéciale de
snat '' et utilise toujours l'adresse IP de l'interface d'envoi de destination.
Ceci est particulièrement utile pour les passerelles avec des adresses IP dynamiques (publiques).
L'instruction redirect '' est une forme spéciale de
dnat '' qui traduit toujours l'adresse de destination en l'adresse de l'hôte local.
Ceci est utile si vous souhaitez uniquement modifier le port de destination du trafic entrant sur différentes interfaces.
Notez que chaque instruction nat doit avoir à la fois des chaînes de base de pré-routage et de post-routage. Sinon, les paquets sur la route de retour ne seront pas reconnus par netfilter et la conversion inverse ne se produira pas.
formule | La description | type |
---|---|---|
address | Source du paquet/Indique que l'adresse de destination doit être modifiée. Vous pouvez spécifier un mappage pour associer une liste de tuples constituée de n'importe quelle clé d'expression à une valeur d'adresse. | ipv4_addr, ipv6_addr,Par exempleabcd::1234 , Ou vous pouvez utiliser la cartographie. carte de marque meta{ 10:192.168.1.2, 20:192.168.1.3 } |
port | Source du paquet/Indique que l'adresse de destination doit être modifiée. | numéro de port(16 bits) |
drapeau | La description |
---|---|
persistent | Même source pour chaque connexion/Donnez l'adresse de destination au client. |
random | Lorsqu'il est utilisé, le mappage de port est randomisé à l'aide des adresses source et de destination, et un mélange de hachage MD5 est amorcé de manière aléatoire à l'aide du port de destination. |
fully-random | Lorsqu'ils sont utilisés, les mappages de ports sont générés sur la base d'un algorithme pseudo-aléatoire 32 bits. |
Utilisation des déclarations NAT
#Un tableau adapté à tous les autres exemples/Créer un paramètre de chaîne
add table nat
add chain nat prerouting { type nat hook prerouting priority 0; }
add chain nat postrouting { type nat hook postrouting priority 100; }
#Adresse 1 l'adresse source de tous les paquets envoyés via eth0.2.3.Convertir en 4
add rule nat postrouting oif eth0 snat to 1.2.3.4
#Adresse de destination 192 pour tout le trafic entrant via eth0.168.1.Rediriger vers 120
add rule nat prerouting iif eth0 dnat to 192.168.1.120
#Traduire l'adresse source de tous les paquets envoyés via eth0 en n'importe quoi
#Les paquets générés localement sont utilisés comme source pour atteindre la même destination
add rule nat postrouting oif eth0 masquerade
#Trafic TCP entrant direct sur le port 22 vers le port 2222
add rule nat prerouting tcp dport 22 redirect to :2222
L'instruction de déchargement de flux vous permet de sélectionner un flux qui accélère le transfert via un contournement de pile réseau de couche 3. Vous devez spécifier le nom de la table de flux pour décharger ce flux.
flow offload @flowtable
Cette instruction utilise le gestionnaire nfnetlink_queue '' pour transmettre le paquet à l'espace utilisateur. Le paquet est placé dans une file d'attente identifiée par un numéro de file d'attente de 16 bits. L'espace utilisateur peut inspecter et modifier les paquets selon les besoins. L'espace utilisateur doit alors supprimer ou réinjecter le paquet à partir du noyau. Voir la documentation
libnetfilter_queue '' pour plus d'informations.
queue [num queue_number] [bypass]
queue [num queue_number_from - queue_number_to] [bypass,fanout]
valeur | La description | type |
---|---|---|
queue_number | Définissez le numéro de file d'attente. La valeur par défaut est 0. | Entier non signé(16 bits) |
queue_number_from | Si la répartition est utilisée, définissez la file d'attente initiale dans la plage. | Entier non signé(16 bits) |
queue_number_to | Si la répartition est utilisée, définissez la file d'attente de fin dans la plage. | Entier non signé(16 bits) |
drapeau | La description |
---|---|
bypass | Si l'application de l'espace utilisateur ne peut pas reculer, passez le paquet. Avant d'utiliser ce drapeaulibnetfilter_queue Lisez la documentation sur pour obtenir des recommandations de réglage des performances. |
fanout | Distribuez les paquets entre plusieurs files d'attente. |
L'instruction dup est utilisée pour dupliquer un paquet et envoyer une copie vers une autre destination.
dup to device
dup to address device device
formule | La description | type |
---|---|---|
address | Indique qu'une copie du paquet doit être envoyée à la nouvelle passerelle. | ipv4_addr, ipv6_adr. Par exempleabcd::1234 .. Ou vous pouvez utiliser la cartographie.ip saddr map {192.168.1.2:10.1.1.1} |
device | Indique qu'une copie doit être envoyée via l'appareil. | string |
Exemple d'utilisation de l'instruction dup
#Adresse IP 10 avec eth0.2.3.Envoyer à 4 machines
ip filter forward dup to 10.2.3.4 device "eth0"
#Copier l'image brute vers une autre interface
netdetv ingress dup to "eth0"
dup to "eth0"
#Mapper vers la passerelle Combiner avec dst addr
dup to ip daddr map { 192.168.7.1 : "eth0", 192.168.7.2 : "eth1" }
L'instruction fwd est utilisée pour rediriger les paquets bruts vers une autre interface. Il ne peut être utilisé qu'avec le crochet d'entrée de la famille netdev. Similaire à une instruction dup, sauf qu'aucune copie n'est effectuée.
fwd to device
L'instruction set '' est utilisée pour ajouter ou mettre à jour dynamiquement des éléments dans l'ensemble à partir du chemin du paquet.
set setname`` doit déjà exister dans la table spécifiée.
En outre, les ensembles qui sont mis à jour dynamiquement à partir du jeu de règles nftables doivent spécifier à la fois une taille maximale de l'ensemble (pour éviter de manquer de mémoire) et un délai (pour éviter un nombre illimité d'entrées dans l'ensemble). ..
L'instruction set crée, par exemple, une liste noire dynamique.
{add | update} @setname {expression [timeout timeout] [comment string]}
Exemple de liste noire simple
#famille"ip"Table"filter"Déclarez l'ensemble lié à. Le délai et la taille sont nécessaires pour ajouter des éléments à partir du chemin du paquet.
nft add set ip filter blackhole "{type ipv4_addr; flags timeout; size 65536;}"
#Ajoutez l'interface interne à la liste blanche.
nft add rule ip filter input meta iifname "internal" accept
#Supprimez les paquets des adresses IP de la liste noire.
nft add rule ip filter input ip saddr @blackhole counter drop
#S'il y a plus de 10 demandes de connexion TCP par seconde, mettez sur liste noire l'adresse IP source.
#L'entrée expire après 1 minute. Après cela, si l'état restreint continue, l'entrée peut être ajoutée à nouveau.
nft add rule ip filter input tcp flags syn tcp dport ssh meter flood size 128000 {ip saddr timeout 10s limit rate over 10 / second} add @blackhole {ip saddr timeout 1m} drop
#Vérifiez l'état du compteur de limite de débit.
nft list meter ip filter flood
#Inspectez le contenu du trou noir:
nft list set ip filter blackhole
#Ajouter manuellement les deux adresses à l'ensemble:
nft add element filter blackhole { 10.2.3.4, 10.23.1.42 }
Voici quelques-unes des commandes supplémentaires incluses dans nft.
Vous pouvez utiliser la commande `` monitor '' pour écouter les événements Netlink générés par le sous-système nf_tables en relation avec la création et la suppression d'objets. Lorsqu'un événement se produit, nft imprime l'événement surveillé sur la sortie standard au format XML, JSON ou nft natif.
Pour filtrer les événements liés aux objets concrets, utilisez les mots-clés tables
, chaînes
, sets
, rules
, ```elements,
ruleset`` Utiliser.
Utilisez les mots-clés nouveau '' ou
détruire '' pour filtrer les événements liés à une action spécifique.
Appuyez sur `` ^ C '' pour terminer l'opération de surveillance.
#Écoute tous les événements et génère un rapport au format natif nft
% nft monitor
#Écoute la table ajoutée et génère un rapport au format XML
% nft monitor new tables xml
#Écoute les règles supprimées et génère un rapport au format JSON
% nft monitor destroy rules json
#Attendre les chaînes nouvelles et détruites au format nft natif
% nft monitor chains
#Écoute les événements d'ensemble de règles tels que les tables, les chaînes, les règles, les ensembles, les compteurs, les quotas au format nft natif
% nft monitor ruleset
Lorsqu'une erreur est détectée, nft '' indique la ligne contenant l'erreur, indique l'emplacement de la partie erronée dans le flux d'entrée et utilise le carryt (
^ '') pour marquer la partie erronée. Je vais le télécharger.
Si l'erreur est due à une combinaison de deux expressions ou instructions, la partie imposant la contrainte violante est marquée d'un tilder (`` ~ '').
Pour les erreurs renvoyées par le noyau, nft ne peut pas détecter quelle partie de l'entrée est à l'origine de l'erreur et la commande entière est marquée.
Erreur due à une expression incorrecte
<cmdline>:1:19-22: Error: Interface does not exist
filter output oif eth0
^^^^
Erreur causée par une combinaison incorrecte de deux expressions
<cmdline>:1:28-36: Error: Right hand side of relational expression (==) must be constant
filter output tcp dport == tcp dport
~~ ^^^^^^^^^
Erreur renvoyée par le noyau
<cmdline>:0:0-23: Error: Could not process rule: Operation not permitted
filter output oif wlan0
^^^^^^^^^^^^^^^^^^^^^^^
En cas de succès, nft quittera avec le statut 0. Si une erreur non spécifiée se produit, il sort avec l'état 1, l'état 2 est l'état 3 s'il s'agit d'une erreur d'allocation de mémoire et le socket Netlink ne peut pas être ouvert.
Il existe un wiki officiel sur https://wiki.nftables.org.
Recommended Posts