Puncte:0

iptables și proxy invers Nginx pentru localhost

drapel pk

rezumat

Folosesc Nginx ca proxy invers și în special funcționalitatea acestuia proxy_bind pentru a trimite IP-ul clientului real către backend. am urmărit această documentație de la nginx.com.
Funcționează bine, atât când serverul HTTP este găzduit pe o altă mașină, cât și direct pe cel al proxy-ului invers, cu excepția cazului al doilea dacă serverul HTTP ascultă pe localhost.

=> Nu pot obține că această configurație funcționează:

# /etc/nginx/conf.d/nginx-revprox-test.conf
Server {
    asculta 80;
    Locație / {
        proxy_pass http://127.0.0.1:8080;
        proxy_bind $remote_addr transparent;
    }
}

Detalii

Ipoteze:

  • Adrese IP:
    • Proxy invers/backend local: 192.168.1.90 (eth0) & 172.17.0.1 (eth1)
    • Backend extern: 172.17.0.2
    • Client: 192.168.1.91
  • Porturi:
    • în față: 80 (fără TLS)
    • backend-uri: 8080
  • Cazul nr.1: Serverul HTTP este găzduit pe backend extern (http://172.17.0.2:8080).

    # /etc/nginx/conf.d/nginx-revprox-test.conf
    Server {
        asculta 192.168.1.90:80;
        Locație / {
            proxy_pass http://172.17.0.2:8080;
            proxy_bind $remote_addr transparent;
        }
    }
    

    The manual spune că trebuie să configuram iptables în consecință:

    iptables -t mangle -A PREROUTING -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
    regulă ip adăugați fwmark 1 căutare 100
    ip route add local 0.0.0.0/0 dev lo tabelul 100
    

    => Funcționează bine.

  • Cazul nr.2: Serverul HTTP este găzduit pe aceeași mașină ca proxy-ul invers și ascultă et1 (http://172.17.0.1:8080).

    # /etc/nginx/conf.d/nginx-revprox-test.conf
    Server {
        asculta 192.168.1.90:80;
        Locație / {
            proxy_pass http://172.17.0.1:8080;
            proxy_bind $remote_addr transparent;
        }
    }
    

    Conform acest raspuns și această diagramă, numai IEȘIRE și POSTOUTARE se aplică pachetelor generate local. Trebuie să ne schimbăm regula iptables în consecință:

    iptables -t mangle -A OUTPUT -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
    

    => Funcționează și el.

  • Cazul nr.3: Serverul HTTP este găzduit local, dar ascultă uite (http://127.0.0.1:8080).

    # /etc/nginx/conf.d/nginx-revprox-test.conf
    Server {
        asculta 192.168.1.90:80;
        Locație / {
            proxy_pass http://127.0.0.1:8080;
            proxy_bind $remote_addr transparent;
        }
    }
    

    => [!] Nu pot să fac să funcționeze, chiar și cu un IEȘIRE regulă în iptables.
    curl http://192.168.1.90:80 nu funcționează de la client (funcționează doar de la server, dar nu asta este ideea).

Am omis ceva despre iptables. Ai putea sa ma ajuti?

drapel pk
Precizie: al treilea caz fără `proxy_bind` funcționează bine, dar desigur pierdem transparența IP.
drapel us
Aș implementa transmiterea adresei IP reale într-un antet și apoi backend-ul ar folosi acea adresă IP. Efectuarea tabelelor de rutare pentru a atinge acest obiectiv face ca soluția să fie mai greu de înțeles.
djdomi avatar
drapel za
nu poți seta și un antet personalizat? NGINX poate asta, dar aplicația ta?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.