Сервер се преселио на нову адресу, клијенти се још повезују, и ништа од онога што пошаљу не стиже до интернета. Та подела је траг: сокет који слуша и прослеђивање порта преживели су пресељење, па се тунел подиже, док превођење извора примењено на прослеђене пакете још наводи адресу коју хост више не поседује. Одговори на те препи­сане пакете иду ка машини које више нема.

Повезивање и прослеђивање падају на различитим местима

Успостављање зависи од одредишта које клијенти већ знају: јавне адресе, прослеђивања порта испред ње и слушаоца унутра. Прослеђени саобраћај зависи од друге одлуке донете након што пакет уђе у тунел, када хост препише свој извор како би одговори могли да нађу пут назад.

Промена адресе квари само другу одлуку, и зато се симптом чита као "повезано али без интернета". То објашњава и зашто уобичајене провере на страни клијента изгледају здраво: руковање се заврши, клијент добије адресу, а пинг на тунелску адресу сервера може чак и да одговори. Сати се троше на клијенту због квара који живи на другој страни, зато је табела правила прво место за поглед.

Прочитајте правило и његове бројаче пре измене

Излистајте правила превођења с бројачима и упоредите конфигурисани извор са адресама које хост заиста држи. Правило препи­сано на мртву адресу обично показује саобраћај на улазном путу, јер пакети до њега стижу и преводе се, а на повратном путу ништа.

sudo iptables -t nat -L POSTROUTING -n -v --line-numbers
ip -4 addr show

Проверите три поља док сте тамо: скуп у подударању извора, излазни интерфејс ако га правило наводи, и изузетак који чува саобраћај између тунела од преписивања. Тај изузетак је лако изгубити током измене, а његов губитак чини да саобраћај између партнера изгледа исправно док његови одговори иду чудним путем.

Ако бројачи стоје на нули, пакети никада не стижу до овог правила и адреса није тренутни проблем. Потражите конкурентно правило раније у ланцу, што се дешава када неко дода замену уместо да уреди оригинал. Упоредите бројеве правила с излазом који сте записали пре минута. Редослед је део конфигурације, а не козметички детаљ.

Замените извор или престаните да га наводите

Када хост има стабилну адресу, замените правило на месту уместо да додајете још једно. Замена по броју правила чува редослед од којег зависи остатак ланца.

sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 10.151.0.40

Када се адреса додељује динамички, не наводите никакав извор и пустите језгро да изабере тренутни с излазног интерфејса. Та варијанта преживи следеће пресељење без измене, по цену скривања која је адреса коришћена.

sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o eth0 -j MASQUERADE

Потврдите да је прослеђивање IPv4 још омогућено кроз управљану конфигурацију, па учините правило трајним механизмом саме дистрибуције. Измена направљена само у језгру које ради враћа се са следећим рестартовањем, обично током прозора одржавања који нико не повезује с променом.

Два начина да замену урадите погрешно

Превођење скупа на тунелску адресу сервера уместо на његову LAN адресу шаље одговоре право назад у тунел, где се усмеравају ка клијенту који их никада није тражио. Веза стане на начин који изгледа као петља усмеравања, јер то и јесте.

Нагомилавање другог превођења изнад старог је друга грешка. Прво правило које се подудари побеђује, па застарели унос наставља да обрађује пакете док се не избрише, а бројачи новог правила остају на нули док сви криве замену. Избришите дупликат пре него што додате било шта ново. Затим прочитајте листу још једном и потврдите да се са скупом подудара тачно једно превођење.

Ако тунел носи и IPv6, поновите цео преглед на другом стек­у. Подразумевана рута IPv6 без превођења и без рутираног префикса пада једнако тихо, а то је лако заборавити јер све изнад изгледа идентично.

Долазне услуге траже супротно превођење

Услуга на VPN клијенту која мора бити доступна споља тражи превођење одредишта, а не извора: јавни порт се преписује на тунелску адресу клијента пре него што уђе. Пут прослеђивања затим тражи изричито правило које дозвољава тај саобраћај.

sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.9.8.2:8080

Никада не преводите порт који носи сам тунел, јер то преписивање прекида везу која држи услугу доступном. Држите тунелски порт потпуно изван правила одредишта. На крају проверите с оба краја: бројачи на новом правилу, кратак снимак на тунелском уређају и један захтев на адресу унутар тунела пре него што пробате јавну.

Повезани чланци