Aggiornamento di iptables tramite ddclient


0

TL; DR

C'è qualcosa che posso fare per cambiare iptables da ddclient (con ddclient utente)?

La storia dietro

Ho un computer che usa dyndn per essere indirizzabile dall'esterno. Ogni volta che il provider emette un nuovo indirizzo IP (cosa abbastanza frequente in questi giorni) ddclient aggiorna la voce dns.

Il computer ha alcune regole di iptables basate sul suo IP pubblico che ovviamente funzionerà solo mentre l'IP è corretto.

Fino ad ora avevo un cron job orario che avrebbe funzionato così per tenere aggiornato iptables:

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

Ora gli aggiornamenti orari significavano che potrebbe esserci un ritardo di un'ora in cui iptables è configurato con l'indirizzo sbagliato. Avrei potuto rendere il lavoro più frequente (fino a un minuto), ma ho pensato che fare questo genere di cose tramite il polling è uno spreco, specialmente quando ddclient offre la possibilità di eseguire uno script dopo che l'ip è stato cambiato.

Così ho inserito questo nella mia configurazione di ddclient:

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

Ho anche aggiunto il bit suid a change-iptables-public-ip.sh, ma senza risultato. Quando lo script viene eseguito da ddclient risulta in:

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.

Non mi piace l'idea di eseguire ddclient come root.

Un'idea che ho avuto fino ad ora era un processo eseguito come root, che ascolta un socket per il nuovo ip e quindi attiva le modifiche su iptables. Ma prima di sporcarmi le mani voglio sentire se ci sono soluzioni standard là fuori.


Quali regole sono quelle?
grawity

@grawity: è davvero importante? Sto puntando a una soluzione più generale, che potrebbe anche essere indipendente da iptables. Ma per il piacere di completenes: ho qualche loopback nat sul server e quindi ho alcune regole nella tabella nat che dipendono dall'indirizzo pubblico.
Nobody

Senza conoscere i particolari del tuo sistema o del tuo script, questo dovrebbe funzionare se aggiungi sudo allo script.
joat

@joat: che quindi dovrebbe essere autorizzato automaticamente, credo. I privilegi di root (ottenuti da sudo) sono molto ampi per questo tipo di attività. Anche l'accesso a iptables è troppo ampio. L'idea è di avere un canale che permetta solo a ddclient di modificare alcune regole specifiche. Per ora mi sono sistemato con il processo di ascolto su una presa.
Nobody

Puoi configurare sudo per eseguire solo il tuo script come root (invece di chiamare IPTables come root).
joat

Risposte:


2

Scusa per il ritardo. Sono stato occupato altrove ...

1) Accedi come root ed esegui visudo

2) Aggiungi una linea che assomigli a:

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

dove "bob" è l'account dal quale viene eseguito ddclient (probabilmente dovrai sperimentare).

3) Modifica la linea nella tua configurazione ddclient in modo che assomigli:

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

Probabilmente dovrai uccidere / riavviare ddclient. Avrai bisogno di sperimentare quanto sopra per farlo funzionare nel modo che preferisci. Potrebbe essere preferibile incorporare il comando sudo nello script (per comandi specifici) anziché eseguire l'intero script con l'accesso a livello di root.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.