nftables багц шүүлтүүрийн хувилбар 0.9.1

Жилийн хөгжлийн дараа танилцуулсан пакет шүүлтүүрийн хувилбар nftables 0.9.1, IPv6, IPv4, ARP болон сүлжээний гүүрүүдэд зориулсан пакет шүүлтүүрийн интерфэйсүүдийг нэгтгэн iptables, ip6table, arptables болон ebtables-ийг орлуулахаар хөгжүүлж байна. Nftables багц нь хэрэглэгчийн орон зайд ажилладаг пакет шүүлтүүрийн бүрэлдэхүүн хэсгүүдийг агуулдаг бол цөмийн түвшний ажлыг 3.13 хувилбараас хойш Линуксийн цөмийн нэг хэсэг болсон nf_tables дэд системээр хангадаг.

Цөмийн түвшин нь пакетуудаас өгөгдөл гаргаж авах, өгөгдлийн үйлдлүүдийг гүйцэтгэх, урсгалыг хянах үндсэн функцуудыг хангадаг ерөнхий протоколоос хамааралгүй интерфэйсийг л хангадаг.
Шүүлтүүрийн логик өөрөө болон протоколын тусгай зохицуулагчийг хэрэглэгчийн орон зайд байт код болгон эмхэтгэсний дараа энэ байт кодыг Netlink интерфейсийг ашиглан цөмд ачаалж, BPF (Беркли Пакет шүүлтүүр) -ийг санагдуулам тусгай виртуал машинд ажиллуулдаг. Энэхүү арга нь цөмийн түвшинд ажиллаж байгаа шүүлтүүрийн кодын хэмжээг мэдэгдэхүйц бууруулж, протоколтой ажиллахын тулд задлан шинжлэх дүрэм, логикийн бүх функцийг хэрэглэгчийн орон зайд шилжүүлэх боломжийг олгодог.

Гол инноваци:

  • Пакет, IPsec хүсэлтийн ID болон SPI (Аюулгүй байдлын параметрийн индекс) шошго дээр тулгуурлан туннелийн хаягийг тааруулах боломжийг олгодог IPsec дэмжлэг. Жишээлбэл,

    ... ipsec in ip saddr 192.168.1.0/24
    ... ipsec in spi 1-65536

    Мөн маршрут IPsec туннелээр дамжин өнгөрч байгаа эсэхийг шалгах боломжтой. Жишээлбэл, IPSec-ээр бус урсгалыг хаахын тулд:

    … шүүлтүүр гаралтын rt ipsec дусал дутуу

  • IGMP (Internet Group Management Protocol)-ийн дэмжлэг. Жишээлбэл, та ирж буй IGMP бүлгийн гишүүнчлэлийн хүсэлтээс татгалзах дүрмийг ашиглаж болно

    nft нэмэх дүрэм netdev foo bar igmp төрлийн гишүүнчлэл-асуулга тоологч уналт

  • Шилжилтийн гинжийг тодорхойлохын тулд хувьсагчийг ашиглах боломж (үсрэх / явах). Жишээлбэл:

    dest = ber тодорхойлох
    дүрэм нэмэх ip foo bar jump $dest

  • Гарчиг дахь TTL утгууд дээр үндэслэн үйлдлийн системийг (OS хурууны хээ) тодорхойлох маскуудын дэмжлэг. Жишээлбэл, илгээгчийн үйлдлийн систем дээр үндэслэн пакетуудыг тэмдэглэхийн тулд та дараах тушаалыг ашиглаж болно.

    ... meta mark set osf ttl нэрийн зураг алгасах { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "үл мэдэгдэх": 0x0}
    ... osf ttl "Linux:4.20" хувилбарыг алгасах

  • Илгээгчийн ARP хаяг болон зорилтот системийн IPv4 хаягийг тааруулах чадвар. Жишээлбэл, 192.168.2.1 хаягаас илгээсэн ARP пакетуудын тоолуурыг нэмэгдүүлэхийн тулд та дараах дүрмийг ашиглаж болно.

    хүснэгт arp x {
    гинж у {
    төрлийн шүүлтүүр дэгээ оролтын тэргүүлэх шүүлтүүр; бодлогыг хүлээн зөвшөөрөх;
    arp saddr ip 192.168.2.1 тоологч пакетууд 1 байт 46
    }
    }

  • Прокси (tproxy) дамжуулан хүсэлтийг ил тод дамжуулахад дэмжлэг үзүүлэх. Жишээлбэл, 80-р порт руу дуудлагыг 8080 прокси порт руу шилжүүлэхийн тулд:

    хүснэгт ip x {
    гинж у {
    төрөл шүүлтүүр дэгээ урьдчилан чиглүүлэх тэргүүлэх чиглэл -150; бодлогыг хүлээн зөвшөөрөх;
    tcp dport 80 tproxy-ээс :8080 хүртэл
    }
    }

  • SO_MARK горимд setsockopt()-аар дамжуулан тогтоосон тэмдгийг цаашид авах чадвартай залгууруудыг тэмдэглэхэд зориулсан дэмжлэг. Жишээлбэл:

    хүснэгт inet x {
    гинж у {
    төрөл шүүлтүүр дэгээ урьдчилан чиглүүлэх тэргүүлэх чиглэл -150; бодлогыг хүлээн зөвшөөрөх;
    tcp dport 8080 тэмдэглэгээг тохируулсан сокет тэмдэг
    }
    }

  • Сүлжээнд тэргүүлэх ач холбогдол бүхий текстийн нэрийг зааж өгөх дэмжлэг. Жишээлбэл:

    nft add chain ip x raw { type filter hook prerouting priority raw; }
    nft гинж нэмэх ip x filter { type filter hook prerouting priority filter; }
    nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; }

  • SELinux хаягуудыг дэмжих (Secmark). Жишээлбэл, SELinux контекст "sshtag" тагийг тодорхойлохын тулд та дараахийг ажиллуулж болно:

    nft нэмэх secmark inet шүүлтүүр sshtag "system_u:object_r:ssh_server_packet_t:s0"

    Дараа нь дүрэмд энэ шошгыг ашиглана уу:

    nft дүрэм нэмэх inet шүүлтүүр оролт tcp dport 22 meta secmark багц "sshtag"

    nft газрын зураг нэмэх inet filter secmapping { type inet_service : secmark; }
    nft нэмэх элементийн inet шүүлтүүрийг хуваах {22 : "sshtag" }
    nft дүрэм нэмэх inet шүүлтүүр оруулах мета secmark багц tcp dport газрын зураг @secmapping

  • Протоколуудад оноогдсон портуудыг /etc/services файлд тодорхойлсон тул текст хэлбэрээр зааж өгөх чадвар. Жишээлбэл:

    nft нэмэх дүрэм xy tcp dport "ssh"
    nft жагсаалтын дүрмийн багц -l
    хүснэгт x {
    гинж у {
    ...
    tcp dport "ssh"
    }
    }

  • Сүлжээний интерфейсийн төрлийг шалгах чадвар. Жишээлбэл:

    inet raw prerouting дүрэм нэмэх мета iifkind "vrf" хүлээн авах

  • "Динамик" тугийг тодорхой зааж өгснөөр багцын агуулгыг динамикаар шинэчлэхэд зориулсан сайжруулсан дэмжлэг. Жишээлбэл, "s" багцыг шинэчлэхийн тулд эх хаягийг нэмж, 30 секундын турш пакет байхгүй бол оруулгыг дахин тохируулна уу:

    х хүснэгтийг нэмнэ үү
    xs багц нэмэх {ipv4_addr төрөл; хэмжээ 128; завсарлага 30 секунд; туг динамик; }
    гинжин нэмэх xy {төрлийн шүүлтүүр дэгээ оролтын тэргүүлэх чиглэл 0; }
    дүрэм нэмэх xy шинэчлэл @s { ip saddr }

  • Тусдаа хугацаа дуусах нөхцөлийг тохируулах чадвар. Жишээлбэл, 8888 порт дээр ирж буй пакетуудын өгөгдмөл завсарлагыг хүчингүй болгохын тулд та дараахийг зааж өгч болно:

    хүснэгтийн IP шүүлтүүр {
    ct timeout aggressive-tcp {
    tcp протокол;
    l3proto ip;
    бодлого = {тогтоосон: 100, хаах_хүлээлт: 4, хаах: 4}
    }
    гинжин гаралт {
    ...
    tcp dport 8888 ct хугацаа хэтэрсэн "aggressive-tcp"
    }
    }

  • Inet гэр бүлд зориулсан NAT дэмжлэг:

    хүснэгт inet nat {
    ...
    ip6 daddr үхсэн::2::1 dnat to үхсэн:2::99
    }

  • Үг үсгийн алдааны тайланг сайжруулсан:

    nft гинжин шүүлтүүрийн тест нэмэх

    Алдаа: Ийм файл эсвэл лавлах байхгүй; Та гэр бүлийн ip дэх хүснэгтийн "шүүлтүүр" гэсэн үг үү?
    гинжин шүүлтүүрийн туршилтыг нэмнэ үү
    ^^^^^^

  • Интерфейсийн нэрийг багцад зааж өгөх чадвар:

    тохируулах sc {
    inet_service гэж бичнэ үү. ifname
    элементүүд = {"ssh". "eth0"}
    }

  • Шинэчлэгдсэн урсгалын хүснэгтийн дүрмийн синтакс:

    nft х хүснэгтийг нэмнэ
    nft add flowtable x ft {hook ingress priority 0; төхөөрөмжүүд = {eth0, wlan0}; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Сайжруулсан JSON дэмжлэг.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх