Ak sa nachádzam mimo môj Home Lab, tak väčšinou pracujem vzdialene (remote). Na spojenie používam VPN (buď WireGuard, alebo OpenVPN). Nedávno som vzdialene pracoval na servery a z nejakého nezisteného dôvodu sa VPN spojenie rozpadlo a viac som sa na server nevedel pripojiť. Až po nejakých dvoch hodinách sa spojenie obnovilo. Neskôr som z logov routera zistil, že linka jednoducho spadla a po dvoch sekundách sa spojenie obnovilo, ale namiesto verejnej IPv4 adresy mi ISP pridelil neverejnú IPv4 v rozsahu CGN 100.64.0.0/10. To znamená, že vzdialene som ďalej nemohol pracovať.
Našťastie sa táto udalosť odohrávala neskoro večer a logy som prehliadal až ráno. V logoch som videl len to ako sa spojenie v priebehu dvoch hodím 2x rozpadlo a po niekoľkých sekundách znova obnovilo (Bohužiaľ v rozsahu CGN). Aj keď nie som majiteľom statickej verejnej IPv4, ale ISP by mal prideľovať zákazníkom verejnú dynamickú IPv4.
Na druhý deň som kontaktoval ISP a chcel som vedieť čo sa stalo. Odpoveď bola len strohá, že vidia tam 2 výpadky, ale to je všetko, čo mi k tomu vedia povedať. Podľa informácii čo mám, tak ISP prideľuje koncovým zákazníkom, jednu z týchto IP adries
- Verejnú dynamickú IPv4
- Verejnú statickú IPv4 (za polatok)
- Neverejnú dynamickú IPv4 (CGN)
IP adresy sú prideľované z poolu, ktorý je nakonfigurovaný na BRAS. ISP ma niekoľko BRAS a ak nie je dostupná verejná IPv4, tak začne prideľovať zákazníkom IP z CGN. Môj ISP je veľký ISP a určite ma viac ako 1000 000 zákazníkov. Z toho vyplýva, že ak na BRAS nie je voľná verejná IPv4 adresa teraz, tak o 5 sekúnd to už nemusí platiť. Doposiaľ som žil v tom, že ISP mi bude vždy na WAN rozhranie prideľovať verejnú dynamickú IPv4 adresu.
Preto som sa rozhodol, že použijem skript, ktorý bude sledovať aká IP adresa je na WAN rozhraní. Čiže v mojom prípade môžem od ISP dostať len verejnú dynamickú IPv4, alebo IPv4 v rozsahu CGN 100.64.0.0/10. Skript je nastavený tak, že overuje či je na WAN rozhraní IPv4 v rozsahu CGN 100.64.0.0/10. Ak je, tak sa na 5 sekúnd zhodí interface. V crone je nastavené aby sa skript spúšťal každých 10 minút.
Poďme si teda skript vyrobiť aby sme ho mohli začať používať. Pracovať môžeme priamo cez terminál pfsense, alebo môžeme použiť tiež webové rozhranie. Ak chceme pracovať cez SSH, musíme to mať povolené. Podľa mňa je jednoduchšie použiť SSH ako webové rozhranie. PfSense je OS založený na FreeBSD, avšak príkazy sú veľmi podobné Linuxu. Prihlásime sa cez terminál do systému
ssh root@192.168.1.1
Po prihlásení by sme mohli vidieť niečo také (WAN IP adresa je vymyslená). Tu vidíme, že náš WAN interface je v systéme označený ako pppoe0. Prepneme sa do Shellu pomocou čísla 8.
QEMU Guest - Netgate Device ID: e0840568216838a38ec0
*** Welcome to pfSense 2.7.2-RELEASE (amd64) on pfsense ***
WAN (wan) -> pppoe0 -> v4/PPPoE: 87.65.43.21/32
LAN (lan) -> vtnet1 -> v4: 192.168.1.1/24
DMZ2 (opt1) -> vtnet2 -> v4: 192.168.20.1/24
DMZ3 (opt2) -> vtnet3 -> v4: 192.168.30.1/24
0) Logout (SSH only) 9) pfTop
1) Assign Interfaces 10) Filter Logs
2) Set interface(s) IP address 11) Restart webConfigurator
3) Reset webConfigurator password 12) PHP shell + pfSense tools
4) Reset to factory defaults 13) Update from console
5) Reboot system 14) Disable Secure Shell (sshd)
6) Halt system 15) Restore recent configuration
7) Ping host 16) Restart PHP-FPM
8) Shell
Skript môžeme uložiť do /root. To znamená, že vytvoríme skript pod názvom check_wan_ip.sh
vi /root/check_wan_ip.sh
Skript je jednoduchý. Netuším aký rozsah pre CGN používa môj ISP, tak v konštante použijem celý rozsah CGN (čo predstavuje 100.64.0.0-100.127.255.255). Pomocou príkazu ifconfig (grep a awk) uložíme aktuálnu IP adresu do premennej CURRENT_WAN_IP a porovnáme ju s rozsahom CGN. Ak spadá do CGN rozsahu, tak zhodíme interface pppoe0 na 5 sekúnd
#!/bin/sh
# CGN rozsah
CGN_RANGE="100.64.0.0/10"
# Zisti aktualnu IP adresu na pppoe0
CURRENT_WAN_IP=$(ifconfig pppoe0 | grep 'inet ' | awk '{print $2}')
# Ak IP patri do CGN rozsahu, restartuj WAN
if [[ "$CURRENT_WAN_IP" =~ ^100\.(6[4-9]|[7-9][0-9]|1[01][0-9]|12[0-7])\..* ]]; then
echo "CGN IP detected on pppoe0, restarting WAN interface..."
/sbin/ifconfig pppoe0 down
sleep 5
/sbin/ifconfig pppoe0 up
else
echo "Public IP detected, no action needed."
fi
Skriptu udelíme práva na spustenie a hneď môžeme spraviť zápis do cronu, ktorý bude spúšťať skript každých 10 minút
chmod +x /root/check_wan_ip.sh
crontab -e
*/10 * * * * /root/check_wan_ip.sh
Záver
Verejné IPv4 adresy sú dnes veľmi vzácne a v prípade môjho ISP môžem byť rád, že ich poskytuje zdarma. Niektorí ISP už zákazníkom vôbec neposkytujú IPv4 adresy, pretože prešli na protokol IPv6. Predpokladám, že prechod na IPv6 bude trvať ešte hodne dlho a ak sa neprejde úplne na IPv6, tak IPv4 bude stále fungovať.