Después de añadir algunas reglas pf para redirigir cierto tráfico de salida a un servidor localhost, no puedo acceder a ese servidor localhost directamente. Sin embargo, puedo acceder a él a través de la redirección sin problemas.
Básicamente he seguido esta respuesta y añadimos las siguientes reglas:
rdr pass on lo0 inet proto tcp from any to 169.254.169.254 port 80 -> 127.0.0.1 port 1254
pass out route-to lo0 proto tcp from any to 169.254.169.254 port 80 keep state
Después de hacer esto, puedo probar con éxito con curl http://169.254.169.254
. Sin embargo, curl http://127.0.0.1:1254
no funciona.
Si elimino las reglas (específicamente el rdr
regla), 127.0.0.1:1254
funciona bien.
Cuando realizo una tcpdump
en lo0
veo lo siguiente:
08:27:49.659051 IP 127.0.0.1.63994 > 127.0.0.1.1254: Flags [S], seq 677650599, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439529 ecr 0,sackOK,eol], length 0
08:27:49.659177 IP 169.254.169.254.80 > 127.0.0.1.80: Flags [S.], seq 2981033646, ack 677650600, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439529 ecr 1709439529,sackOK,eol], length 0
08:27:49.762036 IP 169.254.169.254.80 > 127.0.0.1.63994: Flags [S.], seq 2981033646, ack 677650600, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439629 ecr 1709439529,sackOK,eol], length 0
08:27:49.762056 IP 127.0.0.1.63994 > 127.0.0.1.1254: Flags [S], seq 677650599, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439629 ecr 0,sackOK,eol], length 0
08:27:49.762089 IP 169.254.169.254.80 > 127.0.0.1.63994: Flags [S.], seq 2981033646, ack 677650600, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439629 ecr 1709439629,sackOK,eol], length 0
08:27:49.866634 IP 127.0.0.1.63994 > 127.0.0.1.1254: Flags [S], seq 677650599, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439729 ecr 0,sackOK,eol], length 0
08:27:49.866690 IP 169.254.169.254.80 > 127.0.0.1.63994: Flags [S.], seq 2981033646, ack 677650600, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439729 ecr 1709439729,sackOK,eol], length 0
08:27:49.967548 IP 169.254.169.254.80 > 127.0.0.1.63994: Flags [S.], seq 2981033646, ack 677650600, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1709439829 ecr 1709439729,sackOK,eol], length 0
...
Así que vemos el SYN original con la fuente y el destino correctos. Pero luego vemos dos respuestas procedentes de 169.254.169.254:80
uno a 127.0.0.1:80
y otro a 127.0.0.1:63994
.
Cuando añado log (all)
a la regla, veo información similar:
00:00:00.000000 rule 0/0(match): rdr out on lo0: 169.254.169.254.80 > 127.0.0.1.80: Flags [S.], seq 1734908561, ack 3748497075, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1711591000 ecr 1711591000,sackOK,eol], length 0
00:00:00.100977 rule 0/0(match): rdr out on lo0: 169.254.169.254.80 > 127.0.0.1.80: Flags [S.], seq 1734908561, ack 3748497075, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1711591101 ecr 1711591000,sackOK,eol], length 0
00:00:00.000044 rule 0/0(match): rdr out on lo0: 169.254.169.254.80 > 127.0.0.1.80: Flags [S.], seq 1734908561, ack 3748497075, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 1711591101 ecr 1711591101,sackOK,eol], length 0
¿Por qué el rdr
regla que coincida con el tráfico de respuesta y lo reescriba? La regla de coincidencia se define como to 169.254.169.254 port 80
.
Esto es en High Sierra.