VPS firewall: yalnız VPN portunu açıq saxla, sonra sübut et
Bir port ictimai qalmalıdır, əks halda heç bir müştəri qoşulmur. Qalanlarını rədd et, yönləndirməni girişdən ayır və əvvəlcədən sınaqdan keçirdiyin bərpa yolu burax.
Yalnız VPN portuna icazə verən firewall tək qayda deyil. Bu, eyni port nömrəsinə aid üç ayrı qərardır: giriş zənciri yerli prosesə nəyin çata biləcəyini, yönləndirmə zənciri tunnel müştəriləri adına hostdan nəyin keçə biləcəyini müəyyən edir, NAT cədvəli isə çıxışda mənbə ünvanını yenidən yazır. Onlardan birini səhv etsən, nəticə nadir hallarda təmiz kəsinti olur. Müştəriləri qəbul edən, amma heç nə yükləməyən host alırsan, ya da kimsə zəncir sırasını oxuyana qədər bağlı görünən host.
Bağlana bilməyən yeganə port
VPN dinləyicisi proqnozlaşdıra bilmədiyin ünvanlardan bağlantı qəbul etməlidir, yəni tərifinə görə ictimai xidmətdir. Dizaynın üzərində qurulduğu yeganə istisna budur: OpenVPN üçün bir UDP portu, WireGuard üçün bir UDP portu, SSL VPN üçün bir TCP portu. Qalan hər şey tunnelin arxasına aiddir, yəni tətbiq xidmətləri bütün interfeyslərə deyil, tunnel ünvanına və ya loopback-ə bağlanmalıdır.
Ancaq bağlama icra etmək deyil. 0.0.0.0 ünvanına bağlanmış proses yalnız qayda icazə verdikdə əlçatandır və defolt siyasət heç bir qaydaya uyğun gəlməyən trafik üçün ehtiyatdır, portu idarə edən qayda deyil. Rəddinin üstünə qoyulmuş icazə yenə icazədir və xidməti ictimai ünvandan çıxarmaq zəncirin əvəzi deyil, ayrıca yaxşılaşdırmadır.
Giriş, yönləndirmə və NAT fərqli suallara cavab verir
Giriş trafiki hostun özünə yönəlib, yəni VPN dinləyicisi və inzibati yol orada yaşayır. Yönləndirmə trafiki hostdan keçir və tunnel müştərilərinə o, üstəgəl net.ipv4.ip_forward=1 lazımdır. Klassik yarımçıq konfiqurasiya çıxan axına icazə verir və qayıdış istiqamətini unudur, beləliklə müştəri əl sıxışmasını tamamlayır və sonra heç nə yüklənmir; qurulmuş və əlaqəli trafik üçün conntrack qaydası həmin istiqaməti örtür.
NAT üçüncü sualdır. Postrouting yenidən yazması olmadan yönləndirilən paketlər hostdan şəxsi tunnel mənbəyi ilə çıxır və yuxarıda atılır, çünki hostdan kənarda heç bir şəbəkə hovuzu geri marşrutlaşdırmağı bilmir. O qaydadakı mənbə prefiksi VPN hovuzuna uyğun olmalıdır, hostun öz ünvanına deyil, və müştəri alt şəbəkəsini adlandıran yönləndirmə qaydası üçün də eynidir.
IPv6 ikinci siyasətdir, sonradan düşünülən şey deyil. Ciddi IPv4 zənciri və açıq ip6tables siyasəti olan host heç nə bağlamamışdır; xidmətlər digər ailə üzərindən hələ də əlçatandır. Ya qayda dəstini ip6tables ilə əks etdir, ya da IPv6-nı ictimai interfeysdə qəsdən söndür və hansını seçdiyini yaz.
Bir baxışda oxuna bilən baza
Rədd ilə başla, sonra yalnız hostun ehtiyac duyduğunu əlavə et. Əvvəlcə loopback və cavablar, sonra inzibati yol, sonra tunnel dinləyicisi, sonra müştərilər üçün yönləndirmə siyasəti:
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 MASQUERADEInterfeys adları, port və hovuz yer tutucudur; onları kopyalamaq əvəzinə serverdən oxu. Nəticəni saxlamaq onu yazmaq qədər vacibdir, çünki yalnız yaddaşda yaşayan qayda dəsti növbəti yenidən başlatmada yox olur və hostu sakitcə yenidən açır. Onu distributivin mexanizmi ilə qalıcı et və maşın açılmayacaq gün üçün maşından kənarda bir nüsxə saxla.
Hostu itirmədən son portu bağlamaq
Dizaynda bir tələ var. Əgər SSH yalnız tunnel vasitəsilə mövcuddursa, uğursuz VPN xidməti SSH-ı da aparır və geri qayıtmağın yeganə yolu heç vaxt açmadığın konsol ola bilər. Son ictimai portu bağlamazdan əvvəl həmin konsolun mövcud olduğunu və ondan həqiqətən istifadə edə bildiyini təsdiqlə, ya da tunneldən asılı olmayan bir dar inzibati yol saxla: sabit ünvandan SSH, yalnız açarlar, parol autentifikasiyası söndürülmüş.
Dəyişikliyi artıq qurulmuş sessiyadan tətbiq et, filtrəmək üzrə olduğun bağlantıdan deyil. Geri qaytarmanı planla ki, səhv daimi olmaq əvəzinə bitsin, məsələn əvvəlki qayda dəstini bərpa edən systemd-run --on-active=10min işi, və birincini sınayarkən ikinci SSH sessiyasını açıq saxla. Sonra geri qaytarma işinin həqiqətən işə düşdüyünü yoxla, çünki sınanmamış bərpa bərpa olmamaqla eynidir.
Skripti deyil, yolu yoxla
Yüklənmiş qaydaları oxu, onları yükləməli olan faylı deyil. Səlahiyyətli xarici hostdan yalnız nəzərdə tutulan portların cavab verdiyini təsdiqlə; tunnelin içindən yayımlamaq istədiyin xidmətlərin əlçatan olduğunu təsdiqlə. Tunnel trafikini də bloklayan defolt-rədd siyasəti kimsə ondan istifadə etməyə çalışana qədər işlək bağlanma ilə eyni görünür.
iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr showİcazə verilən portu, müştəri hovuzunu, tunnel interfeysini, inzibati mənbəyi və konsol prosedurunu konfiqurasiyanın yanında qeyd et. Hovuzda və ya interfeys adında növbəti dəyişiklik həm filtrlə, həm də NAT qaydası ilə uyğunlaşdırılmalıdır, əks halda host heç kim görmədən yarıaçıq vəziyyətə qayıdır.
Bir vərdiş qayda dəstindən dəyərlidir: hər dəyişiklikdən sonra yönləndirmə yolunu müştəri sorğusu ilə, bərpa yolunu isə ikinci sessiya ilə sübut et. İstifadə etmədiyin bağlanma sadəcə fərziyyədir.