Хост туннел аркылуу сереп салат, ал эми жанындагы контейнер эч нерсеге жетпейт. Өз VPN кардары бар контейнерден порт жарыялоо андан да жаман: сурам келет, жооп эч качан чыкпайт. Экөө тең хосттогу маршруттоо чечимдери, ал эми Docker жөн гана кабарчы.

Үч суроо ушул эки учурдун кайсынысы экенин аныктайт жана болжол менен бир мүнөт алат.

Бирдей көрүнгөн эки бузулуу

Биринчиси — кайтуу жолунун маселеси. Жарыяланган порт контейнерге которулат, сурам келет, ал эми жооп хосттун демейки маршруту менен жөнөтүлөт, аны OpenVPN кардары tun0-ге багыттаган. Жооп алыскы тарап күтпөгөн даректен чыгат жана жок кылынат. Экинчиси — префикстер кагылышы: Docker-дын демейки көпүрөсү 172.17.0.0/16-га ээ, ал эми корпоративдик туннель ошол эле диапазонду түртөт.

Бири маршрут таблицасы менен, экинчиси көпүрөнү кайра номерлөө менен оңдолот. Кайсынысы кайсы экенин билгенге чейин оңдоо — иштеп турган контейнерди бузуунун жолу.

Үч суроо менен чеч

Биринчи суроо: VPN-ди токтоткондо бузулуу жоголобу? Туннель өчүк турганда баары иштесе, кайтуу жолунан шектен. Экинчи суроо: ip route show table all ошол эле префиксти эки жолу көрсөтөбү, бир жолу көпүрөдө жана бир жолу tun0-де? Ошол — кагылыш. Үчүнчү суроо: жабыркаган дарек контейнерби, NAT коногубу же көпүрө менен туташкан конокпу?

Үчүнчү суроо маанилүү, анткени ар биринин туура оңдоосу башка, ал эми контейнердин оңдоосун libvirt коногуна колдонуу бир кечки убакытты текке кетирет.

ip route
ip route show table all | grep -E '172\.1[7-9]|10\.8'
docker network inspect bridge --format '{{.IPAM.Config}}'

Кайтуу жолу: бир булак дареги үчүн таблица

Контейнердин трафиги физикалык интерфейстен чыгышы керек болсо, ал эми хосттун өзү туннелди колдонсо, булакка негизделген маршруттоо — эң кичине өзгөртүү. Контейнердин дарегине туура келген эреже кошуп, аны өзүнчө таблицага жөнөтүңүз. Хосттогу башка эч нерсе кыймылдабайт.

ip rule add from 172.22.0.3 lookup 10
ip route add default via 172.22.0.1 table 10

Булагы ошол дарек болгон ар бир пакет адегенде таблица 10ду карайт, ал эми таблица 10 аны туннелдин ордуна көпүрө дарбазасына жөнөтөт.

Муну менен текшерүү: ip route get 1.1.1.1 from 172.22.0.3. Жооп көпүрө интерфейсин аташы керек, tun0ду эмес. Ошентип кошулган эрежелер кайра жүктөөдө жоголот, ошондуктан аларды контейнерге ээ unit же тармактык илгичке жазыңыз.

Ошол эле үлгү WireGuard контейнерине да жарайт, мында жооп жолу да ачык эрежени талап кылат.

Префикстер кагылышы: көпүрөнү кайра номерле

Маршрут таблицасы бир префиксти бир жерге жөнөтөт. Эгер VPN 172.17.0.0/16ды түртсө, ал эми Docker-дын көпүрөсү буга чейин ошол жерде болсо, төмөнүрөөк метрика жеңет: Docker туташкан маршрутун 0 метрика менен орнотот, ал эми түртүлгөн маршрут 50 менен келет. Ошондо Docker иштеп жатканда туннель бузулгандай көрүнөт, же тескерисинче, орнотуу тартибине жараша. Метрика менен күрөшүүнүн ордуна көпүрөнү кайра номерлеңиз.

{
  "bip": "10.200.0.1/24",
  "default-address-pools": [{"base": "10.201.0.0/16", "size": 24}]
}

Өзгөртүүдөн кийин Docker-ды кайра иштетип, эски пул менен курулган тармактарды кайра түзүңүз. Анын ордуна метриканы өзгөртүү кагылышты кийинки жүктөөгө гана жылдырат.

VM-дерге дагы башка жооп керек

Демейки NAT тармагындагы libvirt коногу хосттун маршруттоосун мураска алат жана хосттун туннели демейки маршрутка ээ болгондон кийин сыртка чыгууну токтотот. Конокту көпүрөлүү же macvtap түзмөгүнө которуу ага физикалык тармакта өз жолун берет. virt-manager-де жабдуу кошуңуз, Network тандаңыз, булакты macvtap хост түзмөгүнө коюңуз, модел катары virtio калтырыңыз, анан эски NAT интерфейсин өчүрүңүз.

macvtap коногу адатта өз хосттуна жете албайт. Бул бузулуу эмес, күтүлгөн жүрүм-турум, жана ал калтырган жазууңузга кириши керек.

Хосттун LAN-ы гана керек болгон конок үчүн жеткирүүчүнүн кардарында жетишпеген которгуч болушу мүмкүн: Mullvad менен mullvad lan set allow libvirt-ге тийбей эле жергиликтүү жеткиликтүүлүктү калыбына келтирет. Ал эми контейнер туннел аркылуу гана жеткиликтүү болушу керек болсо, жарыяланган портту туннелдин дарегине байлаңыз, -p 10.8.0.5:8080:8080, ар бир дарекке жарыялоонун ордуна.

Тектеш макалалар