[Debian] Cron en Iptables

Pagina: 1
Acties:

  • Tom_G
  • Registratie: Januari 2004
  • Laatst online: 26-01 17:11
Ik heb onder Debian een scriptje waarin onder andere volgend stuk in moet uitgevoerd worden:
code:
1
2
3
4
... code
iptables -t mangle -A POSTROUTING -o eth0 -s $ip -j MARK --set-mark $mark
/etc/init.d/iptables save active
... rest van de code


Wanneer ik dit script zelf uitvoer, wordt die rule toegevoegd in Iptables. Als ik het echter via een Crontab laat werken, loopt gans het script, uitgenomen die regel toevoegen.

Idem dito waar ik op een andere plaats die rule terug laat verwijderen (wanneer die er al is uiteraard).

Iemand een idee?

[ Voor 12% gewijzigd door Tom_G op 26-01-2007 18:19 ]


Verwijderd

Iets met je path? Probeer eens:
code:
1
2
3
...
/sbin/iptables -t mangle ...
...

  • UltraSub
  • Registratie: Mei 2003
  • Laatst online: 28-12-2025
In cron moet je inderdaad het volledige pad naar je executables opgeven. Heb je dat gedaan?
Loopt het script vanuit cron als root?

  • Tom_G
  • Registratie: Januari 2004
  • Laatst online: 26-01 17:11
Héhé, blijkbaar lag het inderdaad bij het pad. :) Het script wordt inderdaad onder root uitegevoerd.

Mag ik er dan vanuitgaan dat eender welk programma met het volledig pad worden uitgevoerd? Waarom kan je dan pakweg cp, mv, rm,... wèl zonder volledig pad gebruiken?

Verwijderd

Test het zelf maar uit: maak een cronjob met daarin alleen maar het commando "set | grep -i path" en bekijk de output: dan zie je welk pad jouw cron-installatie gebruikt.
Uiteraard kun je bovenin een cronjob gewoon "PATH=/bin:/usr/bin:etcetera" neerzetten.

  • Tom_G
  • Registratie: Januari 2004
  • Laatst online: 26-01 17:11
Blijkbaar gebeuren er nog vreemde dingen met iptables en cron.

Hieronder een stuk code van het script. De bedoeling is dat er in de tabel filter in de forward chain gecontrolleerd wordt of een regel al aanwezig is (eentje op basis van een ip adres). Indien niet aanwezig moet die toegevoegd worden, anders niet uiteraard.
De totaalbedoeling hiervan is dat enkel ip adressen die via DHCP werden uitgedeeld ook daadwerkelijk internet toegang krijgen.

Via cron wordt die telkens opnieuw toegevoegd, bij het manueel runnen van het script niet. Ik heb wat commentaar in de code gezet ter verduidelijking.

code:
1
2
3
4
5
6
7
8
9
10
11
# Filteren totdat er een lijst van enkel ip adressen voor die chain zichtbaar zijn -> uitvoeren van dit commando duurt blijkbaar lang, geen idee waarom
iptables_ips=`iptables -t filter -L FORWARD | grep 192 | cut -f3 -d "-" | cut -f3 -d " "`
# De variabele $leased_ips komt vanuit het log van de DHCP server
for leased_ip in $leased_ips ; do
    # Waarde voor toegevoegd: 0=niet toegevoegd, 1 of meer=wel toegevoegd
    ip_iptables_toegevoegd=`echo "$iptables_ips" | grep "$leased_ip" | wc -w` #Deze variabele is altijd 0 bij het runnen via cronjob, bij zelf runnen script geeft dit het aantal keer dat dit ip adres al aanwezig is, terug
    echo "$datum Leased ip $leased_ip $ip_iptables_toegevoegd keer in iptables aanwezig" >> $log_file # Loggen voor alle zekerheid -> dit bevestigd dat via cronjob 0 is en manueel uitvoeren altijd de juiste waarde
    if [ $ip_iptables_toegevoegd -eq 0 ] ; then # Regel maar toevoegen als deze niet aanwezig is
        /sbin/iptables -A FORWARD -s $leased_ip -j ACCEPT
    fi
done


Ik heb een vermoeden dat het iets te maken heeft met het feit dat het lang duurt om de inhoud van de forward chain in de filter tabel van iptables op te halen en te filteren (regel 2). Daardoor geeft $ip_iptables_toegevoegd altijd 0 terug wanneer hij via cron gestart wordt (in tegenstelling tot zelf runnen). Bijgevolg is de variabele $iptables_ips leeg op het moment dat die nodig is.

Maar waarom via cron wel en manueel niet? Kan ik hier een mouw aan passen?

[ Voor 16% gewijzigd door Tom_G op 27-01-2007 15:34 ]


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
En als je hier:
code:
1
iptables_ips=`iptables -t filter -L FORWARD | grep 192 | cut -f3 -d "-" | cut -f3 -d " "`

ook eens het hele path naar iptables gebruikt ? :+

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • UltraSub
  • Registratie: Mei 2003
  • Laatst online: 28-12-2025
Als je iets onder de user draait waarmee je bent ingelogd, die path definities heeft, en dus weet waar iets te vinden is. Draai je een cron, dan is er geen path setting, tenzij je dat zelf opgeeft.
Ik zelf zoek altijd mbv 'locate' op waar de shit staat, en specificeer overal volledige paden. Oftewel, bovenin het script alles definieren wat ik ga gebruiken aan commandos.

  • Tom_G
  • Registratie: Januari 2004
  • Laatst online: 26-01 17:11
u_nix_we_all schreef op zaterdag 27 januari 2007 @ 18:34:
En als je hier:
code:
1
iptables_ips=`iptables -t filter -L FORWARD | grep 192 | cut -f3 -d "-" | cut -f3 -d " "`

ook eens het hele path naar iptables gebruikt ? :+
Ik had ondertussen al de verschillende paden gedefiniërd in het script dus dat lijkt me het probleem niet. Ik heb echter nu eens de optie -n meegegeven (wat betekend dat hij geen reverse lookups doet voor dat ip adres) en dan gaat het sneller en blijkt het ook te werken met cron..
Pagina: 1