WireGuard PersistentKeepalive: захоўвайце адлюстраванне NAT жывым
Калі зваротнае злучэнне працуе толькі адразу пасля таго, як апанент адправіць трафік, адлюстраванне сканчаецца. Усталюйце keepalive за маршрутызатарам і прачытайце сапраўдны тайм-аўт.
Хатні камп'ютар адкрывае тунель і дасягае хмарнага сервера без праблем. Хмарны сервер можа дасягнуць хатняй праграмы на працягу хвіліны-двух пасля таго, як хатні камп'ютар апошні раз нешта адправіў, а затым спыняецца. У журнале WireGuard нічога не з'яўляецца, памылка рукапаціскання не паведамляецца, і перазапуск тунеля ненадоўга выпраўляе гэта. Гэты ўзор — гэта адлюстраванне, якое сканчаецца, а не зламаны тунель, і інструкцыя ніжэй пацвярджае гэта перад любымі зменамі.
Пацвердзіце, што ўзор — гэта заканчэнне адлюстравання пры прастоі
Адрозная дэталь — гэта час. Калі зваротнае злучэнне працуе адразу пасля таго, як хатні апанент адпраўляе трафік, і ламаецца пасля ціхага інтэрвалу, шлях у парадку, а стан пасярэдзіне — не. Калі яно ніколі не працавала, нават адразу пасля трафіку, гэта няправільны дыягназ.
sudo wg show wg0 latest-handshakes
sudo wg show wg0 endpoints
sudo wg show wg0 transfer
Выканайце першыя дзве каманды адразу пасля таго, як хатні апанент нешта адправіць, пачакайце пяць хвілін і выканайце іх зноў. Адзнака часу рукапаціскання, якая абнаўляецца па раскладзе без новай канчатковай кропкі, кажа, што тунель жывы. Змянілася здольнасць незапатрабаваных пакетаў прыходзіць звонку, а гэта ўласцівасць шляху, а не тунеля.
Затым зрабіце зваротную спробу і паглядзіце на лічыльнікі перадачы. Калі хмарны бок адпраўляе байты, а хатні бок не атрымлівае нічога, пакет пакінуў хмару і загінуў у прыладзе, якая захоўвае стан, па дарозе. Гэта подпіс, які вы шукаеце. Калі абодва лічыльнікі рухаюцца, тунель даставіў пакет, і падазраваны — праграма.
Размясціце keepalive на апаненце за маршрутызатарам
Пастаянныя keepalive захоўваюць адлюстраванне NAT і любы стан міжсеткавага экрана жывымі, адпраўляючы невялікі аўтэнтыфікаваны пакет па раскладзе. Налада належыць машыне за маршрутызатарам, у яе запісе для аддаленага апанента, бо менавіта гэты бок сваім выходным пакетам стварае стан.
[Peer]
PublicKey = <cloud peer public key>
AllowedIPs = 10.71.0.1/32
PersistentKeepalive = 25
Аб'яднайце яго з існуючым раздзелам апанента. Даданне другога блока з тым жа публічным ключом не з'яўляецца правільным спосабам дадання опцый, і wg-quick не аб'яднае іх за вас. Задакументаваныя 25 секунд — гэта прыклад, абраны каб быць ніжэй за звычайныя тайм-аўты UDP, а не значэнне з асаблівым сэнсам.
Размяшчэнне той жа дырэктывы на хмарным баку не дапамагае гэтай праблеме. Пакеты гэтага апанента ўжо прыходзяць з публічнага адраса, таму няма адлюстравання, якое трэба захоўваць у важным кірунку. Гэта дадае трафік і нічога не змяняе.
Чытайце таймеры замест здагадак пра інтэрвал
Keepalive працуюць, бо прыходзяць часцей, чым сканчаецца стан. Гэта робіць тайм-аўт лікам, які вам сапраўды патрэбны, і ў Linux ён чытаецца на прыладзе, якая робіць ператварэнне:
sysctl net.netfilter.nf_conntrack_udp_timeout
sysctl net.netfilter.nf_conntrack_udp_timeout_stream
sudo conntrack -L -p udp --dport 51820
Першае значэнне — гэта тайм-аўт для UDP-плыні, якую бачылі толькі ў адным кірунку, а другое дзейнічае, калі адказы ўжо назіраліся. Абодва звычайна кароткія, і адлюстраванне, якое змаўкае, будзе ісці за тым, што датычыцца вашай плыні.
Параўнайце гэты лік з вашым інтэрвалам. Keepalive у 25 секунд пры тайм-аўце 30 секунд працуе; той жа keepalive пры тайм-аўце 15 секунд — не. Ніякая колькасць паўтораў не зменіць гэтую арыфметыку. Некаторыя спажывецкія маршрутызатары і мабільныя аператары выкарыстоўваюць значна карацейшыя значэнні, чым прадвызначэнне Linux, таму канфігурацыя, якая працуе ў адной сетцы, не працуе ў іншай.
| Observation | What it means | Reasonable response |
|---|---|---|
| Works after traffic, dies when idle | Mapping or firewall state expiring | Lower the keepalive interval |
| Never works, even immediately | No return route, listener or firewall | Stop tuning keepalive |
| Works for hours, then dies once | Carrier-side translation or address change | Check the endpoint and logs together |
Праверце слухача і міжсеткавы экран асобна
Жывое адлюстраванне неабходнае і недастатковае. Праграма на хатнім камп'ютары павінна слухаць правільны адрас, а міжсеткавы экран хоста павінен дазволіць пакет пасля расшыфроўкі.
sudo ss -lntup | grep 8080
sudo wg show wg0 allowed-ips
curl -sS -m 5 http://10.71.0.2:8080/health
Калі сокет прывязаны толькі да адраса фізічнага інтэрфейса, а не да адраса тунеля, пакеты, што прыходзяць у тунель, адкідаюцца да звароту да міжсеткавага экрана. Гэтая адмова выглядае з хмарнага боку гэтак жа, як праблема адлюстравання, і перажывае кожную наладку keepalive.
Праверка спісу дазволеных не менш важная ў іншым кірунку. Хмарны апанент павінен дазволіць хатні адрас тунеля як крыніцу, калі збіраецца адказваць, а хатні апанент павінен дазволіць хмарны адрас як прызначэнне. Пакеты keepalive — гэта аўтэнтыфікаваны трафік, і яны выконваюць тыя ж правілы, таму keepalive, які выглядае працоўным, можа суіснаваць з праграмай, якая не працуе.
Разгортвайце змену і ведайце яе межы
Ужыцёўце наладу, перазапусціце інтэрфейс, калі гэта ваш спосаб абнаўлення, а затым паўтарыце тэст прастою, а не неадкладны тэст. Пачакайце даўжэй за тайм-аўт, які вы прачыталі раней, зрабіце зваротны запыт і пацвердзіце, што лічыльнікі рухаліся з абодвух бакоў.
Запішыце інтэрвал і вымераны тайм-аўт побач з ім. Будучая змена прашыўкі маршрутызатара або пераход на мабільнае злучэнне можа змяніць тайм-аўт. Нататка дазваляе камусьці вывесці значэнне зноў, а не скапіяваць яго. Два лікі ў адным радку зберагаюць цэлае расследаванне пазней.
Пастаянныя keepalive абараняюць стан. Яны не адкрываюць порт, не дадаюць запіс у спіс дазволеных і не прымушаюць слухача з'явіцца. Калі зваротнае злучэнне не працуе зусім, вінаватая адна з гэтых трох рэчаў, і хуткі старт WireGuard апісвае наладу keepalive ў такіх жа вузкіх умовах.