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 үчүн адаптер режимин, туннелдин ээсин жана чечүүчүнүн булагын жазып отур, анткени бул үч факты кийинки дээрлик ар бир суроого жооп берет. Башка гипервизорлор режимдердин атын өзгөртөт, бирок принципти бузбайт.