Prieš keletą dienų prireikė atidaryti keletą TCP prievadų ir nukreipti juos į serverį, esantį vidiniame tinkle. Iš pirmo žvilgsnio, užduotis labai aiški, tiesiog atidarom reikiamą prievadą ir nukreipiam jį į atitinkamą lokalaus įrenginio prievadą.

RouterOS tai atrodo taip:

/ip firewall nat
add chain=dstnat protocol=tcp dst-port=8000 action=dst-nat to-address=192.168.88.30 to-port=80

Išsaugojau pakeitimus ir pabandžiau pasiekti savo išorinį IP su prievadu 8000, tačiau gavau „Connection timeout“ klaidą.
Dar kartą peržiūrėjau pakeitimus, patikrinau nustatymus prisijungęs prie routerio web konfigūracijos ir pabandžiau dar kartą, tačiau vis vien, bandydamas pasiekti savo išorinį IP, gavau tą pačią klaidą.
Pradėjau keisti nustatymus, bet klaida vis kartojosi. Ir tuomet, tiesiog dėl bandymų, pabandžiau pasiekti tą patį IP ne iš lokalaus tinklo, o prisijungęs per WiFi hotspot’ą, mano nustebimui, viskas veikė kuo puikiausiai – vidinis įrenginys buvo pasiekiamas iš išorės, tad pradėjau domėtis, kodėl tai neveikia, jungiantis iš vidinio tinklo.

Hairpinning

Kadangi nesu tinklo ekspertas, apie šį terminą iki šiol nežinojau.
Lengviausia tai paaiškinti yra pavyzdžiu: sakykim mano išorinis IP adresas yra 1.1.1.1, o vidinis įrenginio IP yra 192.168.88.30, taigi, kai klientas su IP, sakykim, 2.2.2.2 inicijuoja susijungimą, routeris atlieka tokią adresaciją:

2.2.2.2 → 1.1.1.1
2.2.2.2 → 192.168.88.30
ir siunčia atsakymą:
192.168.88.30 → 2.2.2.2
1.1.1.1 → 2.2.2.2

tačiau kreipiantis iš vidinio tinklo randamas trumpesnis kelias ir klientas gauna atsakymą ne iš IP kuriam siuntė užklausą, bet iš vidinio IP, todėl atsakymas tiesiog ignoruojamas, adresacija atrodo taip:

192.168.88.11 → 1.1.1.1
192.168.88.11 → 192.168.88.30
ir siunčia atsakymą:
192.168.88.30 → 192.168.88.11

O tai išspręsti nėra sudėtinga, tiesiog reikia pridėti dar vieną taisyklę, kuri nukreips srautą per routerį, net jeigu abu įrenginiai yra tame pačiame potinklyje:

/ip firewall nat
add chain=srcnat src-address=192.168.88.0/24 dst-address=192.168.88.30 protocol=tcp dst-port=8000 out-interface=LAN action=masquerade

Po šios taisyklės pridėjimo adresaciją atrodys taip:

192.168.88.11 → 1.1.1.1
192.168.88.11 → 192.168.88.30
ir siunčia atsakymą:
192.168.88.30 → 192.168.88.11
1.1.1.1 → 192.168.88.11

MikroTik turi Wiki puslapį, kur visa tai paaiškinta detaliau: https://wiki.mikrotik.com/wiki/Hairpin_NAT