Туннелээр алсын /24 сүлжээнд хүрэх: NETMAP, DNAT эсвэл маршрут?
Бүх префиксийг NETMAP-аар зураглах, хост бүрт DNAT дүрэм нэмэх эсвэл бодит мужийг маршрутлах, мөн алс тал юу харах ёстой, хэн трафик эхлүүлж болохыг харгалзан шийдэх.
Туннелийн төгсгөлийн цэгийн ард байгаа дэд сүлжээнд гурван аргаар хүрч болох бөгөөд баримт цуглуулах нэг минут ихэвчлэн хоёрыг нь хасаад өгдөг. Баримтууд нь: тэндхийн серверүүд хэрэглэгчдийг ялгах шаардлагатай юу, тэндээс хэн нэгэн таны мужид хэзээ нэгэн цагт холбогдох уу, мөн алс үзүүрийн маршрутчийг хэн засварлаж болох вэ. Эдгээр гурван асуултад хариулбал загвар өөрөө сонгогдоно. Үлдсэн нь та төгсгөлийн цэгийг ажиллуулж, түүний галт ханыг засварлаж чадна гэж үздэг.
Гурван сонголт, тус бүр нь юуг үнэхээр өөрчлөх вэ
Префикс зураглал, хост бүрийн DNAT, маршрутлагдсан префикс бүгд ижил хоёр мужийн хооронд пакетуудыг зөөдөг ч өөр өөр зүйлийг өөрчилдөг. Зураглал нь алиас муж үүсгэж, нислэгийн үед хаягуудыг арифметикаар дахин бичдэг. Хост бүрийн дүрэм мөн дахин бичдэг, зөвхөн очих газрыг гараар нэрлэдэг. Маршрутлагдсан префикс юу ч дахин бичихгүй: пакетууд бодит хаягыг хадгалж, хоёр үзүүр эдгээр хаяг хаана байрладаг талаар санал нэгддэг.
| What the far side needs | Prefix mapping | Per-host DNAT | Routed prefix |
|---|---|---|---|
| Users visible to its logs | Only without source NAT | Same condition | Yes, unchanged |
| To start a connection toward you | No, alias is local | No, same reason | Yes, both ends route |
| To absorb a new host | Yes, arithmetic only | No, one rule per address | Yes, it simply routes |
| To require no config change | Yes, with source NAT | Yes, same condition | No, it needs a route back |
Хасах үйлдлийг алс талаас эхлээрэй, тэнд хязгаарлалтыг өөрчлөх хамгийн хэцүү. Хэрэв тэндхийн сервер клиентийн хаягыг логт бичдэг, зөвшөөрөгдсөн жагсаалттай харьцуулдаг эсвэл өөр системд дамжуулдаг бол эх сурвалжийг орчуулах нь түүний цорын ганц таних тэмдгийг устгана. Хэрэв алс тал мөн дотогш холбогдох шаардлагатай бол орчуулга бүрэн хасагдана, учир нь тэнд алиас байгааг хэн ч мэдэхгүй. Алс тал зөвхөн хүсэлтэд хариу өгдөг үед л хямд сонголтууд аюулгүй болно.
Префиксийн хосууд, яагаад хэмжээ нь таарах ёстой вэ
NETMAP бол ижил урттай префиксийн хос дээр ажилладаг nat хүснэгтийн зорилт юм. Дотоодоо хаяг бүрийн хүснэгтгүй: префиксийг авч, хост битүүдийг хадгалаад шинэ префикст дахин холбодог, тиймээс /24 нь /24 дээр зурагдана, хэзээ ч /25 дээр биш. Байрлал чиглэлийг тодорхойлно: PREROUTING дэх очих газрын тохирол пакет хаашаа явахыг, POSTROUTING дэх эх сурвалжийн тохирол хаанаас ирснийг дахин бичнэ.
192.168.2.17 дээрх хост таны клиентүүдэд 10.50.1.17 болж харагдана, сүүлийн октет нь чимэглэл биш — хоёр талд ижил тоо. Маргааш 192.168.2.40 дээр хост нэмбэл түүний алиас 10.50.1.40 болно, засварлах дүрэм байхгүй.
Клиентүүдэд алиас мужид зориулсан таны хайрцаг руу чиглэсэн маршрут орсоор байна, алиас нь тэдний аль хэдийн хүрдэг дэд сүлжээнд байвал л шаардлагагүй. Гарцад алиасны маршрут шаардлагагүй, учир нь очих газрын орчуулга маршрутын хайлтаас өмнө PREROUTING дээр ажилладаг. Дамжуулалт мөн асаалттай байх ёстой, эс бөгөөс цөм дахин бичсний дараа пакетыг хаяна. Доорх гурван команд нь клиентүүд br0 дээр, алиас 10.50.1.0/24 дээр, туннель tun0 дээр байх Debian загварын гарц дахь бүх тохиргоо юм.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i br0 -d 10.50.1.0/24 -j NETMAP --to 192.168.2.0/24
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEХариулт өөрөө буцах замаа олох ёстой
Очих газрыг дахин бичих нь пакет хаана хүргэгдэхийг л шийднэ. Алс сервер өөрөө хүрч чадах хаягт хариулах ёстой бөгөөд үүнийг зохицуулах хоёр арга бий. Хариултууд таны хайрцаг руу буцаж ирэхийн тулд эх сурвалжийг орчуулах, эсвэл эх сурвалжийг хэвээр үлдээж алс талд клиентийн мужийн маршрут өгөх.
Гадагшаа гарах masquerade нь богино зам: POSTROUTING дэх нэг дүрэм, алс тал таны туннелийн хаягыг хардаг тул өөрт нь маршрут хэрэггүй. Үнэ нь хэрэглэгч бүр нэг хаяг руу шахагдаж, хэрэглэгч тус бүрийн лог утгагүй болно. Эх сурвалжийг бүтэн үлдээвэл тэр мэдээлэл хадгалагдана, гэхдээ тэгвэл алс сайт клиентийн мужийн хариултыг туннелээр буцааж илгээх ёстой.OpenVPN сервер дээр энэ нь push хийгдсэн push "route 10.50.9.0 255.255.255.0", нэмээд route 192.168.2.0 255.255.255.0 мөр.
Үнэтэй бүтэлгүйтэл бол тус бүрийн талыг хийх явдал. Зарим трафикийг masquerade хийж байхад алс тал өөр трафикийн буцах маршрутыг ч авч явбал, хариултууд холболт хянах бичлэг хэзээ ч харагдаагүй интерфэйс дээр ирнэ. Клиент сервер үйлчилсэн гэж бүртгэсэн хүсэлтэд timeout гэж мэдэгдэнэ. Урсгалын хоёр чиглэл ижил netfilter инстансаар дамжих ёстой: нэг гарц орчуулдаг, цувралд хоёр галт хана биш.
conntrack -L -d 10.50.1.17
iptables -t nat -L PREROUTING -v -nБичлэгийг хоёр чиглэлд уншаарай: анхны tuple нь очих газар дээр таны алиасыг хадгална, хариултын tuple бодит хаягыг агуулна. Хариултын tuple байхгүй бол асуудал дүрэмд биш, буцах замд байна. PREROUTING тоолуурууд хэзээ ч хөдөлөөгүй бол пакет тэр hook-т хүрээгүй.
Мөргөлдөөн ба эхэнд ажиллах хайлт
Хоёр өөр муж мөргөлдөж болох бөгөөд хоёр бүтэлгүйтэл муу дүрэм биш, эвдэрсэн туннель мэт харагдана. Таны зохиосон алиас бүх замд ашиглагдаагүй байх ёстой, бодит алс муж таны сүлжээнд аль хэдийн байх ёсгүй. Давхардал нь хааяа буруу хост руу трафик үүсгэдэг бөгөөд үүнийг татгалзсан холболтоос оношлох хэцүү. Дүрэм нэмэхийн өмнө маршрутын хүснэгтээс асуу.
Гарц дээр, ip route get 192.168.2.17 туннелийн төхөөрөмжийг нэрлэх ёстой; локал bridge гэдэг нь алс муж сүүдэрлэгдсэн бөгөөд ямар ч nat дүрэм засахгүй гэсэн үг. Хэрэв таны сүлжээ 192.168.2.0/24-ийг аль хэдийн ашиглаж байгаа бол мөргөлдөөн дээр зураглал давхарлахын оронд алс сайтыг дахин дугаарла.
Бодит клиентээс туршиж, дараа нь хадгалах
Алиасыг үнэхээр ашиглах машинаас туршаарай, гарцаас биш, учир нь локалаар үүссэн трафик PREROUTING-ээр хэзээ ч ижилхэн дамждаггүй. Алиастай нэг хост руу холболт нээж, тоолуур ба conntrack бичлэг хамт гарч ирэхийг ажиглаад, дараа нь хаагаад бичлэг явсныг батал. Хуучирсан бичлэг хагас нээлттэй холболтыг заадаг бөгөөд энэ нь ихэвчлэн хариулт буцаж ирээгүй гэсэн үг.
curl -sv http://10.50.1.17/ -o /dev/null
ss -tn dst 10.50.1.17
conntrack -L -d 10.50.1.17Хоёр, гурван амжилттай холболт арифметикийг баталдаг ч тогтвортой байдал эсвэл дараагийн инженерийн тухай юу ч хэлдэггүй. Дүрмүүдийг ачаалах процесс уншдаг газарт хадгалаарай, Debian ба Ubuntu дээр энэ нь iptables-save > /etc/iptables/rules.v4 netfilter-persistent идэвхжсэн байх гэсэн үг. Дахин ачаалахад алга болох зураглал байхгүйгээс ч дор, учир нь доголдол буруутгах сүүлийн үеийн өөрчлөлтгүйгээр ирдэг.
Дүрмүүдийн хажууд тэмдэглэл үлдээгээрэй: алиас муж, бодит муж, хослолын шалтгаан, аль тал эхэлж болох. Тэр тэмдэглэл нь загварыг хэн ч устгаж зүрхлэхгүй дүрмийн овоолгоос ялгадаг. Энэ нь дараагийн асуултыг ч шийднэ: алс сайт хост нэмэхэд хэн ч тохируулаагүй хаяг аль хэдийн хариулж байна. Тэмдэглэлд алс талд буцах маршрут хэрэгтэй гэж бичсэн бол дараагийн хүн masquerade дүрмийг авбал холболт тасрахыг мэднэ. Энд баримтжуулалт хямд; шөнийн гурван цагт NAT-ийн хамаарлыг дахин нээх нь хямд биш.