Forward reálnej IP na backend

Nevedel som aký názov zvolím pre tuto tému, ale po prečítaní nasledujúceho veľmi dlhého súvetia, ktoré sa nehodí ako nadpis, snáď bude jasné, čo som mal na mysli. Ak spravujeme CMS, fórum, alebo nejaký webový projekt ktorý, loguje IP adresy odosielateľov a webové servery sú umiestnené za reverzným proxy serverom, tak z najväčšou pravdepodobnosťou budu IP adresy odosielateľov v logu, pod IP adresou reverzného proxy servera. My však chceme aby IP adresy boli zobrazené z reálneho zdroja.

Popíšem to ešte trocha zrozumiteľnejšie. Majme nasledujúcu situáciu (viď obrázok). Klient s IP adresou 87.65.43.21 sa dotazuje na webový server s IP adresou 192.168.1.11. Klient sa samozrejme skrz reverzný proxy server na webový server dostane. Reverzný proxy Nginx vidí klienta pod jeho reálnou IP adresou (87.65.43.21), ale Apache server, každého klienta vidí pod IP adresou reverzného proxy (192.168.1.10). Pre správcov webov je toto neprijateľné, pretože nemajú kontrolu napr. pred spamovacími robotmi (nevedia si generovať blacklisty a pod).

My chceme dosiahnuť aby aj backendový server (resp. webová stránka) obdržal zdrojovú IP adresou klienta. Na strane reverzného proxy servera by malo byť všetko nastavené aby to fungovalo ako chceme. Už sme to preberali napr. tu.

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

Zmenu je potrebné spraviť na backendových Apache serveroch. Pri vyhľadávaní informácii som sa dočítal, že je možné použiť dva moduly a to mod_rpaf a mod_remoteip. Spomínaný mod_rpaf sa používal skôr u starších verzií Apache 2.2.x. Neskôr sa začal používať mod_remoteip. Vzhľadom k tomu, že ja v súčasnej dobe bežím na Debian 9 a Apache 2.4.25, tak s mod_rpaf sa už nebudem zaoberať a použijem rovno mod_remoteip.

Prihlásime sa cez SSH na server (upozorňujem, že budeme pracovať na backendovom servery) a prepneme sa do módu root. Skontrolujeme či mod_remoteip je povolený. Pravdepodobne povolený nebude, tak ho môžeme povoliť. Potom vytvorime súbor do ktorého vložíme dva smernice (RemoteIPInternalProxy je IP adresa reverzného proxy servera). Následne reštartujeme Apache server

ssh name@192.168.1.11
su root
apache2ctl -M |grep remoteip_module
a2enmod remoteip
nano /etc/apache2/mods-available/remoteip.conf
RemoteIPHeader X-Real-IP
RemoteIPInternalProxy 192.168.1.10
systemctl restart apache2

Po tomto nastavení a reštarte by to malo fungovať, ale stále to nefunguje. Ak som do konfiguračného súbory konkrétneho virtualhostu pridal rovnaké smernice ako do /etc/apache2/mods-available/remoteip.conf, tak to začalo fungovať. Konfiguračný súbor virtualhostu potom vyzerá následovne (pozri riadok 8-9). Je možné, že sa to nastavuje aj v konfiguračnom súbore apache.conf globlne, ale ak sa tieto smernice pridajú do každého virtualhostu, tak to bude fungovať tiež.

<VirtualHost *:80>
    ServerAdmin admin@first-domain.com
    ServerName first-domain.com
    ServerAlias www.first-domain.com
    DocumentRoot /var/www/www.first-domain.com/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    RemoteIPHeader X-Real-IP
    RemoteIPInternalProxy 192.168.1.10
</VirtualHost>

Záver

Dúfam, že tento krátky návod aspoň niekomu pomôže. Ešte môžem dodať, že, tento web poháňa WordPress a z času na čas tu zavíta aj nejaký netbot, ktorého zdrojovú IP adresu som videl vždy ako IP adresu reverzného proxy. Riešenie som už našiel skôr, ale vyriešiť som to potreboval, nie len pre WordPress, ale všeobecne pre akýkoľvek virtualhost.

Použitá literatúra

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *