Shell script wil niet automatisch draaien, wel aan de prompt

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • PhilipsFan
  • Registratie: Oktober 2003
  • Laatst online: 11:37
Mijn vraag
Ik heb een shell script dat enkele iptables-opdrachten bevat. Dit script moet draaien bij het opkomen van eth0, dus ik heb in /etc/network/interfaces een pre-up opdracht toegevoegd met een verwijzing naar het script. Het script is uiteraard executable en leesbaar voor iedereen. Toch wordt het script niet gedraaid bij het opstarten. Dit heb ik gecontroleerd door een echo date toe te voegen naar een bestand, dit bestand wordt niet bijgewerkt.
code:
1
2
iface eth0 inet manual
    pre-up /etc/firewall-openvpn-rules.sh

Relevante software en hardware die ik gebruik
Raspbian Jessie op een Raspberry Pi 3. Kernelversie is 4.9.28-v7+

Wat ik al gevonden of geprobeerd heb
Het script werkt prima als je het vanaf de prompt draait (als root). Dus dan zou je zeggen dat er niks mankeert aan het script. Ik heb ook geprobeerd om het script te plaatsen in /etc/network/if-up.d, maar daar werkt het ook niet. Mijn script lijkt exact dezelfde eigenschappen (permissies, owner) te hebben als de andere scripts die daar staan. Ik heb het ook nog geprobeerd als post-up ipv pre-up.

Uiteindelijk heb ik de iptables-opdrachten toegevoegd aan een ander script wat al bestond in /etc/network/if-up.d en dat heeft het gewenste effect, maar ik kan er niet tegen dat ik nu niet weet wat ik fout doe...

[ Voor 5% gewijzigd door PhilipsFan op 25-06-2017 23:35 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Post-up is de juiste plek voor zulke dingen. Pre-up doe je in principe om nog wat te regelen voordat je interface up gaat of kan. Iptables doe je er pas na, zeker als er interface IP adressen wordt gebruikt.

Maar check de logs eens. Wat zie je bij journalctl of de logs in /var/log/ hierover? Zet desnoods een 'set -x' bovenaan in je script. Heb je er ook de juiste begin header in staan (dus op de eerste regel '#!/bin/bash')?

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • basdej
  • Registratie: Augustus 2010
  • Laatst online: 01:40

basdej

OutSystems Consultant

Hoi.


Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
hoort dat niet in /etc/network/if-up.d/ zoals 99% van alle netwerk services?

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
johnkeates schreef op zondag 25 juni 2017 @ 23:51:
hoort dat niet in /etc/network/if-up.d/ zoals 99% van alle netwerk services?
Die scripts gelden voor alle interfaces. In /etc/network/interfaces kun je hem per-interface configureren.

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • PhilipsFan
  • Registratie: Oktober 2003
  • Laatst online: 11:37
Of ik het nu in if-up.d of elders heb staan, het werkt niet. Pre-up of post-up maakt ook niet uit. Maar het script doet het prima als ik aanlog als root en het handmatig laat draaien.
De methode die daar beschreven staat is dubbel. Wat in if-up.d staat wordt automatisch uitgevoerd bij het opkomen. Als je het ook nog als pre-up erin zet, draait het commando 2x.

Acties:
  • +1 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Room42 schreef op zondag 25 juni 2017 @ 23:53:
[...]

Die scripts gelden voor alle interfaces. In /etc/network/interfaces kun je hem per-interface configureren.
Ja en nee.

code:
1
2
3
if [ "$IFACE" = tun0 ]; then
  echo "tun0 up" >> /var/log/tun-up.log
fi


In het geval van VPN rules lijkt me in dit geval wel prettig dat je alles lekker dynamisch houdt en gewoon de interface een keer in een var propt en daarna overal refereert. Hoewel het gebruiken van de script opties in interfaces niet deprecated is wordt er wel steeds minder mee gedaan, voornamelijk, door dat systemd's feature creep ook netwerktaken aan het opeten is.
PhilipsFan schreef op zondag 25 juni 2017 @ 23:55:
Of ik het nu in if-up.d of elders heb staan, het werkt niet. Pre-up of post-up maakt ook niet uit. Maar het script doet het prima als ik aanlog als root en het handmatig laat draaien.

[...]

De methode die daar beschreven staat is dubbel. Wat in if-up.d staat wordt automatisch uitgevoerd bij het opkomen. Als je het ook nog als pre-up erin zet, draait het commando 2x.
Voeg wat logging toe zodat je weet wat er gebeurt.

[ Voor 27% gewijzigd door johnkeates op 25-06-2017 23:56 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Overigens, als de config in je interfaces file echt is wat je hier neerzet, dan is het 100% logisch dat er niets gebeurt. Het up brengen van de interface staat op handmatig en zal tijdens opstarten dan ook niet uitgevoerd worden.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • PhilipsFan
  • Registratie: Oktober 2003
  • Laatst online: 11:37
Hero of Time schreef op maandag 26 juni 2017 @ 08:13:
Overigens, als de config in je interfaces file echt is wat je hier neerzet, dan is het 100% logisch dat er niets gebeurt. Het up brengen van de interface staat op handmatig en zal tijdens opstarten dan ook niet uitgevoerd worden.
Als je bedoelt dat er 'manual' staat, volgens mij slaat dat op de toewijzing van een IP-adres. Bij andere interfaces staat daar namelijk dhcp. Dat heb ik hier trouwens ook geprobeerd, maar ook dat maakt geen verschil. De interface doet het trouwens wel, alleen de dor mij bedoelde firewall regels worden niet actief.

Acties:
  • +1 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Nee, manual wil zeggen dat er niets gedaan wordt en het via if-*.d wordt geconfigureerd. Van de man-page:
code:
1
2
3
4
5
6
7
8
9
10
11
   The manual Method
       This method may be used to define interfaces for which no configuration is done by  default.  Such  interfaces
       can be configured manually by means of up and down commands or /etc/network/if-*.d scripts.

       Options

              hwaddress address
                     Link local address or "random".

              mtu size
                     MTU size

Er bestaat dus geen pre-/post-up optie.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
PhilipsFan schreef op zondag 25 juni 2017 @ 23:34:
Het script werkt prima als je het vanaf de prompt draait (als root). Dus dan zou je zeggen dat er niks mankeert aan het script.
Met welke shell? Het script wordt mogelijk niet uitgevoerd met bash en als er iets bash specifieks in staat..

Acties:
  • 0 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 24-09 15:32
Heeft het script een bestandsnaam met extensie? Debian, en Raspbian dus misschien ook, heeft daar problemen mee. De bestandsnaam mag geen extensie hebben.

In https://manpages.debian.o...down/interfaces.5.en.html wordt gezegd dat Debian gebruikt maakt van run-parts, en https://manpages.debian.o...utils/run-parts.8.en.html zegt ...
If neither the --lsbsysinit option nor the --regex option is given then the names must consist entirely of ASCII upper- and lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens.
... dat er geen punt in de bestandsnaam mag voorkomen.

[ Voor 22% gewijzigd door MSteverink op 26-06-2017 13:16 ]


Acties:
  • 0 Henk 'm!

  • PhilipsFan
  • Registratie: Oktober 2003
  • Laatst online: 11:37
MSteverink schreef op maandag 26 juni 2017 @ 12:22:
Heeft het script een bestandsnaam met extensie? Debian, en Raspbian dus misschien ook, heeft daar problemen mee. De bestandsnaam mag geen extensie hebben.

In https://manpages.debian.o...down/interfaces.5.en.html wordt gezegd dat Debian gebruikt maakt van run-parts, en https://manpages.debian.o...utils/run-parts.8.en.html zegt ...


[...]

... dat er geen punt in de bestandsnaam mag voorkomen.
Interessant! Ik had een goed hoop dat dit het probleem was, want het script heeft inderdaad de extensie .sh. Maar helaas, het hernoemen van het script heeft het probleem niet opgelost.

Acties:
  • 0 Henk 'm!

  • Blokker_1999
  • Registratie: Februari 2003
  • Laatst online: 13:50

Blokker_1999

Full steam ahead

PhilipsFan schreef op maandag 26 juni 2017 @ 08:49:
[...]

Als je bedoelt dat er 'manual' staat, volgens mij slaat dat op de toewijzing van een IP-adres. Bij andere interfaces staat daar namelijk dhcp. Dat heb ik hier trouwens ook geprobeerd, maar ook dat maakt geen verschil. De interface doet het trouwens wel, alleen de dor mij bedoelde firewall regels worden niet actief.
Naast dhcp en manual heb je dan ook nog static. Bij een manual is het effectief de bedoeling dat je handmatig de interface up brengt, bijvoorbeeld omdat deze deel uitmaakt van een bond waarbij het de bond is die zijn interfaces zal meebrengen.

De belangrijkste vraag lijkt mij op dit moment dan ook: wat wil je exact doen? Post je volledige config en script eens.

No keyboard detected. Press F1 to continue.


Acties:
  • 0 Henk 'm!

  • PhilipsFan
  • Registratie: Oktober 2003
  • Laatst online: 11:37
Blokker_1999 schreef op maandag 26 juni 2017 @ 18:33:
[...]

Naast dhcp en manual heb je dan ook nog static. Bij een manual is het effectief de bedoeling dat je handmatig de interface up brengt, bijvoorbeeld omdat deze deel uitmaakt van een bond waarbij het de bond is die zijn interfaces zal meebrengen.

De belangrijkste vraag lijkt mij op dit moment dan ook: wat wil je exact doen? Post je volledige config en script eens.
Ik wil gewoon dat bij het opkomen van eth0 een paar iptables commando's worden uitgevoerd, die dus in dat script staan. Pre, post etc boeit eigenlijk helemaal niet, maar ik had het met een pre-up toevoeging en dat heeft altijd gewerkt in Wheezy. Ik heb exact dezelfde configuratie gemaakt in Jessie en dat werkt dus niet.

Dat de interface op manual staat komt vermoedelijk door Pihole. Maar zoals ik eerder zei, als ik daar dhcp neerzet (wat het oorspronkelijk was) dan werkt het ook niet.

interfaces:
code:
1
2
3
4
5
6
7
8
9
10
11
12
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual
    pre-up /etc/firewall-openvpn-rules

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf


En het betreffende script:
code:
1
2
3
4
5
#!/bin/sh
#

echo $(date)>>/var/log/ipt.log
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source x.x.x.x

Ondertussen ook al geprobeerd om er een bash script van te maken, maar dat maakt ook geen verschil.

[ Voor 3% gewijzigd door PhilipsFan op 26-06-2017 19:34 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Oh, wacht eens even. Je zit met iptables te rommelen op een systemd systeem. Wat dacht je ervan om dit gewoon in firewalld op te nemen als ruleset en op te slaan? Zit je helemaal niet meer te prutsen met scripts en whatnot.

Wil je echt bij iptables blijven, dan zet je dat in de configuratie van iptables en enable je de iptables service. Lees je wat meer in, in de firewall mogelijkheden van Linux.

Commandline FTW | Tweakt met mate

Pagina: 1