Cambie todas las reglas en iptables al cambiar la dirección IP

Cambie todas las reglas en iptables al cambiar la dirección IP

Tengo un sistema de puerta de enlace de red que utiliza iptables para permitir/denegar el tráfico hacia/desde una red interna. Tengo que agregar y eliminar reglas manualmente iptablessegún los requisitos de las entidades en la red interna, incluida la NAT de su tráfico. Las entidades confiables en la red interna pueden solicitar que se agreguen y eliminen reglas según sea necesario. El resultado final es un conjunto de reglas en las tablas naty filter, incluidas POSTROUTINGreglas con SNATdestinos, la configuración de la IP de origen como la del sistema de puerta de enlace y reglas en otras tablas con la dirección IP externa de la puerta de enlace como dst.

Quiero poder configurar la IP del sistema de puerta de enlace sobre la marcha. Por supuesto, esto tendría consecuencias perjudiciales para las sesiones TCP, etc., pero mantengámoslo fuera de escena. El sistema maneja estos problemas con otros mecanismos.

El problema es que un número desconocido de reglas en las tablas del firewall todavía hacen referencia a esta antigua dirección IP de origen.

¿Existe alguna manera de cambiar fácilmente todas estas reglas para usar la nueva dirección IP en lugar de la anterior?Por supuesto, también puedo aceptar algún script sofisticado usando sed/awk o similar si eres más un mago de bash que yo...

Respuesta1

Si el tráfico SNATed siempre usa la dirección IP de la interfaz saliente, reemplácela -j SNATcon -j MASQUERADE. Esto utilizará el mismo SNAT basado en conntrack pero seleccionará la dirección de origen de reemplazo automáticamente.

Puedes editar en masa las reglas de iptables usando iptables-savey iptables-restore:

  • Por ejemplo, para editar el conjunto de reglas de forma interactiva (especialmente si su editor tiene una buena función de búsqueda y reemplazo):

    iptables-save > /tmp/rules
    vim /tmp/rules
    iptables-restore < /tmp/rules
    

    Usando 'vipe' de moreutils:

    iptables-save | vipe | iptables-restore
    
  • Para reemplazar en masa una dirección IP exacta por otra (teniendo en cuenta que .es un carácter comodín en las expresiones regulares, además de usarlo \bpara garantizar que "12.34" no coincida accidentalmente con "112.34"):

    iptables-save | sed 's/\b12\.34\.56\.78\b/12.34.56.99/g' | iptables-restore
    

Pero en mi opinión,cualquierLa edición de reglas de iptables (incluida la configuración "iptables -A" basada en scripts) es un mal enfoque. En lugar de eso, mantenga uniptables.rules archivo(en el formato iptables-save) como "fuente" y siempre cargue el conjunto de reglas desde ese archivo. Luego, puede comenzar a usar algún tipo de lenguaje de macros/plantillas para definir la dirección IP una vez y hacer referencia a ella en todas partes, similar a cómo se hace cuando se implementan archivos de configuración a través de Salt/Ansible (si alguien todavía los usa).

  • Por ejemplo (en realidad no hagas esto; se convertirá en algo inmanejable demasiado rápido):

    cat /etc/iptables.rules | sed 's/%CUST_IP%/12.34.56.78/g' | iptables-restore
    
  • También sugeriría echar un vistazo a Ferm, que implementa una sintaxis alternativa para las reglas de iptables, un poco más legible en general, pero también tiene macros integradas para que puedas @def $cust_ipconsultarlas una vez y en todas partes.

    domain (ip ip6) {
        @def dns_host4 = 10.10.0.53;
        @def ntp_host4 = 10.10.0.123;
    
        table filter {
            chain FORWARD {
                daddr ($dns_host4 $ntp_host4) accept;
            }
        }
    
        table nat {
            chain PREROUTING {
                proto (tcp udp) dport 53 DNAT to-destination $dns_host4;
                proto udp dport 123 DNAT to-destination $ntp_host4;
            }
        }
    }
    

    Esto funciona de manera similar a iptables-restore: en lugar de realizar cambios en vivo, edita /etc/ferm.confy ejecuta fermpara recargar todo el conjunto de reglas cuando haya terminado. Si una dirección IP cambia, simplemente edite la macro @def en ferm.conf y vuelva a cargarla.

    (Además, es bueno acostumbrarse a esto si finalmente terminas cambiando a nftables, ya que funciona prácticamente igual que Ferm; por supuesto, la sintaxis es un poco diferente, pero también tiene $macros y puedes editar /etc/ nftables.conf y recarga todo de una vez.)

Respuesta2

Sugeriría iptables en combinación con ipset.

En iptables tendrías tu regla pero luego agregarías --match-set setname src

iptables -I PREROUTING -s whatever ... --match-set setname src
iptables -I PREROUTING -s whatever ... --match-set setname dst

Luego, para deshabilitar la regla, debe eliminar la dirección IP del conjunto llamado "setname". Para habilitarla, simplemente agregue una dirección IP a setname.

Entonces iptables sigue siendo el mismo y solo sumas y restas entradas de setname

Cada regla tendría un nombre diferente según fuera necesario.

información relacionada