Нэг хост дээрх хоёр виртуал машин гүүрээр LAN-д хүрдэг бөгөөд ip forward хэлхээнд тавьсан дүрэм хэзээ ч хөдөлдөггүй тоолуурыг харуулж байна. Кадрууд бодит, трафик өнгөрч байгаа ч дүрэм зүгээр л түүний замд байхгүй. Linux гүүрийн трафикийг илрүүлэх хоёр аргыг харьцуулах нь энэ чимээгүй байдлыг тайлбарлаж, нэг хуучин модуль ачаалах нь харагдахаас илүү муу хариулт гэдгийг ч тайлбарладаг.

Нэг хостоор дамжих хоёр зам

Пакет энэ хостоос хоёр огт өөр замаар гарч болох бөгөөд ялгаа нь аль дэгээнүүд түүнийг харахыг тодорхойлдог. Хэрэв очих газар физик портын цаана байгаа бөгөөд кадр гүүрний хоёр портын хооронд солигдож байвал хост Ethernet кадрыг дамжуулна; маршрутлалтын код асуухгүй бөгөөд маршрутлагдсан үсрэлт болохгүй. Хэрэв очих газар нь хост өөрөө эсвэл туннелийн интерфейсээр хүрэх сүлжээ бол пакет маршрутлагдаж, IP давхаргын дэгээнүүд үнэхээр үйлчилнэ. Энэ салбарыг санаж яваарай, учир нь хэлхээ, бүлгийн тухай дараагийн бүх асуулт кадрын энэ хоёр замын алийг сонгохоос үүсдэг.

Энэ ялгаа нь юу ч тооцдоггүй дүрмийн ард байх бүх түүх юм. veth9a1-аас enp3s0 хүртэлх гүүрэн кадр нь IP стекийг биш, гүүрийг гаталдаг тул ip forward хэлхээ тааруулах юу ч хардаггүй. Хуучин жишээн дэх интерфейсийн нэрс танд аль зам байгааг тодорхойлохгүй, тиймээс эхний алхам нь дүрмийн багц биш, топологийг харах явдал юм.

Туннель нэрлэхэд үнэ цэнэтэй гурав дахь тохиолдлыг нэмдэг. TUN төхөөрөмж IP пакетуудыг хостод хүргэдэг тул тэдгээр нь маршрутлагдаж, IP хэлхээгээр үнэхээр дамждаг бол гүүрт холбогдсон TAP төхөөрөмж кадруудыг хүргэж, гүүрийн тохиолдол шиг ажилладаг. Төхөөрөмжийн төрөл шийддэг, бүтээгдэхүүний нэр биш.

Гүүрэн кадрыг харж чадах хоёр бүлгийг харьцуулна уу

Linux нь nftables-ийн bridge бүлгээр дамжуулан уугуул гүүрийн шүүлтийг дэмждэг бөгөөд нислэгийн үеэр кадрыг шалгаж хаяхын тулд ямар ч хуучин модуль хэрэггүй. Цөмийн өөрийнх нь гүүрийн баримт бичиг энэ зөвлөмжийг шууд өгдөг бөгөөд хайлтын үр дүн модуль ачаалахыг хэлэхээс өмнө үүнийг мэдэх нь зүйтэй.

Observation pointWhat it seesWhat it costs
nftables bridge family chainsEthernet frames forwarded between bridge ports, in both directionsRules must be written in bridge syntax with link-layer matches
Legacy br_netfilter plus an ip chainBridged IPv4 and IPv6 packets, re-exposed through IP-layer hooksExisting host rules may begin matching traffic they never saw before
inet chain for routed trafficPackets the host routes, including traffic arriving from a TUN deviceNo visibility into purely switched frames

iptables-ийн оронд nft командыг ашиглах нь дүрмийг зөв бүлэгт дангаараа байрлуулдаггүй. bridge бүлэгт зарласан хэлхээ кадруудыг хардаг; ip, ip6 эсвэл inet-д зарласан хэлхээ тэдгээрийг хардаггүй, аль бинар файл үүсгэсэнээс үл хамааран. Бүлэг нь хэлхээний шинж чанар, түүнийг бичсэн хэрэгслийн шинж биш.

Хуучин зам өөрөөр ажилладаг тул зуршилаар тал сонгохын оронд харьцуулах нь зүйтэй. br_netfilter ачаалж, bridge-nf-call тохиргоог идэвхжүүлэхэд гүүрээр дамжсан IPv4 ба IPv6 трафик IP давхаргын дэгээгээр дахин илэрдэг тул энгийн iptables дүрэм эцэст нь түүнтэй таарч чадна. Кадрууд өөрчлөгддөггүй; тэдний дамждаг дэгээнүүдийн багц өөрчлөгддөг бөгөөд энэ нь хост дээрх бүх одоогийн дүрэмд шинэ үзэгчид бий болсон гэсэн үг.

Дүрэм нэмэхийн өмнө бодит замыг уншина уу

Гурван команд таны байр суурийг тодорхойлно: гүүр юунд холбогдсон, хуучин модуль идэвхтэй эсэх, bridge бүлэгт ямар хэлхээ аль хэдийн байгаа. Ямар нэгэн зүйл бичихээс өмнө тэдгээрийг ажиллуул, учир нь хариулт нь хоёр загварын алийг өргөжүүлж байгааг тодорхойлно. Энэ алхмыг алгасах нь зөв дүрэм юу ч дамждаггүй хэлхээнд орж дуусах зам юм.

bridge link show
lsmod | grep br_netfilter
nft list ruleset | grep -A4 "chain forward"

Гаралт тохиолдлуудыг цэвэрхэн ялгадаг. Гүүрний доор жагсаасан портууд аль интерфейсүүд солигдож байгааг хэлнэ; хоосон lsmod үр дүн нь гүүрэн кадруудын IP давхаргад ямар ч харагдах байдал байхгүй гэсэн үг; bridge бүлгийн одоо байгаа forward хэлхээ нь бодлогын эзэн аль хэдийн бий бөгөөд таны дүрэм өөрийн шинэ хэлхээнд биш, тэнд хамаарна гэсэн үг.

Дараа нь буцааж уншихад хялбар нэг дүрэм нэмж, тоолууртай, шийдвэрийг өөрчлөхгүйгээр, нэг төлөөлөх урсгалыг гүүрээр дамжуул. Хөдөлж буй тоолуур кадр дүрэмд хүрснийг нотолно. Энэ нь зөвхөн үүнийг л нотолдог тул татгалзсан замаар ч үргэлжлүүл, учир нь бүгдийг хүлээн авдаг бодлого ч хөдөлж буй тоолуур үүсгэдэг.

nft add rule bridge filter forward iifname "veth9a1" oifname "enp3s0" counter accept

Хуучин модуль зан төлөвийг хаана өөрчилдөг

Ажиллаж буй гүүр дээр хуучин замыг идэвхжүүлэх нь харагдах байдал нэмэх төвийг сахисан үйлдэл биш. Гүүрийн трафикт өмнө нь хүрэх боломжгүй байсан дүрмүүд хүрэх боломжтой болдог, үүнд өөр интерфейст зориулж бичсэн хост дүрмүүд ч орно, мөн ip forward хэлхээний өгөгдмөл drop бодлого өмнө нь хөндөгдөхгүй өнгөрдөг байсан кадруудад гэнэт үйлчилж болно. Тэр гүүрээр удирдагддаг хост дээр үр дүн нь консолгүй түгжигдэх явдал юм. Энэ нь таамаглалын доголдлын горим биш; саяхан өргөжүүлсэн замаар хүрч буй машин дээр дэгээнүүдийн багцыг өргөжүүлэхийн энгийн үр дагавар юм.

Илүү аюулгүй дараалал нь аль бүлэг бодлогыг эзэмшихийг шийдэх, дүрмүүдийг тэнд бичих, ямар ч sysctl өөрчлөхөөс өмнө бие даасан сэргээх замыг хадгалах явдал юм. Хэрэв хоёр бүлэг дүрэм хадгалж байвал аль нь эрх бүхий болохыг баримтжуул; давхцах хоёр бодлого нь пакетыг нэг газар хүлээн авч нөгөө газар хаях, уншихаар нэг ч файл байхгүй байх зам юм.

Тусгаарлалт өөрөө бүрэн загвар шаарддаг хэвээр. Нэг эх сурвалжийг нэг очих газарт зөвшөөрөх нь зөвхөн нэг урсгал ажиллаж байгааг нотолдог бол шаардлага нь ихэвчлэн VM хөршүүд эсвэл хостод хүрч чадахгүй байх явдал юм. Татгалзах дүрмүүдийн тоолуурууд хүлээн авах дүрмийн тоолуураас илүү чухал, учир нь хүлээн авах тоолуур нь хөдөлнө гэж та аль хэдийн хүлээж байсан тоолуур юм.

Эцэст нь хостын оролтын тохиолдлыг тусад нь байлга. Гүүрний өөрийн IP-д хаягласан трафик нь forward биш, input-д ирдэг бөгөөд forward дахь дүрэм аль бүлгийг сонгосон ч түүнийг хэзээ ч харахгүй. Гурван тохиолдол, хоёр бүлэг, нэг сургамж: зам нь дэгээг тодорхойлж, дэгээ нь таны дүрэм ерөөсөө байгаа эсэхийг тодорхойлдог.

Холбоотой нийтлэлүүд