VirtualBox: NAT немесе көпір — VM VPN-і қайда бітеді
NAT қонақты хосттың артына жасырады, сондықтан хосттағы туннель оны жабады. Көпір қонаққа өз мекенжайын береді, сондықтан туннель VM ішінде болуы керек.
Виртуалды машина VPN клиентін іске қосқан сайын екі түрлі сұрақ бірге келеді және олардың жауаптары әртүрлі. Біріншісі — қонақтың ішіндегі туннель хостты қорғай ма, ал екіншісі — хосттағы туннель қонақты жаба ма. Адаптер режимі екеуін де шешеді, VPN бағдарламасының өзінен де көбірек. NAT адаптері хостты көрінетін шеткі нүкте етеді, ал көпір адаптері қонақты өз мекенжайымен желіге қояды.
Шифрланған сессияны шын мәнінде кім аяқтайды
Шифрланған сессия оны аяқтайтын машинаға тиесілі, ал клиент VM ішінде жұмыс істегенде бұл қонақ. Бұл туннельден қонақтың виртуалды адаптеріне кіретін трафик қана өтеді, ал гипервизор ешқашан өз бетінше басқа машинаны қонақ арқылы бағыттамайды. Сондықтан қонақ жұмыс істеп тұрған туннельді ұстай алады, ал хост ашық желіде шолып жүреді. Керісінше симметриялы емес, және көптеген нұсқаулықтар дәл осы асимметрияны қате түсінеді.
Сыртқы желі қай мекенжайды көретіні — адаптер режимі жауап беретін сұрақ. Ол шешілген соң жабылым саясат мәселесі болудан қалып, механикалық мәселеге айналады. Төмендегінің бәрі осы екі фактіден шығады.
NAT қонақты хостқа ұқсағанша қайта жазады
NAT кезінде гипервизор қонақтың әр пакетін бірінші коммутаторға жетпей тұрып хосттың мекенжайына қайта жазады. Содан кейін бұл трафик хосттың өз желілік стекіне беріледі, онда ол хосттың маршруттау кестесіне бағынады, соның ішінде хосттағы туннельге тиесілі әдепкі маршрут та бар. Осылайша NAT қонағы ешқандай конфигурациясыз хосттағы туннельмен жабылады, бұл қонақтан хостқа бағыты ұсынатынның керісі.
# on the host: adapter mode and NAT DNS behaviour
VBoxManage showvminfo "lab-vm" | grep -i -E "nic|nat"
VBoxManage modifyvm "lab-vm" --natdnshostresolver1 on
Өз клиентін іске қосатын қонақ сол туннельді қонақтың ішінде аяқтайды, ал шифрланған трафик сол қайта жазу арқылы шығады, сондықтан хост қолданбалары өз жолын және өз шығу мекенжайын сақтайды. VirtualBox бұл режимде атауларды шешуге де ие және --natdnshostresolver1 қосылмаған жағдайда қонақтың сұраныстарын өз механизмі арқылы жібереді. Оны қосу қонақтың іздеулерін хосттың шешушісіне береді, бұл хосттың өз көрінісі дұрыс болғанда шешімді түзетеді және дәл сол мөлшерде тек туннель ішінде ғана болуы мүмкін шешушіні береді. Параметрді өзгертудің алдында VM өшірілуі керек, ал параметр қонақ бағдарламасына емес, адаптерге тиесілі.
Көпір қонаққа өз жалдауын және өз ашылуын береді
Көпір қонақтың кадрларын физикалық сегментке жібереді, сондықтан DHCP оған жалдау береді және желі оны бөлек хост ретінде қарастырады. Әр көпірленген қонақ өз әдепкі маршрутымен тәуелсіз туннель ұстай алады, ал хосттың кестесі ешқашан өзгермейді. Бағасы — ашылу: қонақ хабар таратылымдарына жауап береді, көрші кестелерінде көрінеді және коммутатор портының қауіпсіздігі мен сымсыз клиенттерді оқшаулау астына түседі. Хосттағы туннель бұл құрылымды да жабалмайды, өйткені қонақтың кадрлары хост стекінен ешқашан өтпейді.
NAT жағдайынан бұл айырмашылықты тұспал ретінде қалдырмай, ашық айтқан жөн. Көпірленген қонаққа трафигі туннельді пайдалануы керек болғанда өз клиенті мен өз тіркелу деректері қажет. Қонақ жергілікті желіге көрінбейтін болуы керек жерде NAT немесе бақыланатын маршруттауы бар тек ішкі желі жақсырақ жоба болып табылады.
Қонақ неге хосттың шлюзі бола алмайды
Қонақтың туннелін хостқа қарызға берудің екі ірі гипервизордың ешқайсысында қолдау көрсетілген ажыратқышы жоқ. Хостта қонақтың туннеліне маршрут та, оған сілтейтін түрлендіру ережесі де жоқ, сондықтан қонақ пен хост трафигі бөлек иелері бар бөлек ағындар болып қалады. Бұл бағыт адаптер режиміне қарамастан іске аспайды.
Жарамды баламалар — қайта бағыттаулар мен проксилер. SSH жергілікті қайта бағыттауы хостқа өз цикліне қосылуға мүмкіндік береді, ал қонақ ағынды туннельге алып барады, бұл екінші клиент орнатпай-ақ TCP қызметтерін жабады. Хосттың өз IP трафигіне оның орнына қонақтың туннелін пайдаландыру қонақтың ішінде маршруттаушыны, сондай-ақ хостта айқын маршрут пен хостта түрлендіруді талап етеді. Бұл қанат белгісі емес, шағын желілік жоба және қайтар жолдың жоспарын қажет етеді. Қонақ тек клиентті іске қосу үшін болса, клиентті хостқа қойып, артық секірісті алып тастаңыз.
ssh -N -f -L 8080:internal-host.example:80 user@lab-vm
Шешушілер мен маршруттар шекарадан өтпейді
DNS опцияны алған адаптерге бағынады, сондықтан қонақ хосттың туннель шешушісін мұрагерлікке алмайды және хост қонаққа жіберілген серверді ешқашан білмейді. Жіберілген dhcp-option DNS мәндері оларды қабылдаған интерфейске қатысты, сондықтан клиенті жоқ көпірленген қонақ ішкі атауларды шеше алмайды. NAT қонағы әдетте гипервизордың DNS өңдеуін пайдаланады, ал айырмашылық әр ортада бір командамен көрінеді.
# on the host
VBoxManage showvminfo "lab-vm" | grep -i -E "nic|nat"
# inside a Linux guest
ip -4 route
resolvectl status
# inside a Windows guest
Get-DnsClientServerAddress
Біреуі хостқа бағынады деп есептемес бұрын қонақтың ішіндегі шешушіні және маршрутты оқыңыз. Ішкі атаулар сонда шешілуі керек болса, туннель шешушісін қонақтың өз адаптеріне қосыңыз, содан кейін тек туннельдің артында ғана бар атаумен тексеріңіз. Әр VM үшін адаптер режимін, туннель иесін және шешушінің көзін жазып отырыңыз, өйткені осы үш факт кейінгі кез келген сұраққа жауап береді. Басқа гипервизорлар режим атауларын өзгертеді, бірақ қағиданы бұзбайды.