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?