Прослеђивање порта ка WireGuard peer-у иза NAT-а: DNAT и SNAT
DNAT доставља захтев, али одговор излази са погрешне адресе. Додајте одговарајуће SNAT правило и поставите оба након конфигурације тунела.
Прегледач тражи https://203.0.113.10:8443, прокси прихвата везу, а сервис на WireGuard peer-у никада не одговара. DNAT правило ради свој посао; део који не успева је одговор. Пратите пакет кроз оба превођења и правило које недостаје постаје очигледно. Исправка је још једна NAT наредба у правом hook-у, а не нови тунел.
Пратите један захтев од почетка до краја
Захтев долази на јавни интерфејс проксија, са јавном адресом клијента као извором и адресом проксија као одредиштем. У nat PREROUTING DNAT правило преписује одредиште на адресу тунела peera, 10.90.0.2. Затим рутирање шаље пакет напоље кроз wg0 и пут прослеђивања је завршен.
На peer-у пакет сада носи изворну јавну адресу извора, јер га ништа није преписало. Сервис прихвата везу и шаље одговор на свој подразумевани gateway, а то је кућни рутер испред peera. Тај рутер нема стање за ток који никада није видео па или одбацује пакет или га преводи на своју јавну адресу, што клијент неће прихватити.
Асиметрија је цео проблем: захтев пролази кроз прокси, а одговор покушава да иде директно. Праћење веза на проксију помаже само ако се одговор враћа кроз прокси, а тамо се не може вратити док адреса извора још показује на изворног клијента.
Додајте повратно превођење
Препишите извор прослеђеног тока на адресу тунела проксија пре него што крене ка peer-у. Сервис затим одговара на 10.90.0.1, прокси то прима, а праћење веза преокреће оба превођења пре него што се пакет врати клијенту.
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1POSTROUTING правило је намерно уско: поклапа се са преведеним одредиштем и интерфејсом тунела, па не преписује неповезани саобраћај који случајно излази кроз wg0. Широко masquerade правило такође би сакрило адресу клијента, али би то учинило за сваки ток и отежало ревизију NAT табеле.
Поставите правила тамо где тунел постоји
Правила која референцирају адресу или интерфејс тунела морају се извршавати након што их wg-quick конфигурише. Интерфејс се ствара пре PreUp, али адресе, MTU, DNS и руте се примењују после, а PostUp се покреће кад је све то на месту. Додавања ставите у PostUp, а брисања у PreDown.
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PreDown = iptables -t nat -D POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1Брисања морају одговарати додавањима токен по токен, укључујући подударања multiport и интерфејса. Брисање које се разликује у једном подударању не уклања ништа, а следеће поновно повезивање додаје другу копију правила. Након неколико поновних повезивања табела садржи дупликате које је тешко приписати линији конфигурације.
Проверите резултат помоћу iptables -t nat -S након поновног повезивања. Ако се исто правило појави два пута, линија PreDown се не поклапа и чишћење тихо не успева.
Прослеђивање, филтрирање и други NAT
Укључите IPv4 прослеђивање трајно, затим дозволите прослеђени ток у табели филтера. DNAT се дешава пре FORWARD ланца, па се правило филтера поклапа са преведеним одредиштем, а не са јавном адресом. Ако UFW управља firewall-ом, изразите дозволу као рутно правило; обично host правило не покрива прослеђени саобраћај.
Два друга NAT слоја и даље могу сломити пут чак и кад су правила проксија исправна. На кућној вези јавна адреса припада рутеру, а отварање порта у његовом firewall-у није исто као стварање уноса за прослеђивање порта који тај порт шаље на прокси. Порт који изгледа отворен споља док ништа не одговара често нема управо то мапирање.
На NAT VPS-у провајдер мапира јавни порт на приватну адресу. Мапирање мора да се слаже са портом који оглашавате, а несклад изгледа идентично као покварен тунел. Потврдите провајдерово мапирање пре него што промените WireGuard конфигурацију.
Проверите повратни пут и прихватите цену
Повежите се са мреже која није LAN проксија, затим прегледајте пар превођења док је веза отворена:
conntrack -L -p tcp --dport 8080
tcpdump -ni any tcp port 8080conntrack унос би требало да покаже оригинални tuple, преведени tuple и смер одговора. Ако одговор недостаје, peer не шаље кроз тунел, што обично значи да SNAT правило није примењено или је peer-ов сопствени firewall одбацио ток.
Поново покрените систем једном да докажете да PostUp поново примењује правила, затим зауставите тунел и потврдите да их је PreDown уклонио. Мртва правила која преживе прекид везе разлог су зашто се каснија промена понаша непредвидиво.
На крају, прихватите шта SNAT кошта. Сервис види сваки захтев као да долази са проксија, па приступни логови, ограничења брзине по клијенту и листе дозвољених адреса више не разликују кориснике. Случај hairpin захтева сопствено превођење извора за клијенте на LAN-у проксија. Ако peer-у требају стварне адресе клијената, алтернатива је повратна рута до клијентске мреже, што је више посла али чува информацију.