VPN-ийн клиент бүрийн пулд нэг очих газрын хүрээг блоклох
Нэг nftables дүрэм нь зөвшөөрөгдсөн VPN пулд очих газрын угтварыг гарцын өөрийн трафикт хүрэлгүйгээр татгалзаж чадна. Hook болон байрлалыг тааруулна уу.
Нэг дүрэм зөвшөөрөгдсөн VPN пулыг очих газрын хүрээнээс хол байлгаж чадна, гарцын өөр ажилд саад учруулахгүйгээр. Дүрэм өөрөө богино; ажиллах эсэхийг нь шийддэг хэсэг нь түүний амьдардаг hook болон гинжин дэх байрлал юм. Энэ хоёрт алдвал зөв харагдах боловч тогтворгүй ажилладаг галт хана гарна. Дүрэм пакетыг харах үед пакет юу хийж байгаагаас эхэл.
Дүрэм яг юутай таарч байна
Дүрэм нэгэн зэрэг гурван зүйлтэй таарна: оролтын интерфейс, эх угтвар, очих газрын угтвар. Drop хэрэгжихийн тулд гурвуулаа үнэн байх ёстой бөгөөд энэ нь дүрмийг нарийн байлгана. Үүнийг гурван тусдаа бодлого гэж уншихаас нэг илэрхийлэл гэж унших нь хялбар.
Интерфейсийн таарлыг дамжуулагдсан клиентийн трафикийг гарцын өөрийн холболтоос ялгадаг. Үүнгүйгээр зөвхөн эх пулыг нэрлэсэн дүрэм гарц өөрөө тэр хаягаас үүсгэдэг пакетуудад ч нөлөөлнө, хэрэв ийм зүйл хэзээ нэгэн цагт болвол. Эх угтвар нь бодлогыг зөвшөөрөгдсөн клиентээр, очих газрын угтвар нь нэг хүрээгээр хязгаарлана. Дүрмийг жагсаалт биш, огтлолцол гэж уншина уу.
Ямар нэгэн зүйл өөрчлөхөөс өмнө гурван утгыг бичнэ үү: туннелийн интерфейсийн нэр, серверийн хуваарилдаг пул, татгалзах угтвар. Аль нэгэнд нь үсгийн алдаа гарвал цэвэр задлагддаг боловч юу ч хамгаалдаггүй дүрэм болно. Эдгээр гурван утгыг дүрмийн дэргэдэх өөрчлөлтийн бүртгэлд хадгална уу.
Hook нь дүрэм хэнд хамаарахыг шийднэ
netfilter гинж hook-д бэхлэгддэг, мөн аль пакетыг гинж хардагийг hook шийднэ. forward hook нь гарцаар маршрутлагдсан трафикийг хардаг бөгөөд энэ нь клиентээс очих газар руу чиглэсэн трафик юм. Гинжин дэх бусад бүхэн өөр үзэгчдэд чиглэсэн байдаг.
input hook нь гарц руу өөрт нь хаягласан трафикийг хардаг тул тэнд тавьсан дүрэм нь дамжуулалтыг биш, өөрийн үйлчилгээнд хандахыг зохицуулна. output hook нь гарц өөрөө үүсгэдэг трафикийг хардаг бөгөөд энэ нь клиентийн пулын бодлогод хэрэгтэй зүйлийн эсрэг юм. Гинжин нэр нь дүрмийн багцыг бичсэн хүний сонгосон дур зоргын шошго тул hook-ыг нэрнээс бүү дүгнэ. Гинж хаана бэхлэгдсэнийг шалгасны дараа юутай таарч чадахийг таамагла.
| Hook | Traffic it sees | Right for this policy |
|---|---|---|
| input | Addressed to the gateway | No, that is the host's own services |
| forward | Routed through the gateway | Yes, for client-to-destination traffic |
| output | Generated by the gateway | No, that is the opposite direction |
Бэхэлгээг унших нь нэг мөрийн шалгалт бөгөөд дүрэм пакетыг хэзээ ч хардаггүй гинжид унахаас сэргийлнэ.
Дүрмийг өргөн accept-аас өмнө байрлуул
Дүрмүүд дарааллаар үнэлэгдэж, эхний шийдвэр ялна. Гинжин дэх эрт өргөн accept нь өөртэй нь таарсан пакетуудын үнэлгээг дуусгадаг тул дараа нэмсэн drop тэдэнд хэзээ ч ажиллахгүй. Энэ дарааллын дүрэм нь зөв харагдах дүрэм яагаад нөлөөгүй байж болохын бүх шалтгаан юм.
Дүрмийг төгсгөлд нэмэхийн оронд accept-аас өмнө оруул. Хэрэв гинжид туннелийн интерфейсийн ерөнхий accept аль хэдийн байвал шинэ дүрэм түүний өмнө байх ёстой, эс бөгөөс зөвхөн чимэглэл болно. Зассан файлаа биш, үүссэн дарааллыг шалга, учир нь хэд хэдэн файлаас угсарсан дүрмийн багц тэдгээрийн аль нэгтэй ч таарахгүй байж болно. Дараа нь пулаас авсан туршилтын пакетаар баталгаажуул.
sudo nft list chain inet filter forward
sudo nft insert rule inet filter forward iifname "tun0" ip saddr 10.90.0.0/24 ip daddr 198.51.100.0/24 drop
sudo nft -c -f /etc/nftables.conf
Гурав дахь команд файлыг хэрэгжүүлэхгүйгээр задлан шинжилдэг нь синтаксийн алдааг тасралт болохоос өмнө барина. Буцаах төлөвлөгөөтэйгээр хэрэгжүүл, учир нь forward гинжин дэх алдаатай дүрэм таны ажиллаж буй туннелийг тасалж болно.
Одоо байгаа урсгалууд таны шинэ дүрэмд анхаарал хандуулахгүй
Дүрэм үүсэхээс өмнө үүссэн conntrack бичлэг өмнөх accept-тай таарсаар байна. Тиймээс шинэ drop заримдаа шинэ холболтод ажиллаж байгаа мэт харагдаж, шалгаж буй холболтод юу ч хийдэггүй.
Гинжин дээд хэсэгт байгаа төлөвийн таарлыг уншина уу. Хэрэв таны дүрмээс өмнө established болон related трафикийг хүлээж авдаг бол аль хэдийн явагдаж буй урсгал бүр хаагдах хүртэл урсна. Яаралтай дүрэмд ихэвчлэн энэ зан үйл хэрэгтэй бөгөөд шууд таслалт хүлээх үед төөрөгдүүлдэг. Байрлуулахаас өмнө ямар нөлөө хүсэхээ шийд. Нээлттэй холболтыг дахин ашигласан туршилт танд буруу түүх ярина.
sudo conntrack -L -s 10.90.0.14 -d 198.51.100.20
sudo nft list ruleset | grep -n -A3 'ct state'
Эхний команд урсгал байгаа эсэхийг, хоёр дахь нь эрт төлөвийн дүрэм үүнийг хүлээж авсар байгаа эсэхийг харуулна. Хоёулаа зөвхөн унших бөгөөд ослын үед ажиллуулахад аюулгүй.
Энэ дүрэм юу биш вэ
Дүрэм нь домэйны хар жагсаалт, IPv6 бодлого эсвэл ганц програмын бүртгэлд тавих хязгаарлалт биш.
Тэдгээр тус бүрд өөрийн механизм хэрэгтэй. Домэйн блоклох нь нэрийг шийдвэрлэх ёстой бөгөөд пакетын шүүлтүүр үүнийг хийдэггүй. IPv6 трафикт өөрийн таарал хэрэгтэй, учир нь ip илэрхийлэл ip6 пакетын талаар юу ч хэлдэггүй. Програмын түвшний хязгаарлалт нь угтварын тааралд биш, үйлчилгээ эсвэл баталгаажсан проксид хамаарна. Эдгээр шаардлагыг тусад нь байлгах нь нэг нарийн дүрмээс дөрвөн ажил шаардахаас сэргийлдэг.
Энэ дүрмийн өгдөг гэрээ тодорхой: зөвшөөрөгдсөн пулаас нэг очих газрын угтвар руу чиглэсэн трафик татгалзагдана, харин хамааралгүй гарцын трафик одоогийн бодлогоо хадгална. Тэр өгүүлбэрийг дүрмийн дэргэд бич, дараагийн хүн юунд зориулагдсаныг мэдэх болно.