Actualización de iptables a través de ddclient

0

TL; DR

¿Hay algo que pueda hacer para cambiar iptables de ddclient (con el usuario ddclient)?

La historia detras

Tengo una computadora que usa dyndns para ser direccionable desde afuera. Cada vez que el proveedor emite una nueva dirección IP (lo que sucede con frecuencia en estos días) ddclient actualiza la entrada dns.

La computadora tiene algunas reglas de iptables basadas en su IP pública que, por supuesto, solo funcionará mientras la IP sea correcta.

Hasta ahora tenía un trabajo cron por hora que funcionaría así para mantener actualizadas las iptables:

./change-iptables-public-ip.sh `curl ifconfig.me/ip`

Ahora, las actualizaciones por hora significaban que podría haber un retraso de una hora cuando iptables se configura con la dirección incorrecta. Podría haber hecho el trabajo más frecuente (hasta un minuto), pero pensé que hacer este tipo de cosas a través del sondeo es un desperdicio, especialmente cuando ddclient ofrece la posibilidad de ejecutar un script después de que se haya cambiado la ip.

Así que inserté esto en mi configuración de ddclient:

postscript=/etc/ddclient/change-iptables-public-ip.sh

También agregué el bit suid a change-iptables-public-ip.sh, pero fue en vano. Cuando el script es ejecutado por ddclient, resulta en:

iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

No me gusta la idea de ejecutar ddclient como root.

Una idea que tenía hasta ahora era un proceso que se ejecutaba como root, que escucha en un socket la nueva ip y luego desencadena los cambios en iptables. Pero antes de ensuciarme las manos quiero saber si hay soluciones estándar por ahí.

Nadie
fuente
¿Qué reglas son esas?
Grawity
@grawity: ¿Eso realmente importa? Estoy buscando una solución más general, que incluso podría ser independiente de iptables. Pero por el bien de completenes: tengo algo de bucle de retorno nat en el servidor y, por lo tanto, tengo algunas reglas en la tabla nat que dependen de la dirección pública.
Nadie
Sin conocer los detalles de su sistema o su script, esto debería funcionar si agrega sudo al script.
Joat
@joat: Creo que tendría que autorizarse automáticamente. Los privilegios de raíz (ganados por sudo) son muy amplios para este tipo de tarea. Incluso el acceso a iptables es demasiado amplio. La idea es tener un canal que permita que solo ddclient altere algunas reglas específicas. Por ahora me he decidido por el proceso de escuchar en un socket.
Nadie
Puede configurar sudo para ejecutar solo su script como root (en lugar de llamar a IPTables como root).
Joat

Respuestas:

2

Perdón por el retraso. He estado ocupado en otro lugar ...

1) Inicie sesión como root y ejecute visudo

2) Agregue una línea que se vea así:

bob ALL = (ALL) NOPASSWD: /etc/ddclient/change-iptables-public-ip.sh

donde "bob" es la cuenta desde la que se ejecuta ddclient (es probable que tengas que experimentar).

3) Edite la línea en su configuración de ddclient para que se vea así:

postscript = sudo /etc/ddclient/change-iptables-public-ip.sh

Es probable que necesite matar / reiniciar ddclient. Tendrá que experimentar con lo anterior para llevarlo a donde funcione de la manera que lo desee. Puede ser mejor incrustar el comando sudo en su script (para comandos específicos) en lugar de ejecutar el script completo con acceso de nivel raíz.

joat
fuente