VPS галт хана: зөвхөн VPN портыг нээж, дараа нь үүнийг батал
Нэг порт нээлттэй байх ёстой, эс бөгөөс ямар ч клиент холбогдохгүй. Үлдсэнийг нь татгалзаж, дамжуулалтыг оролтоос тусгаарлаж, урьдчилан туршсан сэргээх замыг үлдээ.
Зөвхөн VPN портыг зөвшөөрдөг галт хана нэг дүрэм биш. Энэ нь ижил портын дугаарт хамаарах гурван тусдаа шийдвэр: оролтын хэлхээ дотоод процесс руу юу хүрч болохыг тодорхойлно, дамжуулалтын хэлхээ туннелийн клиентүүдийн нэрийн өмнөөс хостээр юу өнгөрч болохыг тодорхойлно, NAT хүснэгт гарч явахдаа эх сурвалжийн хаягийг дахин бичнэ. Аль нэгийг нь буруу хийвэл үр дүн нь цэвэр тасалдал байх нь ховор. Клиентүүдийг хүлээн авдаг ч юу ч ачаалахгүй хост, эсвэл хэн нэгэн хэлхээний дарааллыг унтах хүртэл хаалттай мэт харагдах хост гарч ирнэ.
Хааж болохгүй цорын ганц порт
VPN сонсогч нь таны урьдчилан таамаглах боломжгүй хаягуудаас холболтыг хүлээн авах ёстой тул тодорхойлолтоор нийтийн үйлчилгээ юм. Дизайны үндэс болсон цорын ганц үл хамаарах зүйл нь энэ: OpenVPN-д нэг UDP порт, WireGuard-д нэг UDP порт, SSL VPN-д нэг TCP порт. Бусад бүхэн туннелийн ард хамаарна, өөрөөр хэлбэл програмын үйлчилгээнүүд бүх интерфейс биш, туннелийн хаяг эсвэл loopback-д холбогдох ёстой.
Гэхдээ холбох нь хэрэгжүүлэлт биш. 0.0.0.0-д холбогдсон процесс нь дүрэм зөвшөөрсөн тохиолдолд л хүртээмжтэй, харин өгөгдмөл бодлого нь ямар ч дүрэмд тохироогүй урсгалын нөөц зам бөгөөд портыг удирдах дүрэм биш. Таны drop-ын дээр тавьсан accept нь accept хэвээр, үйлчилгээг нийтийн хаягаас зайлуулах нь бие даасан сайжруулалт бөгөөд хэлхээний орлуулалт биш.
Оролт, дамжуулалт, NAT өөр өөр асуултад хариулна
Оролтын урсгал нь хост өөрт нь зориулагдсан тул VPN сонсогч, захиргааны зам тэнд байрлана. Дамжуулалтын урсгал хостээр дамжин өнгөрч, туннелийн клиентүүдэд энэ нь net.ipv4.ip_forward=1-ийн хамт хэрэгтэй. Сонгодог хагас эвдэрсэн тохиргоо нь гарч буй урсгалыг зөвшөөрч, буцах чиглэлийг мартдаг тул клиент гар барилтыг дуусгаад дараа нь юу ч ачаалагдахгүй; тогтоосон ба холбогдох урсгалд зориулсан conntrack дүрэм тэр чиглэлийг хамарна.
NAT бол гурав дахь асуулт. postrouting-д дахин бичихгүй бол дамжуулсан пакетууд туннелийн хувийн эх сурвалжтай гарч, дээрээс хаягдана, учир нь хостээс цааш ямар ч сүлжээ пулыг буцааж чиглүүлэхийг мэдэхгүй. Тэр дүрэм дэх эх сурвалжийн угтвар нь VPN пултай тохирох ёстой, хост өөрийн хаягтай биш, мөн клиентийн дэд сүлжээг нэрлэсэн дамжуулалтын дүрэмд ч мөн адил.
IPv6 бол хоёр дахь бодлого, дараагийн бодол биш. Хатуу IPv4 хэлхээ, ip6tables дээр нээлттэй бодлоготой хост юу ч хаагаагүй; үйлчилгээнүүд нөгөө гэр бүлээр дамжин хүртээмжтэй хэвээр. Нэг бол дүрмийн багцыг ip6tables-аар тусга, эсвэл нийтийн интерфейс дээр IPv6-г санаатайгаар унтрааж, алийг нь сонгосноо бич.
Нэг уншилтаар ойлгомжтой суурь
Татгалзалаас эхэлж, дараа нь хостод хэрэгтэй зүйлийг л нэм. Эхлээд loopback ба хариултууд, дараа нь захиргааны зам, дараа нь туннелийн сонсогч, дараа нь клиентүүдэд зориулсан дамжуулалтын бодлого:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -m conntrack --ctstate NEW -j ACCEPT
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADEИнтерфейсийн нэрс, порт, пул нь орлуулагч юм; хуулахын оронд серверээс унш. Үр дүнг хадгалах нь бичихтэй адил чухал, учир нь зөвхөн санах ойд амьдардаг дүрмийн багц дараагийн дахин ачаалалтад алга болж, хостыг чимээгүйгээр дахин нээдэг. Түгээлтийн механизмаар тогтвортой болгож, машин ачаалагдахгүй өдрийн хувьд машины гадна хуулбар хадгал.
Хостоо алдалгүй сүүлчийн портыг хаах
Дизайнд нэг урхи бий. Хэрэв SSH зөвхөн туннелээр байгаа бол бүтэлгүйтсэн VPN үйлчилгээ SSH-г хамт аваад явна, буцах цорын ганц зам нь та хэзээ ч нээж үзээгүй консол байж болно. Сүүлчийн нийтийн портыг хаахаас өмнө тэр консол байгаа эсэх, та үнэхээр ашиглаж чадах эсэхийг батал, эсвэл туннелээс хамааралгүй нэг нарийн захиргааны зам үлдээ: тогтмол хаягаас SSH, зөвхөн түлхүүр, нууц үгийн баталгаажуулалт унтарсан.
Өөрчлөлтийг аль хэдийн тогтсон сессээс хэрэгжүүл, та шүүх гэж буй холболтоор биш. Алдаа байнгын болохын оронд хугацаа нь дуусахын тулд буцаалт төлөвлө, жишээ нь өмнөх дүрмийн багцыг сэргээдэг systemd-run --on-active=10min ажил, эхнийхийг туршихдаа хоёр дахь SSH сессийг нээлттэй байлга. Дараа нь буцаалтын ажил үнэхээр ажиллаж байгаа эсэхийг шалга, учир нь туршаагүй сэргээлт нь сэргээлт байхгүйтэй адил.
Скрипт биш, замыг шалга
Ачаалагдсан дүрмүүдийг унш, тэдгээрийг ачаалах ёстой байсан файлыг биш. Эрх бүхий гадаад хостээс зөвхөн зориулсан портууд хариулж байгаа эсэхийг батал; туннелийн дотроос нийтлэхээр зорьсон үйлчилгээнүүд хүртээмжтэй эсэхийг батал. Туннелийн урсгалыг ч хаадаг өгөгдмөл татгалзах бодлого нь хэн нэгэн ашиглахыг оролдох хүртэл ажиллаж буй түгжээтэй яг адилхан харагдана.
iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr showЗөвшөөрсөн порт, клиентийн пул, туннелийн интерфейс, захиргааны эх сурвалж, консолын журам зэргийг тохиргооны хажууд тэмдэглэ. Пул эсвэл интерфейсийн нэр дэх дараагийн өөрчлөлт нь шүүлтүүр болон NAT дүрэм хоёуланд нь тохирох ёстой, эс бөгөөс хост хэнд ч мэдэгдэхгүйгээр хагас нээлттэй төлөвт буцаж орно.
Нэг зуршил дүрмийн багцаас илүү үнэ цэнэтэй: өөрчлөлт бүрийн дараа дамжуулалтын замыг клиентийн хүсэлтээр, сэргээх замыг хоёр дахь сессээр батал. Таны ашиглаагүй түгжээ бол зөвхөн таамаг.