Solución:
Solución 1:
iptables
funciona en direcciones IP, no en nombres de host. Puede usar nombres de host como argumentos, pero se resolverán en el momento en que se ingrese el comando. Hacer una búsqueda de DNS para cada paquete que pasa sería demasiado lento.
Su idea de ajustar las reglas es, por lo tanto, el único enfoque. Esto puede ser en un horario regular, controlado por un programa como systemd o cron, o mejor si puede recibir una notificación cada vez que cambia la dirección IP.
No tiene que almacenar la dirección anterior, simplemente cree una cadena de iptables para su regla y reemplace la regla. Ver el -R
opción a iptables
. Para tener una regla para reemplazar en la primera verificación, simplemente agregue una regla ficticia para que haya una regla para reemplazar cuando se ejecute la primera verificación.
También puede evitar la cadena adicional y reemplazar una regla en una posición específica en INPUT
o FORWARD
, pero es mucho más trabajo de mantener, ya que el número de posición cambia cada vez que agrega o elimina reglas.
Solución 2:
La forma en que hago esto es:
- Ejecute un script cada x minutos desde crontab para actualizar un “ipset”
- Haga que IPtables use el ipset
Suponiendo que solo tiene 1 dirección IP en este ipset, la siguiente secuencia de comandos sería suficiente:
#!/bin/bash
# Update ipset to let my dynamic IP in
set=whitelist
host=myhost.dynamic.example.com
me=$(basename "$0")
ip=$(dig +short $host)
if [ -z "$ip" ]; then
logger -t "$me" "IP for '$host' not found"
exit 1
fi
# make sure the set exists
ipset -exist create $set hash:ip
if ipset -q test $set $host; then
logger -t "$me" "IP '$ip' already in set '$set'."
else
logger -t "$me" "Adding IP '$ip' to set '$set'."
ipset flush $set
ipset add $set $host
fi
En crontab
Llamo a este script cada 5 minutos:
*/5 * * * * root /usr/local/bin/ipset-update-dyn
En iptables, la regla que usa ipset se ve así:
-A INPUT -p tcp -m set --match-set whitelist src -m state --state NEW -j ACCEPT