ip6tables no enmascara la dirección de origen

ip6tables no enmascara la dirección de origen

Las siguientes son mis ip6tablesreglas:

# ip6tables -t nat -L -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       all      eth0   any     anywhere             2001:470:4a71:f170::/64  to:fdde:ad00:beef:0:91f5:6dd4:e66f:cf5b

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 19 packets, 1936 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 19 packets, 1936 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all      any    eth0    fdde:ad00:beef::/64  anywhere            
    0     0 MASQUERADE  udp      any    eth0    fd11:22::/64         anywhere            
    0     0 MASQUERADE  tcp      any    eth0    fd11:22::/64         anywhere 

Veo que los paquetes salen al eth0usar tshark. Aquí hay un paquete representativo (recibido en la interfaz wpan0):

221 480.196225356 fd11:22::703c:ef83:a03d:7e1b ? 2600:1f1c:c93:da00:76c2:1dbd:72c2:d063 TCP 94 [TCP Retransmission] 49998 ? 50000 [SYN] Seq=0 Win=9 Len=0 MSS=474 WS=1 SACK_PERM=1 TSval=2889901 TSecr=0

Quiero que estos paquetes pasen por el filtro MASQUERADE, por lo que sus direcciones de origen se reescriben para que sean la dirección IPv6 del host en Ethernet ( eth0). Sin embargo, esto no sucede, aunque esperaría que los paquetes coincidieran con las reglas de ip6tables. De hecho, el paquete ni siquiera coincide con ninguna de las reglas de MASQUERADE (como lo atestigua el pktscontador). No estoy seguro de cómo depurar esto. ¿Alguien sabe por qué estos paquetes no están enmascarados?

Cosas que he probado:

  1. Eliminar todas conntracklas entradas:conntrack -f ipv6 -D
  2. Reinicie la máquina.

¡Gracias por tu ayuda!

Editar:

Aquí hay algunos resultados más útiles:

# ip6tables-save -c
# Generated by ip6tables-save v1.6.0 on Sun Sep  2 11:44:06 2018
*filter
:INPUT ACCEPT [1812:134308]
:FORWARD ACCEPT [22:1760]
:OUTPUT ACCEPT [1782:210084]
COMMIT
# Completed on Sun Sep  2 11:44:06 2018
# Generated by ip6tables-save v1.6.0 on Sun Sep  2 11:44:06 2018
*nat
:PREROUTING ACCEPT [1:137]
:INPUT ACCEPT [1:137]
:OUTPUT ACCEPT [41:5757]
:POSTROUTING ACCEPT [41:5757]
[0:0] -A PREROUTING -d 2001:470:4a71:f170::/64 -i eth0 -j DNAT --to-destination fdde:ad00:beef:0:91f5:6dd4:e66f:cf5b
[0:0] -A POSTROUTING -s fdde:ad00:beef::/64 -o eth0 -j MASQUERADE
[0:0] -A POSTROUTING -s fd11:22::/64 -o eth0 -p udp -j MASQUERADE
[0:0] -A POSTROUTING -s fd11:22::/64 -o eth0 -p tcp -j MASQUERADE
COMMIT
# Completed on Sun Sep  2 11:44:06 2018

# ip -6 link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:96:eb:75 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:c3:be:20 brd ff:ff:ff:ff:ff:ff
4: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 06:8a:53:01:68:f2 brd ff:ff:ff:ff:ff:ff
5: wpan0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 500
    link/none

# ip -6 -brief address
lo               UNKNOWN        ::1/128 
eth0             UP             2001:470:4a71:f000::11/64 fe80::ba27:ebff:fe96:eb75/64 
wpan0            UNKNOWN        fdde:ad00:beef:0:cc1e:c6e2:8252:e44b/64 fd11:22::1c4d:925:de45:9d30/64 fe80::1c4d:925:de45:9d30/64 fe80::2ccb:f19:edce:c49e/64

# ip -6 route
2001:470:4a71:f000::/64 dev eth0  proto kernel  metric 256  pref medium
fd11:22::/64 dev wpan0  proto kernel  metric 256  pref medium
fdde:ad00:beef::/64 dev wpan0  proto kernel  metric 256  pref medium
fe80::/64 dev eth0  proto kernel  metric 256  pref medium
fe80::/64 dev wpan0  proto kernel  metric 256  pref medium
default via 2001:470:4a71:f000::1 dev eth0  metric 1024  pref medium

Respuesta1

Resulta que esto se debe a que la suma de comprobación de TCP era incorrecta (la pila TCP del host tenía un error). Aparentemente tsharkno muestra esto de forma predeterminada, pero estaba causando que ip6tables no enmascarara la dirección de origen.

Gracias a todos por intentar ayudar. Con respecto a la sugerencia de Kasperd, resulta que una solución similar funciona en mi entorno (tengo un /60, no un /48), así que intentaré alejarme de ip6tables.

Editar: ahora tengo la configuración funcionando sin NAT. Gracias por sugerir esto.

Respuesta2

Bien, tuve el mismo problema. La solución resultó ser simple, simplemente ejecute: "ip6tables -A FORWARD -m conntrack --ctstate ESTABLECIDO,RELACIONADO -j ACCEPT"

El problema es que el código ip6tables no carga el módulo conntrack de forma predeterminada, por lo que las reglas con estado completo no funcionan de forma transparente.

Y para el mensaje "¡IPv6 no necesita NAT!" brigada: a veces SÍ lo necesita, por ejemplo, si desea ejecutar contenedores Docker en AWS. No es compatible con DHCP PD, por lo que te quedas atrapado con NAT.

información relacionada