Redirigir el tráfico usando PF junto con Internet Sharing

La versión corta:

¿Cómo redirijo todo el tráfico del puerto en2 80/443 a 127.0.0.1:8080 cuando he habilitado Internet Sharing en OS X Mountain Lion (10.8)?

Algunos antecedentes:

Estoy haciendo una tesis de maestría donde evaluaré la seguridad de la comunicación para varias aplicaciones de teléfonos inteligentes. Elegí usar mi nuevo MacBook Air como enrutador.

Conecté mi Air a Internet con USB Ethernet y configuré Internet Sharing en mi Wifi. Esto funciona bien. Puedo conectar otros dispositivos a mi Air a través de wifi y acceder a Internet. ¡Gran!

Ahora quiero interceptar este tráfico y modificarlo sobre la marcha. Pensé que necesitaba un proxy para hacer esto, pero necesito uno transparente, donde no tengo que hacer ninguna configuración en el dispositivo. Descubrí que mitmproxy ofrece exactamente estas características. Así que lo tengo funcionando en 127.0.0.1:8080, listo para interceptar el tráfico.

Desafortunadamente, estoy atascado tratando de redirigir mi tráfico proveniente del wifi (en2) en el puerto 80 y 443 a 127.0.0.1:8080. Los documentos de mitmproxy sugieren una configuración para pfctl pero no funciona. Me di cuenta de que Apple ha proporcionado alguna configuración para compartir Internet, habilitando NAT. Entonces, si no uso su configuración, Internet Sharing deja de funcionar. Y cuando trato de agregar las líneas rdr a su configuración, no tiene efecto (probé en varios lugares en el archivo /etc/pf.conf). Mi tráfico simplemente pasa a Internet, sin pasar por el mitmproxy.

Respuestas (2)

Encontré la respuesta.

Cargué mis reglas como parte del ancla, com.apple/100.InternetSharing/natpmpque es la que se usa para compartir Internet.

El archivo mitm.pf.confcontiene las reglas:

rdr on bridge0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr on bridge0 proto tcp from any to any port 443 -> 127.0.0.1 port 8080`

Cárguelo usando el ancla de Internet Sharing:

sudo pfctl -a com.apple/100.InternetSharing/natpmp -f mitm.pf.conf

En una situación similar, he usado el firewall para redirigir el tráfico de una NIC al proxy. Podrías usar algo así:

$ sudo ipfw add fwd 127.0.0.1,8080 tcp from not me to any 80 in via en1
$ sudo ipfw add fwd 127.0.0.1,8080 tcp from not me to any 443 in via en1

Si funcionó bien para mí.

También puede utilizar el programa gratuito WaterRoof como interfaz gráfica de usuario para configurar el cortafuegos. No agrega nada al comando ipsw, solo le brinda un acceso más fácil a todas las opciones.

Esta página me ayudó mucho a establecer mi configuración:

http://lucumr.pocoo.org/2013/1/6/osx-wifi-proxy/

Lo intenté pero por alguna razón no funcionó. Rompió por completo el uso compartido de Internet. Además, tengo entendido que Apple se está alejando de ipfw de FreeBSD a favor de pf de OpenBSD.
Esta respuesta solo funciona para Mac antiguas. Apple ha eliminado IPFW.