El proxy transparente de Linux no funciona.

El proxy transparente de Linux no funciona.

Estoy intentando que el servidor de tráfico Apache funcione en modo proxy transparente, es decir, en modo puente Linux en línea. Ellos tienendocumentaciónsobre cómo hacer esto. Configuré mi sistema Linux según su documentación y aquí está mi configuración:

brctl addbr br0
brctl stp br0 off
brctl addif br0 enp2s0
brctl addif br0 eno1
ifconfig enp2s0 0 0.0.0.0
ifconfig eno1 0 0.0.0.0
ifconfig br0 0.0.0.0
ifconfig br0 192.168.10.100 netmask 255.255.255.0 up
ebtables -t broute -F
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-dport 80 -j redirect --redirect-target DROP
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-sport 80 -j redirect --redirect-target DROP
iptables -t mangle -A PREROUTING -i eno1 -p tcp -m tcp --dport 80 -j TPROXY --on-ip 0.0.0.0 --on-port 8080 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -i enp2s0 -p tcp -m tcp --sport 80 -j MARK --set-mark 1/1
ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1

Sin embargo, esta configuración no parece funcionar. Según la configuración, las reglas de ebtables e iptables interceptan el tráfico destinado al puerto 80 y lo redirigen al puerto 8080. Según el resultado de tcpdump, la solicitud inicial parece llegar a mi sistema Linux.

tshark -i eno1 port 80
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eno1'
  1 0.000000000 192.168.20.200 -> 192.168.20.50 TCP 74 58986 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=345213688 TSecr=0 WS=128
  2 1.002013264 192.168.20.200 -> 192.168.20.50 TCP 74 [TCP Retransmission] 58986 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=345214690 TSecr=0 WS=128
  3 3.008098848 192.168.20.200 -> 192.168.20.50 TCP 74 [TCP Retransmission] 58986 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=345216696 TSecr=0 WS=128
3 packets captured

Sin embargo, parece que iptables/ebtables no están reenviando la pila. Agregué seguimiento a las reglas de iptables y esto es lo que veo en los registros.

[ 5425.095575] TRACE: raw:PREROUTING:policy:2 IN=eno1 OUT= MAC=0c:c4:7a:78:97:c6:0c:c4:7a:b5:be:e9:08:00 SRC=192.168.20.200 DST=192.168.20.50 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41608 DF PROTO=TCP SPT=58922 DPT=80 SEQ=2153102820 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A1478234C0000000001030307)
[ 5425.095620] TRACE: mangle:PREROUTING:rule:1 IN=eno1 OUT= MAC=0c:c4:7a:78:97:c6:0c:c4:7a:b5:be:e9:08:00 SRC=192.168.20.200 DST=192.168.20.50 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41608 DF PROTO=TCP SPT=58922 DPT=80 SEQ=2153102820 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A1478234C0000000001030307)

El seguimiento de iptables confirma lo que veo en la salida de tcpdump. Parece que la solicitud llega a iptables y luego se coloca en algún lugar de la pila de IP de Linux. No estoy seguro de dónde ni cómo depurar esto.

Al leer en línea sobre este tema, alguien sugirió que deshabilitarafiltro_rp. Sin embargo, desactivar rp_filter no ayudó. Alguien más sugirió que habilitara el reenvío de IP, pero eso tampoco ayudó. Cualquier ayuda para solucionar el problema o al menos algunos consejos sobre qué o dónde depurar a continuación sería muy apreciada.

información relacionada