• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Eigenes Script mit Suse 11.3 starten lassen

gTux

Member
Hallo, ich habe ein kurzes Script geschrieben und möchte, daß es automatisch mit Linux startet. Ich habe mit

Code:
ln -s /home/gTux/fwRulesAdd.sh /h /etc/init.d/rc3.d/S12fwRulesAdd

versucht, aber das klappt nicht er will nicht starten. Was kann man da tun? Ich kannte das mit den Link noch von Suse 10.2, aber jetzt hat sich soviel verändert, daß ich nicht mehr klar komme.

Mein Script erstellt eigentlich nur eine Regel für iptables:
Code:
#!/bin/sh

iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j SNAT --to 10.20.30.400
 

lOtz1009

Moderator
Teammitglied
insserv dürfte dich weiterbringen.
Aber kann man die Regel nicht über die Konfiguration der Firewall steuern?
 

josef-wien

Ultimate Guru
Erstens brauchst Du ein korrektes Init-Skript, schließlich müssen Abhängigkeiten berücksichtigt werden, zweitens ist eine Eintragung an passender Stelle in /etc/sysconfig/scripts/SuSEfirewall2-custom (plus "Aktivierung" in /etc/sysconfig/SuSEfirewall2) die bessere Lösung.
 
OP
G

gTux

Member
Ääh, das ist es ja gerade - mit SuSEfirewall2 komme ich nicht klar. Auch nicht unbedingt mir Yast. Eigentlich allgemein iptables ist für mich ziemlich komplex, da brauch ich wohl noch paar Jahre wenn nicht Jahrzehnte :D

Funktioniert das mit den Links jetzt garnicht mehr?
 
OP
G

gTux

Member
Ok, ich weiß nicht ob ich das richtig gemacht habe - insserv ist mir unbekannt bisher gewesen.

Ich habe mein Script nach /etc/init.d/ kopiert.

Dann habe ich folgendes Befehl ausgeführt und bekam folgende Ausgabe:
Code:
insserv -v /etc/init.d/fwRulesAdd.sh,start=3
insserv: warning: script 'fwRulesAdd.sh' missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `fwRulesAdd.sh'
insserv: remove service /etc/init.d/rc2.d/K01stoppreload
insserv: enable service ../stoppreload -> /etc/init.d/rc2.d/K02stoppreload
insserv: remove service /etc/init.d/rc3.d/K01stoppreload
insserv: enable service ../stoppreload -> /etc/init.d/rc3.d/K02stoppreload
insserv: enable service ../fwRulesAdd.sh -> /etc/init.d/rc3.d/S01fwRulesAdd.sh
insserv: enable service ../fwRulesAdd.sh -> /etc/init.d/rc3.d/K01fwRulesAdd.sh
insserv: remove service /etc/init.d/rc5.d/K01stoppreload
insserv: enable service ../stoppreload -> /etc/init.d/rc5.d/K02stoppreload
insserv: creating .depend.boot
insserv: creating .depend.start
insserv: creating .depend.halt
insserv: creating .depend.stop

Ist das richtig so gelaufen oder habe ich was kaputt gemacht? Die ganzen Ausgaben sagen mir leider wenig; anscheind wird aber auch ein Service irgendwo entfernt, nämlich "K01stoppreload".

Nachtrag - es funktioniert also nicht, ich habe feststellen müssen, daß sich die Ports nicht öffnen, also startet das Script nicht. Kann mir bitte jemand die korrekte Vorgehensweise ein für alle mal als Beispiel zeigen?
 

framp

Moderator
Teammitglied
Ich stelle meine zusätzlichen iptables Regeln immer in /etc/syconfig/scripts/SuSEfirewall2-custom und unkommentiere in /etc/sysconfig/SuSEfirewall2 die Zeile
Code:
#FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"
Wenn Du da
Code:
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j SNAT --to 10.20.30.400
reinbringst - vermutlich in
Code:
fw_custom_before_denyall() { # could also be named "after_forwardmasq()"
    # these are the rules to be loaded after IP forwarding and masquerading
    # but before the logging and deny all section is set by SuSEfirewall2.
    # You can use this hook to prevent the logging of annoying packets.

#example: prevent logging of talk requests from anywhere
#for chain in input_ext input_dmz input_int forward_int forward_ext forward_dmz; do
=======>>>> hier die Regel #    iptables -A $chain -j DROP -p udp --dport 517:518
#done
solltest Du Dein gewünschtes Ergebnis erhalten können.
 

josef-wien

Ultimate Guru
gTux schrieb:
Ist das richtig so gelaufen oder habe ich was kaputt gemacht?
Beide Fragen sind mit "nein" zu beantworten. Du solltest Dein formal falsches Init-Skript mit
Code:
insserv -r fwRulesAdd.sh
wieder entfernen. Wie man ein Init-Skript richtig erstellt, kannst Du unter http://www.linupedia.org/opensuse/Runlevel_scripte_-_Scripts_selbst_erstellen und /etc/init.d/skeleton nachlesen.

gTux schrieb:
Eigentlich allgemein iptables ist für mich ziemlich komplex, da brauch ich wohl noch paar Jahre wenn nicht Jahrzehnte
Du solltest Dich aber damit beschäftigen, schließlich muß Dein Befehl an die richtige Stelle kommen (und daher ist ein Init-Skript keine besonders geeignete Lösung). Und in den Grundzügen solltest Du die Ausgabe von iptables-save wohl verstehen.
 
OP
G

gTux

Member
josef-wien schrieb:
Du solltest Dein formal falsches Init-Skript mit
Code:
insserv -r fwRulesAdd.sh
wieder entfernen.

Habs gemacht. Dann kommt sowas:
Code:
insserv -r fwRulesAdd.sh
insserv: warning: script 'K01fwRulesAdd.sh' missing LSB tags and overrides
insserv: warning: script 'fwRulesAdd.sh' missing LSB tags and overrides

Ich habe in yast unter System/Runlevel geschaut. Dort ist das Script aufgeführt, lässt sich aber nicht auf Enable setzen und zudem steht da ein "No*" unter "Enabled". Wenn ich versuche das Script auf "Enable" zu setzen dann kommt ein Popup:

/etc/init.d/fwRulesAdd.sh start returned 0 (success):

Was meinst Du bitte mit "formal falsch" ? Doch nicht etwa diese auskommentierten Zeilen?
Code:
### BEGIN INIT INFO 
# Provides: named 
# Required-Start: $network $remote_fs $syslog 
# Required-Stop: 
# Default-Start: 3 5 
# Default-Stop: 
# Description: Starts internet domain name server (DNS) BIND 9 
### END INIT INFO

Die sind doch eher funktionslos? Naja, ich habe sie eingefügt, aber über Yast krieg ich das ding sowieso nicht gestartet.
 
OP
G

gTux

Member
Ich habe den verlinkten tutorial für die Runlevel scripte abgearbeitet. Fast alles klappte, ich kann mit
Code:
rcfwRulesAdd start
den Start vollziehen.

Allerdings existiert der Befehl "rc_status" nicht und ich konnte ihn nicht installieren -> "yast -i rc_status"

Und natürlich startet mein Script nicht.

Das script sieht jetzt so aus:
Code:
#!/bin/bash
### BEGIN INIT INFO
# Provides: iptables
# Required-Start: $network $iptables $syslog
# Required-Stop:
# Default-Start: 3
# Default-Stop:
# Description: opens the iptables firewall for VPN
### END INIT INFO

sleep 6;
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j SNAT --to 10.20.30.400

echo "Firewall geoeffnet";

#exit;

Ich habe schon die Verzögerung sogar auf 25 Sekunden vergrößert - das hat aber nichts genutzt. :-(
 
OP
G

gTux

Member
Ich habe das jetzt auch so gemacht, wie framp oben beschrieben hat. Die Regeln in die SuSEfirewall2-custom eingetragen und natürlich freigeschaltet. Die Firewall startet automatisch - über Yast aktiviert.

Passiert genau das gleiche - die FW wird nicht geöffnet. Erst wenn ich mein Script im nachhinein "per Hand" starte, wird die FW geöffnet ?!
 

josef-wien

Ultimate Guru
Da Du jetzt den richtigen Weg gehst, brauche ich auf die Fehler und auf die Problematik des Init-Skripts nicht mehr einzugehen. Schau Dir einmal vor Durchführung des Skripts das Ergebnis von
Code:
iptables-save
an bzw. gib es hier bekannt.
 

framp

Moderator
Teammitglied
gTux schrieb:
Ich habe das jetzt auch so gemacht, wie framp oben beschrieben hat. Die Regeln in die SuSEfirewall2-custom eingetragen und natürlich freigeschaltet. Die Firewall startet automatisch - über Yast aktiviert.

Passiert genau das gleiche - die FW wird nicht geöffnet. Erst wenn ich mein Script im nachhinein "per Hand" starte, wird die FW geöffnet ?!
#FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"
Hast Du in dieser Zeile auch das # entfernt?
 
OP
G

gTux

Member
@ framp
Natürlich habe ich es.

@ josef-wien
Hier ist die Ausgabe:
Code:
iptables-save
# Generated by iptables-save v1.4.8 on Thu Oct 21 00:35:18 2010
*nat
:PREROUTING ACCEPT [2:140]
:OUTPUT ACCEPT [17:1194]
:POSTROUTING ACCEPT [17:1194]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 10.20.30.400
COMMIT
# Completed on Thu Oct 21 00:35:18 2010
# Generated by iptables-save v1.4.8 on Thu Oct 21 00:35:18 2010
*raw
:PREROUTING ACCEPT [97:10695]
:OUTPUT ACCEPT [89:17962]
-A PREROUTING -i lo -j NOTRACK
-A OUTPUT -o lo -j NOTRACK
COMMIT
# Completed on Thu Oct 21 00:35:18 2010
# Generated by iptables-save v1.4.8 on Thu Oct 21 00:35:18 2010
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:forward_ext - [0:0]
:input_ext - [0:0]
:reject_func - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m state --state RELATED -j ACCEPT
-A INPUT -i eth0 -j input_ext
-A INPUT -i tun0 -j input_ext
-A INPUT -j input_ext
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "SFW2-IN-ILL-TARGET " --log-tcp-options --log-ip-options
-A INPUT -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -i eth0 -j forward_ext
-A FORWARD -i tun0 -j forward_ext
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "SFW2-FWD-ILL-ROUTING " --log-tcp-options --log-ip-options
-A FORWARD -j DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "SFW2-OUT-ERROR " --log-tcp-options --log-ip-options
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 0 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 3 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 11 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 12 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 14 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 18 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 3/2 -j ACCEPT
-A forward_ext -p icmp -m state --state RELATED,ESTABLISHED -m icmp --icmp-type 5 -j ACCEPT
-A forward_ext -m pkttype --pkt-type multicast -j DROP
-A forward_ext -m pkttype --pkt-type broadcast -j DROP
-A forward_ext -p tcp -m limit --limit 3/min -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-FWDext-DROP-DEFLT " --log-tcp-options --log-ip-options
-A forward_ext -p icmp -m limit --limit 3/min -j LOG --log-prefix "SFW2-FWDext-DROP-DEFLT " --log-tcp-options --log-ip-options
-A forward_ext -p udp -m limit --limit 3/min -m state --state NEW -j LOG --log-prefix "SFW2-FWDext-DROP-DEFLT " --log-tcp-options --log-ip-options
-A forward_ext -j DROP
-A input_ext -m pkttype --pkt-type broadcast -j DROP
-A input_ext -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A input_ext -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 1194 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-ACC-TCP " --log-tcp-options --log-ip-options
-A input_ext -p tcp -m tcp --dport 1194 -j ACCEPT
-A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-ACC-TCP " --log-tcp-options --log-ip-options
-A input_ext -p tcp -m tcp --dport 22 -j ACCEPT
-A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 21 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-ACC-TCP " --log-tcp-options --log-ip-options
-A input_ext -p tcp -m tcp --dport 21 -j ACCEPT
-A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 30000:30100 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-ACC-TCP " --log-tcp-options --log-ip-options
-A input_ext -p tcp -m tcp --dport 30000:30100 -j ACCEPT
-A input_ext -p udp -m udp --dport 1194 -j ACCEPT
-A input_ext -s 10.8.0.0/24 -p tcp -m tcp --sport 1194 --dport 1194 -m state --state NEW -m limit --limit 3/min -j LOG --log-prefix "SFW2-INext-ACC " --log-tcp-options --log-ip-options
-A input_ext -s 10.8.0.0/24 -p tcp -m tcp --sport 1194 --dport 1194 -j ACCEPT
-A input_ext -s 10.8.0.0/24 -p udp -m udp --sport 1194 --dport 1194 -m state --state NEW -m limit --limit 3/min -j LOG --log-prefix "SFW2-INext-ACC " --log-tcp-options --log-ip-options
-A input_ext -s 10.8.0.0/24 -p udp -m udp --sport 1194 --dport 1194 -j ACCEPT
-A input_ext -m pkttype --pkt-type multicast -j DROP
-A input_ext -m pkttype --pkt-type broadcast -j DROP
-A input_ext -p tcp -m limit --limit 3/min -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-DROP-DEFLT " --log-tcp-options --log-ip-options
-A input_ext -p icmp -m limit --limit 3/min -j LOG --log-prefix "SFW2-INext-DROP-DEFLT " --log-tcp-options --log-ip-options
-A input_ext -p udp -m limit --limit 3/min -m state --state NEW -j LOG --log-prefix "SFW2-INext-DROP-DEFLT " --log-tcp-options --log-ip-options
-A input_ext -j DROP
-A reject_func -p tcp -j REJECT --reject-with tcp-reset
-A reject_func -p udp -j REJECT --reject-with icmp-port-unreachable
-A reject_func -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Thu Oct 21 00:35:18 2010

Mir sagt das jedoch leider garnichts.

Interessanterweise habe ich gerade festgestellt, daß ich mich geirrt habe. Die Firewall war AUS. Wenn die firewall AN ist, dann hilft noch nichtmal das manuelle starten des Scripts !? Nur wenn die SuSEfirewall2 AUS ist, kann ich mit dem Script manuell die Ports öffnen.
 

josef-wien

Ultimate Guru
Mit deinem iptables-Befehl veranlaßt Du eine Source Network Address Translation. Wenn die Firewall nicht läuft, ist nichts da, um die Pakete zu prüfen. Ist die Firewall aber aktiviert, dann werden die Pakete gefiltert (die Merkmale der erlaubten eingehenden Pakete sind in den Zeilen -A INPUT und -A input_ext mit -j ACCEPT definiert). Also brauchst Du eine Filter-Regel, um die gewünschten Pakete zu akzeptieren, aber da müssen Dir für eine sichere Definition Berufenere zur Hand gehen.

P. S. Dieses Thema gehört zu http://www.linux-club.de/viewforum.php?f=15.
 

framp

Moderator
Teammitglied
gTux schrieb:
@ framp
Natürlich habe ich es.
Dann füge mal in die Custom Datei ein
Code:
logger -t test "IPTABLES CUSTOM CALLED"
Dann
Code:
network restart
Und dann
Code:
grep -i test: /var/log/messages
Wenn da nichts kommt wird das Custom Script nicht gecalled (Deshalb meine Frage nach dem # ;) )
Wenn da was kommt mal
Code:
iptables -L | grep -i <irgendeinString aus Deinem iptables Befehl>
eingeben um zu testen on die Rule aktiv ist.
 

josef-wien

Ultimate Guru
framp schrieb:
um zu testen on die Rule aktiv ist.
Da komme ich jetzt nicht mit. Nachdem in der 6. Zeile der Ausgabe von iptables-save
Code:
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 10.20.30.400
(über die nicht hilfreiche unmögliche Adresse sehe ich hinweg) steht, muß sie es doch sein.
 

framp

Moderator
Teammitglied
josef-wien schrieb:
framp schrieb:
um zu testen on die Rule aktiv ist.
Da komme ich jetzt nicht mit. Nachdem in der 6. Zeile der Ausgabe von iptables-save
Code:
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 10.20.30.400
(über die nicht hilfreiche unmögliche Adresse sehe ich hinweg) steht, muß sie es doch sein.
Jupp - Du hast Recht :eek:ps:
 
OP
G

gTux

Member
Hi framp,

ne da kommt tatsächlich folgendes:
Code:
grep -i test: /var/log/messages
Oct 22 06:20:33 suse1 test: IPTABLES CUSTOM CALLED
Oct 22 06:21:50 suse1 test: IPTABLES CUSTOM CALLED

Dazu habe ich die Firewall auf automatischen Start gestellt und das System neugestartet. "Iptables -L" gibt auch Regeln aus, was der Beweis für den Betrieb ist.

Interessanterweise passiert auch folgendes. Wenn ich die FW einschalte und sie dann ausschalte, dann bringt die Regel auch nichts - die Verbindung bleibt zu. Erst wenn ich - nachdem die FW kurz an war - den Server neustarte ohne, daß die FW aktiv wird, dann kann ich mein Script starten und die Regel ausführen. Dann funktioniert das ganze.

@ josef-wien
In dem Forum bin ich doch gerade. Ich habe das mit der Regel von hier:
http://wiki.openvpn.eu/index.php/Konfiguration_eines_Internetgateways

Steht unter "Forwarding und NAT".
 

josef-wien

Ultimate Guru
Noch einmal langsam zum Mitdenken: Mit Deinem Befehl führst Du ausschließlich eine Adreßübersetzung durch. Mit Deinem Befehl wird nichts erlaubt. Wenn die Firewall nicht läuft, ist alles erlaubt. Daher brauchst Du noch eine Filterregel, die genau das erlaubt, was aus Deiner Sicht hereinkommen darf.

gTux schrieb:
In dem Forum bin ich doch gerade.
Nein, das hier ist das Forum "Konsole".
 
Oben