Quiero reenviar el puerto 80 desde el proxy a nginx y conservar la IP original. Mi estructura actual:
Proxy vm(192.168.0.104) - VM with iptables that redirects all traffic from port 80 to 192.168.106:80
Nginx vm(192.168.0.106) - VM with default nginx webpage on port 80
Por ejemplo, abrí un navegador web (ip local: 192.168.103) e ingresé 192.168.0.104 en el campo de dirección, luego obtuve la página web predeterminada de Nginx. En los registros de Nginx quiero ver algo como esto "192.168.0.103 - [06/Nov/2022:19:10:38 +0600] ...", donde la IP de origen sigue siendo la original
Script de Iptables en Proxy VM (192.168.0.104)
#!/bin/bash
IPT=/sbin/iptables
echo "Flushing Tables ..."
# Reset Default Policies
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
# Flush all rules
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
# Erase all non-default chains
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
# apt install conntrack # if error
conntrack --flush
IF_IN=enp0s3
PORT_IN=80
IP_OUT=192.168.0.106
PORT_OUT=80
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPT -A PREROUTING -t nat -i $IF_IN -p tcp --dport $PORT_IN -j DNAT --to-destination ${IP_OUT}:${PORT_OUT}
$IPT -A FORWARD -p tcp -i $IF_IN --dport $PORT_OUT -j ACCEPT
$IPT -A POSTROUTING -o $IF_IN -t nat -j MASQUERADE
Esta configuración me permite acceder a la página web desde local a través de 192.168.0.104, pero no guarda mi dirección IP original.
¿Alguien sabe cómo hacer este truco?
Respuesta1
Usar iptables para reenviar tráfico y mantener la IP del cliente solo es posible (usando DNAT) si su proxy es también su puerta de enlace predeterminada o algún otro truco de enrutamiento.
Las opciones más adecuadas que tienes (en mi opinión) son:
1. DNAT en tu enrutador
Configure su máquina virtual proxy como enrutador. Deje que todo el tráfico de su servidor web pase por este enrutador (puerta de enlace predeterminada). Siguiente configuración de Destino NAT en su enrutador
2. Utilice un proxy L7
Utilice un proxy de capa 7 que comprenda el tráfico HTTP. (nginx, haproxy, ...) Este proxy puede establecer un error HTTP que se establece en la IP del cliente original.
nginx
Agregue lo siguiente a su configuración:
proxy_set_header X-Real-IP $remote_addr;
HAProxy
Agregue lo siguiente a su configuración:
frontend *your_frontend*
option forwardfor header X-Real-IP
http-request set-header X-Real-IP %[src]