OpenVPN на GCE: додајте alias IP пред да push-увате рути
Push-уваната рута не ја прави VM next hop. Додајте го опсегот alias IP, усогласете го со pool-от на серверот и креирајте повратна рута во VPC пред да ги тестирате клиентите.
Клиент се поврзува на OpenVPN серверот на VM од Compute Engine, статусниот прозорец вели поврзано, а ping до хост во VPC-то сѐ уште не стигнува никаде. Инстинктот е да се додаде уште една push линија, а тоа никогаш не го поправа. Compute Engine одлучува каде одат пакетите врз основа на сопствената табела со рути и на адресите што интерфејсот на VM навистина ги има, па pool на тунел што VM не го поседува е pool во кој никој не доставува.
Следете го пакетот што умира наместо конфигурациската датотека, и деловите што недостасуваат ќе се појават по ред.
Започнете кај пакетот што умира
SYN го напушта клиентот, влегува во тунелот и пристигнува до VM-то како инкапсулиран пакет за одредиште во VPC-то. OpenVPN го декапсулира и се обидува да го пренесе низ eth0, каде fabric-от поставува едно прашање пред сѐ друго: дали оваа инстанца ја поседува одредишната адреса. Pool на тунел исечен од туѓа подмрежа не го поминува тоа прашање, и пакетот се отфрла пред да се провери било која рута или firewall правило.
Значи насоката од клиент кон VPC има два одделни барања, и ниту едно од нив не е push директива. На VM-то му треба alias опсег што го покрива pool-от на тунелот, и токму тоа го прави законски сопственик на тие адреси. На VPC-то му треба рута што го именува VM-то како next hop за секој заштитен префикс. Ако недостасува едно, пакетот умира на друго место, додека клиентот ја гледа истата тишина.
Читајте го дефектот по тој ред, бидејќи од страната на клиентот двата услова изгледаат идентично. Тунел што пријавува поврзано додека ништо не одговара е потпис на проблем со топологијата, а не на лоша шифра.
Дали инстанцата го поседува pool-от на тунелот
Дајте му на VM-то секундарен опсег во неговата сопствена подмрежа, потоа нека OpenVPN доделува адреси точно од тој опсег. На инстанца чија примарна адреса е 10.156.0.10/20, alias /28 го држи pool-от одделен од адресите што другите инстанци веќе ги имаат:
gcloud compute instances network-interfaces update openvpn-vm \
--zone=europe-west1-b \
--aliases=eth0:10.156.1.0/28Потоа server директивата мора да го опише истиот блок. Нејзината прва адреса станува gateway на тунелот, а останатите адреси се доделуваат на клиентите. Овде два броја опишуваат еден блок, мрежа и мрежна маска, и тоа е синтаксата на pool-от што OpenVPN сѐ уште ја очекува.
server 10.156.1.0 255.255.255.240Потврдете дека адресата навистина стигнала на интерфејсот, а не само во конфигурацијата на OpenVPN. Fabric-от пренесува според тоа што го пријавува NIC-от, а не според тоа што го верува демонот. Една команда го решава тоа:
ip -4 addr show dev eth0Секундарна адреса што никогаш не стигнува до eth0, или pool што се преклопува со друга подмрежа, подоцна се појавува како повремен губиток на пакети, а не како грешка при стартување. Демонот стартува, клиентите се поврзуваат, и само некои одредишта се однесуваат погрешно. Држете го alias опсегот мал за pool-от лесно да се препознае во табела со рути. Никогаш не го режете од подмрежа што друга инстанца веќе ја користи.
Дајте им next hop на повратните пакети
Одговорот од хост во VPC-то е адресиран на клиентска адреса во pool-от на тунелот, која не припаѓа на ниту една подмрежа што VPC-то ја знае. Без рута за тој pool, одговорот застанува на првиот hop без совпаѓање, а барањето сосема можно е да успеало на другиот крај.
gcloud compute routes create openvpn-return \
--network=prod-vpc \
--destination-range=192.168.127.0/24 \
--next-hop-instance=openvpn-vm \
--next-hop-instance-zone=europe-west1-b \
--priority=800Истата рута е потребна за секој префикс што лежи зад клиент, а не внатре во VPC-то. Тие префикси бараат и iroute запис во ccd датотеката на тој клиент. Тој запис е книговодство на страната на серверот: му кажува на серверот кој клиент го поседува префиксот, и не инсталира ништо на самиот клиент.
Задржете ја push листата за клиентската страна од разговорот, бидејќи таа само додава рути на машината што се поврзува. Push линија за подмрежа во VPC-то и VPC рута назад кон pool-от се две половини од истиот пат, и секоја половина сама по себе создава тунел што носи барања, но не и одговори.
Firewall-и, препраќање и hop-овите меѓу нив
VPC firewall-от го оценува декапсулираниот пакет, па ingress правилото мора да го пушти pool-от на тунелот и секој префикс на локација што стигнува до VM-то на тој начин. Позицијата default-deny овде тивко пропаѓа: пакетот се отфрла по декапсулацијата, а OpenVPN логот покажува здрава сесија.
На секој Linux хост што препраќа наместо да завршува, проверете дали net.ipv4.ip_forward е вклучен. Правилото за сопственост важи и таму: машина што препраќа за подмрежа што не ја поседува го отфрла пакетот исто како VM-то. Прочитајте ја вредноста пред да го обвините тунелот.
Кога точно еден префикс не успева
Делумниот дефект е најлесниот случај за читање, бидејќи сѐ друго на патот веќе е докажано. Започнете со списокот со рути и прочитајте го опсегот на одредиштето и next hop-от на записот што треба да го покрие префиксот, потоа прочитајте го описот на инстанцата и споредете го нејзиниот alias опсег со pool-от што серверот го доделува.
gcloud compute routes list --filter=destination-range~10.164.0.0
gcloud compute instances describe openvpn-vm --format=get(networkInterfaces[0].aliasIpRanges)Рута што недостасува се покажува како никаков next hop за префиксот, додека alias што недостасува се покажува како пакет отфрлен на интерфејсот; од клиентот двете изгледаат слично, а во тие два излеза се сосема различни. Ако се присутни и двете, преостанатиот сомнителен е ccd iroute на клиентот што го бара префиксот.
Запишете ги четирите вредности покрај тунелот: alias опсег, server pool, push-увани префикси, VPC рути. Застарен alias го крши секој pool адрес, застарена рута крши една насока, push што недостасува го крие префиксот од клиентот, а погрешен iroute го праќа префиксот до погрешен peer. Следниот човек што додава подмрежа ги треба сите четири на едно место, а белешката е поевтина од вечерта.