CGNAT портуудыг хааж байгаа үед VPS-ээр дамжуулан гэрийн серверийг нийтлэх
Хөтчөөс гэрийн машин хүртэлх зам: шугам CGNAT-ийн ард байгааг батла, DNS-ийг VPS рүү чиглүүл, нэг портод DNAT хий, буцах замыг засварлаж, гаднаас шалга.
Би гаднаас эхэлсэн, хэрэглэгч хийх байсан шиг: нэрийг мобайл интернетийн утасны хөтөч дээр бичээд холболт хугацаа дуустал өлгөөтэй байгааг харсан. Нэр шийдэгдэж байсан тул DNS хэвийн байв. Гэрийн маршрутерчийн порт дамжуулах хуудас ч мухар зам байсан, учир нь түүний WAN хаяг 100.64.31.42-ыг харуулж байсан бөгөөд энэ нь үйлчилгээ үзүүлэгч намайг интернэтээс чиглүүлэх хаяг биш юм. Энэ тоо бүх гэмтлийг тайлбарлана: шугам carrier-grade NAT-ийн ард байгаа тул туннелийн миний талын нийтийн хаяг үйлчилгээ үзүүлэгчид хамаарна. Дараах нь тэр өлгөөтэй табаас хариу өгдөг үйлчилгээ хүртэлх миний явсан зам юм.
Хэрэглэгчээс эхэлж, дотогш яв
Аливаа дүрмийг өөрчлөхөөс өмнө гинжин хэлхээ хаана зогсдогийг батла. Зөөврийн компьютер дээр dig +short files.example.net командыг ажиллуулж, VPS-ийн хаягийг буцааж авсан нь миний машин дээрх хуучирсан DNS-ийг үгүйсгэв. Дараа нь curl -v --connect-timeout 5 files.example.net:5022 татгалзахаас өмнө хугацаа хэтэрсэн. Энэ ялгаа чухал: хугацаа хэтэрэх нь ихэвчлэн багцууд замд хаягдаж байгааг илэрхийлдэг бол татгалзал нь ямар нэгэн зүйл хариулж үгүй гэсэн гэсэн үг.
Дотогш хийсэн дараагийн алхам нь VPS өөрөө байв. ss -ltnp 5022 дээр сонсож байгаа юу ч харуулсангүй, энэ нь DNAT дүрэм үүсэхээс өмнө хүлээгдэж байсан зүйл юм. Мөн тэр машин дээр wg show (эсвэл OpenVPN-ийн хувьд ip -br a show tun0) гэрийн peer ажиллаж байгаа, шинэ handshake-тай байгааг баталсан. Peer ажиллахгүй бол ямар ч NAT дүрэм тус болохгүй бөгөөд гэрийн маршрутерчийн VPN хуудасны ногоон гэрэл юу ч гэсэн үг биш.
Гэрийн шугам үнэхээр CGNAT-ийн ард байгааг батла
Маршрутерчийн WAN интерфейс дээр мэдээлдэг хаягийг гадаад үйлчилгээний харж буй хаягтай харьцуул. 100.64.0.0/10 дотор байгаа бүхэн, өөрөөр хэлбэл 100.64.x.x-ээс 100.127.x.x хүртэл, RFC 6598-ийн хуваалцсан хаягийн хүрээ бөгөөд интернэтээс хүрэх боломжгүй. Маршрутерчийн энгийн хувийн хаягтай гэж мэдэгдэж, нийтийн хайлт ямар ч холбоогүй зүйл буцаах үед ч мөн адил дүгнэлтэд хүрнэ. CGNAT шугам нь зөвхөн дараагийн lease хүртэл хүчинтэй нийтийн хаягтай ч ирж болох тул порт дамжуулалт нэг цаг ажиллаж байгаа мэт харагдаад дараа нь чимээгүй үхдэг.
Зарим үйлчилгээ үзүүлэгч үнэхээр бодит нийтийн хаяг өгдөг боловч орон сууцны дансанд ирж буй 80 ба 443 портыг хаадаг. Хэрэв таны үйлчилгээ зөвхөн вэб бөгөөд WAN хаяг нь үнэхээр нийтийн бол relay барихаас өмнө дэмжлэгээс асуу. Хэрэв тийм биш бол доорх загвар порт бүрт адилхан хамаарах тул туршилтыг маршрутерчийн талд зогсоох нь зүйтэй: үйлчилгээ үзүүлэгчийн сүлжээн дэх орчуулагч холболтыг таны WAN интерфейст хүрэхээс өмнө дуусгадаг.
Нэрийг VPS-ийн хаяг руу чиглүүл
DNS трафикийг дамжуулдаггүй, тиймээс үйлчилгээний A бичлэгт VPS-ийн нийтийн хаяг байх ёстой. 192.168.1.20 руу чиглэсэн A бичлэг нь зөвхөн VPN дотор байгаа хэрэглэгчдэд ашигтай шийдэгддэг; интернэтээс хэн ч чиглүүлж чадахгүй хаяг руу шийдэгддэг. VPS-ийн өөрийн админ нэвтрэлтэд тусдаа нэр хадгалдаг, бичлэг аль хостод хамаарахыг хэзээ ч андуурахгүйн тулд.
Хэрэв VPS болон гэрийн машин хоёулаа HTTP үйлчилдэг бол тус бүрд нь өөрийн нэрийг өгч, хэн хариулахыг VPS шийдэг. Тэднийг нэг нэрэнд нэгтгэж, прокси зөв backend сонгоно гэж найдах нь яг буруу хост дээр үдээс хойш алдаа хайж суух зам юм.
Нэг порт DNAT-аар, SSH 22 дээр үлдэнэ
Шууд сонголт нь VPS дээрх очих хаягийн NAT. Ажиллаж буй цөмд forwarding асааж, дүрэмд гэрийн серверийн туннелийн хаягийг үлдээ, LAN хаягийг биш:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d 198.51.100.10 --dport 5022 -j DNAT --to-destination 10.8.0.2
VPS-ийн өөрт нь SSH-ийг 22 дээр үлдээж, өөр портыг, жишээ нь 5022-ыг гэрийн машин руу дамжуул. 22-ыг унтарсан машин руу дамжуулбал түүнийг засах боломжтой цорын ганц замыг алдана. Мөн адил логик проксид хамаарна: VPS-ийн удирдлагын портыг relay дүрмээс гадуур байлга.
Дүрмүүд ажиллаж эхлэхэд тэдгээрийг байнгын болго. Debian эсвэл Ubuntu дээр apt install iptables-persistent ба дараа нь netfilter-persistent save тэдгээрийг /etc/iptables/rules.v4 файлд бичдэг. firewalld бүхий хост дээр эквивалент нь бүс дэх байнгын порт дамжуулалт бөгөөд хэрэгжихээс өмнө firewall-cmd --reload шаардлагатай. Зөвхөн санах ойд амьдардаг дүрмүүд үйлчилгээ үзүүлэгчийн анхны засвар үйлчилгээний дахин ачаалалтад алга болдог, ихэвчлэн муу цагт.
Буцах замыг засварла, эсвэл түүнд хэрэгцэхээс зайлсхий
DNAT зөвхөн очих хаягийг дахин бичдэг. Гэрийн сервер холболтыг анхны хэрэглэгчийн хаягаас хардаг бөгөөд хэрэв түүний өгөгдмөл маршрут гэрийн маршрутерч руу зааж байвал хариу нь гэрийн WAN-аар гарч, тэнд үйлчилгээ үзүүлэгчийн орчуулагч түүнийг хаядаг. Энэ тэгш бус байдал нь DNAT дүрэм бүрэн зөв харагдсаны дараа тохиолдсон хоёр дахь гэмтэл байв.
Хоёр засвар ажилладаг. Гэрийн машиндад бодлогын маршрут өгч, туннелээс ирсэн трафик туннелээр буцаж яваг:
ip rule add from 10.8.0.2 table 100
ip route add default dev wg0 table 100
Эсвэл VPS эх үүсвэрийг дахин бичээд, хариунд хүрч чадах хаяг байг, conntrack түүнийг гарах замд эргүүл:
iptables -t nat -A POSTROUTING -d 10.8.0.2 -p tcp --dport 5022 -j SNAT --to-source 10.8.0.1
SNAT хувилбар нь бодит хэрэглэгчийн хаягийг гэрийн серверээс нуудаг тул програмын лог peer хэлбэрээр 10.8.0.1-ийг харуулдаг. Анхны хаягийг програмын түвшинд дамжуул, эсвэл хэрэглэгч тус бүрийн логийн алдагдлыг хүлээн зөвшөөр, гэхдээ үүнийг ослын үеэр илрүүлэхийн оронд санаатайгаар шийд.
Бүх замыг гаднаас шалга
VPS ч биш, гэр ч биш сүлжээнээс шалга: мобайл интернетийн утас эсвэл өөр газар дахь хямд shell. nc -vz files.example.net 5022 амжилттай холболтын тухай мэдээлэх ёстой, openssl s_client -connect files.example.net:443 -servername files.example.net нийтийн нэрийн сертификатыг харуулах ёстой. Дараа нь үйлчилгээ үзүүлэгчийн аюулгүй байдлын бүлэг эсвэл үүлэн firewall-ыг шалга. Хэзээ ч багц хардаггүй DNAT дүрэм ихэвчлэн хост-оос нэг давхарга дээгүүр блоклогддог.
Эцэст нь туннел унах үед юу болохыг шийд. DNAT дүрэм холболтыг хүлээн авсаар байгаад тэдгээрийг чимээгүй үхсэн туннел руу оруулдаг бөгөөд энэ нь яг эвдэрсэн үйлчилгээ шиг харагддаг. VPS дээр peer ажиллахгүй байхад портыг татгалздаг эрүүл мэндийн шалгалт хэдхэн мөрөнд тусч, нэг цагийн таамаглалыг хэмнэдэг. Үүний дараа дүрэм засахыг зогсоож, итгэхээс өмнө нэг өдөр ажигла.