Riešil som podobný problém, potreboval som nastaviť port-forwarding na môj VPN server, tak sa trochu rozpíšem. Pre vás diskutujúcich to už asi nie je aktuálne, ale verím, že pre niekoho iného stále áno.
Pokiaľ nemáš pridelenú
verejnú IPv4 adresu na WAN rozhraní toho routera, tak týmto spôsobom DDNS nenastavíš.
Je jedno, či sa to pokúsiš nastaviť v routeri, alebo v NAS, alebo akú DDNS službu na to použiješ.
Ak si vyžiadaš port-forwarding cez PCP a nezadáš externú adresu/port, tak ti CG-NAT skúsi nejakú/ý prideliť a ak uspeje, tak začne blikať na červeno.
Podľa mojich doterajších pozorovaní to funguje tak, že to čo nezadáš manuálne (prázdna externá adresa/port) a teda po pridelení bliká na červeno, tak sa časom/reštartom môže zmeniť.
Ak si všetko zadal ručne (nič prázdne) - tak si nie som celkom istý, no môj skeptický predpoklad je, že by sa to síce nemalo zmeniť pokiaľ je CG-NAT schopný ti také mapovanie poskytnúť, ak ale nie, tak ti asi vyhodí chybu a žiadne mapovanie nezriadi a tvoje NAS sa stane zvonka nedostupné.
V mojom prípade (aby som mal dostupnosť blízku 100%), mám manuálne zadaný iba externý port (nebliká na červeno a je rovnaký ako interný - to sa mu vždy páči a nerobí drahoty) a pridelenie externej adresy nechávam v kompetencii ich servera. Port sa mi doteraz nikdy nezmenil (nech sa stalo čokoľvek - výpadky, reštarty, ...). Externá adresa sa mi občas zmení, čo je očakávané.
Problém je že táto pridelená externá IPv4 adresa od PCP sa nemusí zhodovať s adresou, ktorú ti deteguje whatsmyip.
Ono ti to ukáže zdieľanú IP adresu. Takže to nie je spoľahlivý zdroj informácie akú máš IP (ktorá je určite pre NAS), aby si vedel aktualizovať DDNS.
Ako ju teda zistiť (automatizovane)?Ideálne riešenie by bolo využitie PCP proxy. Router by slúžil iba ako prostredník medzi LAN PCP klientom a PCP serverom. Takže celý proces vyžiadania takéhoto mapovania by bol v kompetencii nejakého LAN klienta a tým pádom by si mal ľahko dostupné všetky informácie o IP adrese/porte od PCP servera. Žiaľ, toto nie je v HG8245W5 implementované.
Možné riešenia s HG8245W5 (bez prechodu späť na verejnú IPv4):1. Krkolomné, ale spoľahlivé:
Skript, ktorý sa volá v pravidelných časových intervaloch na nejakom LAN klientovi (raspberry, NAS, ...), prihlási sa do routera, vyčíta potrebné údaje a aktualizuje DDNS.
Výhoda: Viem vyčítať všetky potrebné údaje (IP, Port, Status, ...) a zariadiť sa podľa toho. Aktualizuje DDNS s danou IP a ak by sa mi predsa len náhodou zmenil vonkajší port, tak mi pošle email na aký port sa to zmenilo.
Nevýhoda: Je to kostrbaté a príliš šité na mieru toho routera a vzhľadom na to, že ten router nemá podporu prihlasovania cez HTTPS, tak menej bezpečné, keďže sa to prihlasuje v pravidelných intervaloch.
2. Elegantnejšie, ale bez možnosti detekcie chyby mapovania (pre mňa nevyhovujúce, ale pre niekoho možno postačujúce):
Predpoklad je, že sa vieš dostať na NAS cez SSH, beží na ňom linux a je tam iptables.
Vezmime do úvahy túto konfiguráciu:
Kód:
External IPv4 Address | External Port | Internal Port | Protocol | Internal IPv4 Address | Allow PCP Port Proposal
178.x.y.32 | 1470 | 80 | TCP | 192.168.100.88 | N
Ak spustíš nasledovný príkaz na hocijakom LAN klientovi (kľudne aj na tom NAS), tak ti vráti spomínanú zdieľanú IPv4 adresu (napr.: 178.x.y.123 - iná ako v PCP, čo sa bežne deje):
Kód:
curl -4 ifconfig.co
Ak by si si to pozrel cez tcpdump alebo vo wireshark-u, tak by bolo vidno, že zdrojový port HTTP GET požiadavky na ifconfig.co bude nejaký náhodný a cieľový bude 80. Nič nečakané, prečo to spomínam?
Čo keby sme urobili nejakú fintu, aby sme donútili router a CG-NAT za ním, aby zdrojová IP adresa takejto požiadavky bola preložená (pre-NAT-ovaná) práve na tú externú adresu od PCP (nech nám ju vráti naspäť) a nie na tú zdieľanú?
Ako? Musíme sa začať
tváriť, že GET požiadavku mu posiela HTTP server NAS-ka z portu 80 (čo sa normálne nikdy nestáva) a nie len nejakého náhodného.
Samozrejme, port 80 je už obsadený HTTP serverom toho NAS-ka, takže ho nemôžeme len tak priamo použiť.
Čo ale môžeme je interne nastaviť preklad nejakého zdrojového portu na port 80 iba pre tieto špecifické požiadavky na ifconfig.co.
Najprv potrebujeme zistiť IPv4 adresu/y domény ifconfig.co
Kód:
nslookup ifconfig.co
Name: ifconfig.co
Address: 104.21.54.91
Name: ifconfig.co
Address: 172.67.168.106
Následne pridáme POSTROUTING pravidlá do NAT tabuľky v iptables na NAS (predpoklad je, že eth0 má IP 192.168.100.88):
Kód:
sudo iptables -t nat -I POSTROUTING -d 104.21.54.91 -o eth0 -p tcp -m tcp --dport 80 --sport 1470 -j MASQUERADE --to-ports 80
sudo iptables -t nat -I POSTROUTING -d 172.67.168.106 -o eth0 -p tcp -m tcp --dport 80 --sport 1470 -j MASQUERADE --to-ports 80
Slovom: Všetky TCP pakety s cieľovou IP adresou 104.21.54.91 alebo 172.67.168.106, cieľovým portom 80 (čiže http) a zdrojovým portom 1470, zmení zdrojový port na 80.
Následne keď na tom NAS-ku (musí mať IP 192.168.100.88) spustíš toto:
Kód:
curl -4 --local-port 1470 http://ifconfig.co
tak ti vráti práve tú externú adresu od PCP (178.x.y.32), ktorú potrebuješ na DDNS. Avšak iba v prípade, že je to PCP mapovanie funkčné v danej chvíli.
V opačnom prípade ti môže vrátiť zdieľanú IP adresu, čiže nemáš 100% istotu, že to je tá správna IP. Preto tento spôsob ja nepoužívam, aj keď sa mi veľmi páči a stojí za zváženie.
Nevýhody:
- PCP mapovanie musí byť pre protokol TCP (kvôli HTTP). Pri UDP by sa táto finta nedala použiť.
- Nemáš 100% garanciu, že ti to vráti tú správnu IP čo chceš.
- Nevieš takto pohodlne zistiť externý port (ak by sa ti zmenil)
Mimochodom, z bezpečnostného hľadiska by som zvážil, či chceš mať z internetu priamy prístup na NAS (obzvlášť cez HTTP). Určite si nastav HTTPS.
Pokiaľ na tom NAS-ku neposkytuješ nejakú službu alebo webovú stránku, tak odporúčam spraviť si vlastnú VPN.