
EsteLa página parece sugerir que, si hay una regla en la PREROUTING
cadena de la nat
tabla que traduce el destino 1.2.3.4:80
, 10.1.1.1:8080
entonces las reglas en la INPUT
cadena FORWARD
y deben coincidir en 10.1.1.1:8080
, no en 1.2.3.4:80
.
¿Qué pasa si uno quiere implementar un orden de operación más parecido al descrito?aquí? Es decir, ¿cómo se filtran las características de los paquetes antes de NAT?
Una posibilidad parece ser utilizar la PREROUTING
cadena de la raw
mesa. El problema es que conntrack no está disponible en raw/PREROUTING
(ver nota 1) y, por ejemplo, un fragmento UDP no inicial no estará relacionado con el fragmento inicial y producirá coincidencias inesperadas.
Avíseme si he descrito claramente el dilema y si existe alguna solución.
Nota 1: Corríjame si me equivoco, pero cuando intenté usar conntrack en raw/PREROUTING
, todos los paquetes SYN iniciales estaban marcados como " INVALID
" en lugar de " NEW
". También parece que, en el diagrama de flujo de Netfilter, "conntrack" está después de raw/PREROUTING
.
Respuesta1
No necesitas ninguna raw/PREROUTING
regla. Puede utilizar la conntrack
coincidencia para filtrar los paquetes por destino/dirección de origen/número de puerto original (antes de la traducción). Es conntrack
un sucesor del state
partido anterior. Puede verificar varios metadatos adicionales relacionados con conntrack entry
(y NAT).
Un par de ejemplos:
# allow any port-forwarded packets
iptables -t filter -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT
# check the original destination address of DNATed packets
iptables -t filter -A FORWARD -p tcp --dport 8080 -m conntrack --ctstate DNAT --ctorigdstport 80 --ctorigdst X.X.X.X --ctdir ORIGINAL -j ACCEPT
Para obtener más detalles, consulte la salida de iptables -m conntrack --help
y man iptables-extensions
.
Respuesta2
ElFlujo de paquetes en Netfilter y General NetworkingDescribe las relaciones entre los diferentes ganchos que ven un paquete. Aquí hay una parte más pequeña:
Así que si quieres interactuarmajestuosamentecon paquetesantesnat, la elección lógica es mangle/PREROUTING
: elconectarEl gancho ya rastreó el paquete: no obtendrá un estado INVÁLIDO, peronattodavía no sucedió.
Solo recuerda que iptablesnatve sólo el primer paquete y luego todo lo demás es manejado directamente porconectar, sigue sucediendo en el mismo lugar: entre mangle/PREROUTING
y la decisión de ruta.
El otro método se describe en el libro de Anton Danilov.respuesta: consultandoconectarpara verificar la dirección anterior en su tabla de búsqueda.