Kuchapisha seva ya nyumbani kupitia VPS wakati CGNAT inazuia bandari
Njia kutoka kivinjari hadi mashine ya nyumbani: thibitisha kuwa laini iko nyuma ya CGNAT, elekeza DNS kwa VPS, fanya DNAT kwenye bandari moja, rekebisha njia ya kurudi na uthibitishie kutoka nje.
Nilianza kutoka nje, kama mtumiaji angefanya: nikaandika jina kwenye kivinjari cha simu kwa data ya rununu na nikaangalia muunganisho ukining'inia hadi muda ukaisha. Jina lilijulikana, kwa hiyo DNS ilikuwa sawa. Ukurasa wa uelekezaji wa bandari wa ruta ya nyumbani pia ulikuwa njia iliyofungwa, kwa sababu anwani yake ya WAN ilionyesha 100.64.31.42, na hiyo si anwani ambayo mtoa huduma atanielekeza kutoka mtandao. Namba hiyo inaeleza hitilafu yote: laini iko nyuma ya carrier-grade NAT, kwa hiyo anwani ya umma upande wangu wa handaki ni ya mtoa huduma. Kinachofuata ni njia niliyopita kutoka kile kichupo kilichoning'inia hadi huduma inayojibu.
Anza kwa mteja na uende ndani
Kabla ya kubadilisha kanuni yoyote, thibitisha mnyororo unaishia wapi. Kwenye kompyuta mpakato niliendesha dig +short files.example.net na nikapata anwani ya VPS tena, jambo lililoondoa DNS ya zamani kwenye mashine yangu. Kisha curl -v --connect-timeout 5 files.example.net:5022 ilimaliza muda badala ya kukataliwa. Tofauti hii ni muhimu: kuisha muda kwa kawaida humaanisha pakiti zinatupwa njiani, ilhali kukataliwa humaanisha kitu kimejibu na kusema hapana.
Hatua iliyofuata ndani ilikuwa VPS yenyewe. ss -ltnp haikuonyesha kitu kinachosikiliza kwenye 5022, kama ilivyotarajiwa kabla kanuni ya DNAT haijawa. Kwenye mashine hiyo hiyo wg show (au ip -br a show tun0 kwa OpenVPN) ilithibitisha kuwa peer ya nyumbani iko hai na ina handshake mpya. Peer ikiwa imezimwa, hakuna kanuni yoyote ya NAT itakayosaidia, na taa ya kijani kwenye ukurasa wa VPN wa ruta ya nyumbani haimaanishi kitu.
Thibitisha kuwa laini ya nyumbani kweli iko nyuma ya CGNAT
Linganisha anwani ambayo ruta inaripoti kwenye kiolesura chake cha WAN na kile huduma ya nje inakiona. Kitu chochote kilicho ndani ya 100.64.0.0/10, yaani 100.64.x.x hadi 100.127.x.x, ni kundi la anwani zinazoshirikiwa kutoka RFC 6598 na hakiwezi kufikiwa kutoka mtandao. Unafikia hitimisho lile lile ruta inapodai ina anwani ya kawaida ya kibinafsi ilhali utafutaji wa umma unarudisha kitu kisichohusiana. Laini ya CGNAT inaweza pia kuwa na anwani ya umma inayodumu tu hadi lease inayofuata, kwa hiyo uelekezaji wa bandari huonekana kufanya kazi kwa saa moja kisha kufa kimya.
Baadhi ya watoa huduma hutoa anwani ya umma ya kweli lakini huzuia bandari zinazoingia 80 na 443 kwenye akaunti za makazi. Ikiwa huduma yako ni wavuti tu na anwani ya WAN ni ya umma kweli, uliza msaada kabla ya kujenga relay. Ikiwa sivyo, muundo ulio chini unatumika kwa usawa kwa kila bandari, na inafaa kusimamisha jaribio upande wa ruta: mtafsiri katika mtandao wa mtoa huduma hukomesha muunganisho kabla haujafika kwenye kiolesura chako cha WAN.
Elekeza jina kwenye anwani ya VPS
DNS haipitishi trafiki, kwa hiyo rekodi ya A ya huduma lazima iwe na anwani ya umma ya VPS. Rekodi ya A kuelekea 192.168.1.20 hutatuliwa kwa manufaa tu kwa wateja walio ndani ya VPN tayari; kutoka mtandao hutatuliwa kwa anwani ambayo hakuna anayeweza kuielekeza. Kwa ufikiaji wa kiutawala wa VPS yenyewe ninahifadhi jina tofauti, ili nisichanganye kamwe ni mwenyeji gani rekodi inarejelea.
Ikiwa VPS na mashine ya nyumbani zote zinahudumia HTTP, ipe kila moja jina lake mwenyewe na uache VPS iamue nani anajibu. Kuzikunja kuwa jina moja na kutumaini proksi itachagua backend sahihi ndiyo hasa njia ya kutumia mchana mzima ukitatua hitilafu kwenye mwenyeji asiye sahihi.
Bandari moja kwa DNAT, acha SSH kwenye 22
Chaguo la moja kwa moja ni NAT ya lengo kwenye VPS. Washa forwarding kwa kerneli inayoendesha na uweke anwani ya handaki ya seva ya nyumbani katika kanuni, si anwani yake ya LAN:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d 198.51.100.10 --dport 5022 -j DNAT --to-destination 10.8.0.2
Acha SSH kuelekea VPS yenyewe kwenye 22 na uelekeze bandari nyingine, kwa mfano 5022, kwenye mashine ya nyumbani. Ukielekeza 22 kwenye mashine iliyozimwa utapoteza njia pekee ambayo ingeweza kuirekebisha. Mantiki hiyo hiyo inatumika kwa proksi: weka bandari ya usimamizi ya VPS nje ya kanuni za relay.
Fanya kanuni ziwe za kudumu mara zinapofanya kazi. Kwenye Debian au Ubuntu, apt install iptables-persistent na kisha netfilter-persistent save huziandika kwenye /etc/iptables/rules.v4. Kwenye mwenyeji wa firewalld kifani ni uelekezaji wa bandari wa kudumu kwenye eneo, ambao unahitaji firewall-cmd --reload kabla ya kutumika. Kanuni zinazoishi kwenye kumbukumbu tu hupotea kwenye uanzishaji upya wa kwanza wa matengenezo wa mtoa huduma, kwa kawaida saa mbaya.
Rekebisha njia ya kurudi, au epuka uhitaji wake
DNAT huandika upya lengo tu. Seva ya nyumbani huona muunganisho kutoka anwani ya mteja wa awali, na ikiwa njia yake ya kawaida inaelekea kwenye ruta ya nyumbani, jibu hutoka kupitia WAN ya nyumbani ambako mtafsiri wa mtoa huduma hulitupa. Upendeleo huo usio sawa ulikuwa hitilafu ya pili niliyokutana nayo, baada ya kanuni ya DNAT kuonekana kuwa sahihi kabisa.
Marekebisho mawili hufanya kazi. Ipe mashine ya nyumbani njia ya sera ili trafiki kutoka handaki irudi kupitia handaki:
ip rule add from 10.8.0.2 table 100
ip route add default dev wg0 table 100
Au acha VPS iandike upya chanzo ili jibu liwe na anwani inayoweza kuifikia, na acha conntrack iigeuze wakati wa kutoka:
iptables -t nat -A POSTROUTING -d 10.8.0.2 -p tcp --dport 5022 -j SNAT --to-source 10.8.0.1
Toleo la SNAT huficha anwani halisi ya mteja kutoka kwa seva ya nyumbani, kwa hiyo kumbukumbu za programu zinaonyesha 10.8.0.1 kama peer. Pitisha anwani ya awali kwenye tabaka la programu, au kubali upotevu wa ukaguzi kwa kila mteja, lakini amua kwa makusudi badala ya kuugundua wakati wa tukio.
Kagua njia yote kutoka nje
Thibitisha kutoka mtandao ambao si VPS na si nyumbani: simu kwenye data ya rununu, au shell ya bei nafuu mahali pengine. nc -vz files.example.net 5022 inapaswa kuripoti muunganisho uliofanikiwa, na openssl s_client -connect files.example.net:443 -servername files.example.net inapaswa kuonyesha cheti cha jina la umma. Kisha kagua kikundi cha usalama au firewall ya wingu ya mtoa huduma. Kanuni ya DNAT ambayo huwa haioni pakiti kwa kawaida huzuiwa tabaka moja juu ya mwenyeji.
Hatima, amua kinachotokea handaki inapoanguka. Kanuni ya DNAT inaendelea kupokea miunganisho na kuiingiza kimya kwenye handaki iliyokufa, jambo linaloonekana kama huduma iliyovunjika. Ukaguzi wa afya kwenye VPS unaokataa bandari wakati peer haifanyi kazi hugharimu mistari michache na huokoa saa moja ya kubahatisha. Baada ya hapo acha kuhariri kanuni na uitazame kwa siku moja kabla ya kuiamini.