nftables рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ 1.0.0 рд░рд┐рд▓реАрдЬ

рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ nftables 1.0.0 рдЪреЗ рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдЭрд╛рд▓реЗ рдЖрд╣реЗ, IPv4, IPv6, ARP рдЖрдгрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд░рд┐рдЬ (iptables, ip6table, arptables рдЖрдгрд┐ ebtables рдмрджрд▓рдгреНрдпрд╛рдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдиреЗ) рд╕рд╛рдареА рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХрддреНрд░ рдХрд░рдгреЗ. nftables 1.0.0 рд░рд┐рд▓реАрдЭ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реЗ рдмрджрд▓ Linux 5.13 рдХрд░реНрдирд▓рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗрдд. рдЖрд╡реГрддреНрддреА рдХреНрд░рдорд╛рдВрдХрд╛рддреАрд▓ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдмрджрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рдореВрд▓рднреВрдд рдмрджрд▓рд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХреЗрд╡рд│ рджрд╢рд╛рдВрд╢ рдЪрд┐рдиреНрд╣рд╛рдд рдХреНрд░рдорд╛рдВрдХрди рд╕рддрдд рдЪрд╛рд▓реВ рдареЗрд╡рдгреНрдпрд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо рдЖрд╣реЗ (рдорд╛рдЧреАрд▓ рдкреНрд░рдХрд╛рд╢рди 0.9.9 рд╣реЛрддреЗ).

nftables рдкреЕрдХреЗрдЬрдордзреНрдпреЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ рдШрдЯрдХ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд рдЬреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдЪрд╛рд▓рддрд╛рдд, рддрд░ рдХрд░реНрдирд▓-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдп nf_tables рдЙрдкрдкреНрд░рдгрд╛рд▓реАрджреНрд╡рд╛рд░реЗ рдкреБрд░рд╡рд▓реЗ рдЬрд╛рддреЗ, рдЬреЗ рд░рд┐рд▓реАрдЬ 3.13 рдкрд╛рд╕реВрди Linux рдХрд░реНрдирд▓рдЪрд╛ рднрд╛рдЧ рдЖрд╣реЗ. рдХрд░реНрдирд▓ рд╕реНрддрд░ рдлрдХреНрдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╕реНрд╡рддрдВрддреНрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЛ рдЬреЛ рдкреЕрдХреЗрдЯреНрд╕рдордзреВрди рдбреЗрдЯрд╛ рдХрд╛рдврдгреНрдпрд╛рд╕рд╛рдареА, рдбреЗрдЯрд╛ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдгрд╛рд╕рд╛рдареА рдореВрд▓рднреВрдд рдХрд╛рд░реНрдпреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЛ.

рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрдЪреЗ рдирд┐рдпрдо рд╕реНрд╡рддрдГ рдЖрдгрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рдБрдбрд▓рд░реНрд╕ рд╡рд╛рдкрд░рдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдмрд╛рдпрдЯреЗрдХреЛрдбрдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд, рддреНрдпрд╛рдирдВрддрд░ рд╣рд╛ рдмрд╛рдпрдХреЛрдб рдиреЗрдЯрд▓рд┐рдВрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рдкрд░реВрди рдХрд░реНрдирд▓рдордзреНрдпреЗ рд▓реЛрдб рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ BPF (рдмрд░реНрдХрд▓реЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░) рд╕рджреГрд╢ рд╡рд┐рд╢реЗрд╖ рдЖрднрд╛рд╕реА рдорд╢реАрдирдордзреНрдпреЗ рдХрд░реНрдирд▓рдордзреНрдпреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рд╣рд╛ рджреГрд╖реНрдЯреАрдХреЛрди рдХрд░реНрдирд▓ рд╕реНрддрд░рд╛рд╡рд░ рдЪрд╛рд▓рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛрдбрдЪрд╛ рдЖрдХрд╛рд░ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдХрдореА рдХрд░рдгреЗ рдЖрдгрд┐ рдирд┐рдпрдорд╛рдВрдЪреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд░реНрд╡ рдХрд╛рд░реНрдп рдЖрдгрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреЗ рддрд░реНрдХ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреЗрдд рд╣рд▓рд╡рд┐рдгреЗ рд╢рдХреНрдп рдХрд░рддреЗ.

рдореБрдЦреНрдп рдирд╡рдХрд▓реНрдкрдирд╛:

  • рд╕реЗрдЯ рд▓рд┐рд╕реНрдЯрдордзреНрдпреЗ тАЬ*тАЭ рдорд╛рд╕реНрдХ рдШрдЯрдХрд╛рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рдЬреЗ рд╕реЗрдЯрдордзреНрдпреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЗрддрд░ рдШрдЯрдХрд╛рдВрдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдпреЗрдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреЕрдХреЗрдЬрд╕рд╛рдареА рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЯреЗрдмрд▓ x { рдирдХрд╛рд╢рд╛ рдмреНрд▓реЙрдХрд▓рд┐рд╕реНрдЯ { рдкреНрд░рдХрд╛рд░ ipv4_addr : рдирд┐рд░реНрдгрдп рдзреНрд╡рдЬ рдордзреНрдпрд╛рдВрддрд░ рдШрдЯрдХ = { 192.168.0.0/16 : рд╕реНрд╡реАрдХрд╛рд░, 10.0.0.0/8 : рд╕реНрд╡реАрдХрд╛рд░, * : рдбреНрд░реЙрдк } } рдЪреЗрди y { рдкреНрд░рдХрд╛рд░ рдлрд┐рд▓реНрдЯрд░ рд╣реБрдХ рдкреНрд░реАрд░реВрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдзрд╛рдиреНрдп 0; рдзреЛрд░рдг рд╕реНрд╡реАрдХрд╛рд░рдгреЗ; ip saddr vmap @blocklist } }
  • рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╡рд░реВрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ тАЬ--defineтАЭ рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░реВрди. # cat test.nft рдЯреЗрдмрд▓ netdev x { рдЪреЗрди y { рдкреНрд░рдХрд╛рд░ рдлрд┐рд▓реНрдЯрд░ рд╣реБрдХ рдЗрдирдЧреНрд░реЗрд╕ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕реЗрд╕ = $dev рдкреНрд░рд╛рдзрд╛рдиреНрдп 0; рдкреЙрд▓рд┐рд╕реА рдбреНрд░реЙрдк; } } # nft тАФ define dev="{ eth0, eth1 }" -f test.nft
  • рдирдХрд╛рд╢рд╛ рд╕реВрдЪреАрдВрдордзреНрдпреЗ, рд╕реНрдерд┐рд░ (рд╕реНрдЯреЗрдЯрдлреБрд▓) рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рдкрд░рд╡рд╛рдирдЧреА рдЖрд╣реЗ: рдЯреЗрдмрд▓ рдЗрдиреЗрдЯ рдлрд┐рд▓реНрдЯрд░ { рдирдХрд╛рд╢рд╛ рдкреЛрд░реНрдЯрдореЕрдк { рдкреНрд░рдХрд╛рд░ inet_service : рдирд┐рд░реНрдгрдп рдХрд╛рдЙрдВрдЯрд░ рдШрдЯрдХ = { 22 рдХрд╛рдЙрдВрдЯрд░ рдкреЕрдХреЗрдЯ 0 рдмрд╛рдЗрдЯреНрд╕ 0 : рдЬрдВрдк ssh_рдЗрдирдкреБрдЯ, * рдХрд╛рдЙрдВрдЯрд░ рдкреЕрдХреЗрдЯ 0 рдмрд╛рдЗрдЯреНрд╕ 0 : рдбреНрд░реЙрдк } } рдЪреЗрди ssh_input { } рдЪреЗрди wan_input { tcp dport vmap @portmap } рдЪреЗрди рдкреНрд░реАрд░рд╛рдЙрдЯрд┐рдВрдЧ { рдкреНрд░рдХрд╛рд░ рдлрд┐рд▓реНрдЯрд░ рд╣реБрдХ рдкреНрд░реАрд░рд╛рдЙрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдпреЙрд░рд┐рдЯреА рд░реЙ; рдзреЛрд░рдг рд╕реНрд╡реАрдХрд╛рд░рдгреЗ; iif vmap { "lo" : рдЬрдВрдк рд╡реЕрди_рдЗрдирдкреБрдЯ } }
  • рджрд┐рд▓реЗрд▓реНрдпрд╛ рдкреЕрдХреЗрдЯ рдХреБрдЯреБрдВрдмрд╛рд╕рд╛рдареА рд╣рдБрдбрд▓рд░реНрд╕рдЪреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА "рд▓рд┐рд╕реНрдЯ рд╣реБрдХ" рдХрдорд╛рдВрдб рдЬреЛрдбрд▓реА: # nft рд╕реВрдЪреА рд╣реБрдХ ip рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ eth0 рдлреЕрдорд┐рд▓реА ip { рд╣реБрдХ рдкреНрд░рд╡реЗрд╢ { +0000000010 рдЪреЗрди рдиреЗрдЯрджреЗрд╡ xy [nf_tables] +0000000300 рдЪреЗрди inet mw [nf_tables] { -0000000100 рд╕рд╛рдЦрд│реА ip ab [nf_tables] +0000000300 рдЪреЗрди inet mz [nf_tables] } рд╣реБрдХ рдлреЙрд░рд╡рд░реНрдб { -0000000225 selinux_ipv4_forward 0000000000 рдЪреЗрди ip ac [nf_tables }0000000225_4 outputs 0000000225_рдЖрдЙрдЯрдкреБрдЯ } рд╣реБрдХ рдкреЛрд╕реНрдЯрд░реВрдЯрд┐рдВрдЧ { +4 XNUMX selinux_ipvXNUMX_postroute } }
  • рд░рд╛рдВрдЧреЗрддреАрд▓ рдмреНрд▓реЙрдХреНрд╕ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреЗрдд рд░рд╛рдВрдЧреЗрдд рдкреЕрдХреЗрдЯ рд╡рд┐рддрд░реАрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬреЕрд╢, рд╕рд┐рдореЕрд╢ рдЖрдгрд┐ рдирдордЬреЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд. тАж рд░рд╛рдВрдЧ рддреЗ рд╕рд┐рдореЕрд╢ рдореЛрдб 65536 тАж рд░рд╛рдВрдЧ рдлреНрд▓реЕрдЧреНрдЬ рдмрд╛рдпрдкрд╛рд╕ рдЯреВ рдирдордЬреЗрди рдЗрдВрдХ рдореЛрдб 65536 тАж рд░рд╛рдВрдЧ рддреЗ рдЭрд╛рд╢ рдУрдЗрдПрдл . meta mark mod 32 "queue" рд▓рд╛ рдореЕрдк рд▓рд┐рд╕реНрдЯрд╕рд╣ рджреЗрдЦреАрд▓ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдЬреЗрдгреЗрдХрд░реВрди рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреАрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рд░рд╛рдВрдЧ рдирд┐рд╡рдбрд╛. ... oifname рдирдХрд╛рд╢рд╛рд▓рд╛ рдмрд╛рдпрдкрд╛рд╕ рд░рд╛рдВрдЧ рдзреНрд╡рдЬ { "eth0" : 0, "pp0" : 2, "eth1" : 2 }
  • рдЕрдиреЗрдХ рдирдХрд╛рд╢рд╛рдВрдордзреНрдпреЗ рд╕реЗрдЯ рд╕реВрдЪреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЪрд▓рд╛рдВрдЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ. рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рд╛ = { eth0, eth1 } рдЯреЗрдмрд▓ ip x { рдЪреЗрди y { рдкреНрд░рдХрд╛рд░ рдлрд┐рд▓реНрдЯрд░ рд╣реБрдХ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдзрд╛рдиреНрдп 0; рдзреЛрд░рдг рд╕реНрд╡реАрдХрд╛рд░рдгреЗ; iifname vmap { lo : рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рд╛, $ рдЗрдВрдЯрд░рдлреЗрд╕ : рдбреНрд░реЙрдк } } } # nft -f x.nft # nft рд╕реВрдЪреА рдирд┐рдпрдо рд╕рд╛рд░рдгреА ip x { рдЪреЗрди y { рдкреНрд░рдХрд╛рд░ рдлрд┐рд▓реНрдЯрд░ рд╣реБрдХ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдзрд╛рдиреНрдп 0; рдзреЛрд░рдг рд╕реНрд╡реАрдХрд╛рд░рдгреЗ; iifname vmap { "lo" : рд╕реНрд╡реАрдХрд╛рд░рд╛, "eth0" : рдбреНрд░реЙрдк, "eth1" : рдбреНрд░реЙрдк } }
  • рдЕрдВрддрд░рд╛рдиреЗ vmaps (рдирд┐рд░реНрдгрдпрд╛рдЪрд╛ рдирдХрд╛рд╢рд╛) рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рдЖрд╣реЗ: # nft рдирд┐рдпрдо xy tcp dport рдЬреЛрдбрд╛. ip saddr vmap { 1025-65535 . 192.168.10.2 : рд╕реНрд╡реАрдХрд╛рд░рд╛ }
  • NAT рдореЕрдкрд┐рдВрдЧрд╕рд╛рдареА рд╕рд░рд▓реАрдХреГрдд рд╡рд╛рдХреНрдпрд░рдЪрдирд╛. рдкрддреНрддрд╛ рд╢реНрд░реЗрдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рдЖрд╣реЗ: ... snat to ip saddr рдирдХрд╛рд╢рд╛ { 10.141.11.4 : 192.168.2.2-192.168.2.4 } рдХрд┐рдВрд╡рд╛ рд╕реНрдкрд╖реНрдЯ IP рдкрддреНрддреЗ рдЖрдгрд┐ рдкреЛрд░реНрдЯ: ... dnat рддреЗ ip saddr рдирдХрд╛рд╢рд╛ { 10.141.11.4. . 192.168.2.3 } рдХрд┐рдВрд╡рд╛ IP рд╢реНрд░реЗрдгреА рдЖрдгрд┐ рдкреЛрд░реНрдЯреНрд╕рдЪреЗ рд╕рдВрдпреЛрдЬрди: ... dnat рддреЗ ip saddr . tcp dport рдирдХрд╛рд╢рд╛ { 80 . 192.168.1.2: 80-10.141.10.2. реореореорео-реорепрепреп }

рд╕реНрддреНрд░реЛрдд: opennet.ru

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛