1:1 NAT brauche Hilfe bei der Erstellung eines Shellscripts

L

LA_FORGE

Grünschnabel
Hi,

ich brauche Hilfe bei der Erstellung eines Shellskripts, was nach OpenVPN Neueinwahl die Datei /var/db/opt1_ip parst (in dieser Datei steht nichts anderes drin als nur die IP) und diese neue IP dann in den Firewallregeln von FreeBSD ändert in einer vorhandenen Datei ändert, und zwar den String

binat on openvpn from 10.130.201.24 to any -> <An die Stelle muss die neue IP hin>

in der Datei /tmp/rules.debug

Über Hilfe würde ich mich sehr freuen, kann leider kein Shellskript und auch überhaupt nicht programmieren :-(

Vielen Dank im Voraus

Stefan
 
Zuletzt bearbeitet:
Hallo LA_FORGE,

ich hab mal ein wenig probiert und auf meinem Linux-System funkioniert es:

Code:
#!/bin/bash
#

# IP-Adresse auslesen

ip="`grep "." /var/db/opt1_ip`"
echo $ip


# temporäre Datei anlegen und berichtigen

search="binat on openvpn from 10.130.201.24 to any "
grep -v "binat on openvpn from 10.130.201.24 to any" /tmp/rules.debug > /tmp/rules.debug.tmp

echo $search $ip >> /tmp/rules.debug.tmp


# wenn alles OK - dann Kommentarzeichen vor mv entfernen

# mv /tmp/rules.debug.tmp /tmp/rules.debug

exit 0

In einen Editor kopieren und z.B. als firewall.sh abspeichern, mit 'chmod +x' ausführbar machen und mit 'sh firewall.sh' ausführen. Wenn die Datei '/tmp/rules.debug.tmp' deinen Vorstellungen entspricht, dann im Script das Kommentarzeichen vor 'mv' entfernen.

Gruss underliner


@ sinn3r
Hast ja Recht, hab es schon berichtigt
 
Zuletzt bearbeitet:
WOW super klasse vielen herzlichen Dank!!
 
Hallo LA_FORGE,

erst einmal willkommen im Forum, und vielen Dank für deine Rückmeldung, 'WOW super klasse', dieser Äußerung entnehme ich, dass es geklappt hat und das ist schön zu wissen.

Gruss underliner
 
mit chmod 777 ausführbar machen
Pfui. Pfui. Pfui.

Mit 'chmod +x' machst du dein Skript ausführbar. Alles andere ist fahrlässig. Zumal es gar nicht ausführbar sein muss, wenn du es zum interpretieren eh nur an eine Shell ('sh foo') übergibst.

Ein Skript von allem und jedem les- und schreibbar zu machen, dass dazu noch vermutlich root-Rechten (oder zumindest ziemlich weitreichenden) ausgeführt wird... merkst du es von alleine?
 
Hallo LA_FORGE,

erst einmal willkommen im Forum, und vielen Dank für deine Rückmeldung, 'WOW super klasse', dieser Äußerung entnehme ich, dass es geklappt hat und das ist schön zu wissen.

Gruss underliner

Ja, geklappt hat's einwandfrei mit deinem Script. Allerdings ist FreeBSD für mich noch Neuland an der stelle, sorry, ich habe leider eine falsche Stelle genannt wo die IP ausgetauscht werden muss :-(

Sie muss nicht in /tmp/rules.debug in dem String "binat on openvpn from 10.130.201.24 to any " geändert werden, sondern in

Code:
/cf/conf/config.xml:			<external>10.17.0.30</external>
und
/conf/config.xml:		        	<external>10.17.0.30</external>

Die Quelle, wo die neue IP drin steht bleibt aber gleich ( /var/db/opt1_ip ) sie muss dann lediglich in den 2 Files oben zwischen dem Tag <external></external> überschrieben/ersetzt werden. Kannst du mir bitte noch so ein tolles Script basteln?

Es tut mir leid, dass ich erst eine falsche Angabe gemacht habe, aber ich komme ursprünglich auch aus der Linux-Welt und iptables unterscheidet sich doch etwas mit dem Packetfilter von FreeBSD :-)

Vielen Dank im Voraus

Stefan
 
So LA_FORGE,

ich habe das Script mal modifiziert:
Code:
#!/bin/bash
#

# IP-Adresse auslesen

ip="`grep "." /var/db/opt1_ip`"
echo $ip


# temporäre Datei anlegen und berichtigen

grep -v "<external>" /cf/conf/config.xml > /cf/conf/config.xml.tmp
grep -v "<external>" /conf/config.xml > /conf/config.xml.tmp

echo "<external>"$ip"</external>" >> /cf/conf/config.xml.tmp
echo "<external>"$ip"</external>" >> /conf/config.xml.tmp


# wenn alles OK - dann Kommentarzeichen vor mv entfernen

# mv /cf/conf/config.xml.tmp /cf/conf/config.xml
# mv /conf/config.xml.tmp /conf/config.xml

exit 0

Falls noch Leerzeichen vor "<external>" benötigt werden, dann am Besten selbst innerhalb der Anführungszeichen einfügen.

Gruss underliner
 
hm mit dem neuen Script wird die Zeile mit der alten IP zwar gelöscht und die neue IP eingefügt, aber die Zeile steht dann ganz am Ende der XML-Datenstruktur, sie müsste aber

Code:
          <onetoone>
                        <external>10.17.0.23</external>
                        <descr><![CDATA[Masquerading]]></descr>
                        <interface>opt1</interface>
                        <source>
                                <address>10.130.201.24</address>
                        </source>
                        <destination>
                                <any/>
                        </destination>
                        <natreflection>enable</natreflection>
                </onetoone>

zwischen den Tags <onetoone> und <descr> hin, damit's funktioniert.
 
Hallo Stefan,

da hab ich jetzt auch ein wenig fummeln müssen, aber man wächst ja an den Aufgaben:

Code:
#!/bin/bash
#

# IP-Adresse auslesen

ip="`grep "." /var/db/opt1_ip`"
echo $ip


# temporäre Datei anlegen und berichtigen

cp /cf/conf/config.xml /cf/conf/config.xml.tmp
cp /conf/config.xml /conf/config.xml.tmp

sed -i 's/<external>\([0-9]\{1,3\}\.\)\{3,\}[0-9]\{1,3\}/<external>'"$ip"'/' /cf/conf/config.xml.tmp
sed -i 's/<external>\([0-9]\{1,3\}\.\)\{3,\}[0-9]\{1,3\}/<external>'"$ip"'/' /conf/config.xml.tmp


# wenn alles OK - dann Kommentarzeichen vor mv entfernen

# mv /cf/conf/config.xml.tmp /cf/conf/config.xml
# mv /conf/config.xml.tmp /conf/config.xml

exit 0

da wollen wir mal hoffen, das es jetzt funzt.

Gruss underliner
 
Zuletzt bearbeitet:
Vielen Dank.

Jetzt kommt die Meldung

Code:
sed: 1: "/cf/conf/config.xml.tmp": command c expects \ followed by text
sed: 1: "/conf/config.xml.tmp": command c expects \ followed by text
 
Hallo Stefan,

dass wird am Unterschied zwischen GNU-sed und BSD-sed liegen.

Hier mal eine Variante ohne Schalter:

Code:
#!/bin/bash
#

# IP-Adresse auslesen

ip="`grep "." /var/db/opt1_ip`"
echo $ip


# temporäre Datei anlegen und berichtigen

sed 's/<external>\([0-9]\{1,3\}\.\)\{3,\}[0-9]\{1,3\}/<external>'"$ip"'/' /cf/conf/config.xml > /cf//conf/config.xml.tmp
sed 's/<external>\([0-9]\{1,3\}\.\)\{3,\}[0-9]\{1,3\}/<external>'"$ip"'/' /conf/config.xml > /conf/config.xml.tmp


# wenn alles OK - dann Kommentarzeichen vor mv entfernen

# mv /cf/conf/config.xml.tmp /cf/conf/config.xml
# mv /conf/config.xml.tmp /conf/config.xml

exit 0


Gruss underliner
 
Das ist mega genial was du da gebastelt hast!!!! Jetzt funzt es! Vielen herzlichen DANK!!
 

Ähnliche Themen

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Zurück
Oben