Einfaches routing / gateway – script mit device – autodetection

Hallo.

Habe gerade ein kleines Skript gebastelt, welches ich gerne verfügbar machen würde. Es erfordert, dass ‘iptables’ und ‘dnsmasq’ installiert sind.

Das Skript einfach speichern, ausführbar machen (chmod +x) und als root mit ‘./scriptname enable’ bzw. ‘./scriptname disable’ aufrufen.

Erstes Achtung:
Es wird die erste gefundene Verbindung mit dem Internet mit allen verfügbaren nicht mit dem Internet vebundenen Netzwerkgeräten geteilt.

Zweites Achtung:
Wird das Skript mit ‘disable’ gestartet, so wird der komplette iptables-Regelsatz gelöscht. Hier muss ggf. angepasst werden.

Hier das Skript:
[sourcecode language=”bash” gutter=”false”]
#!/bin/bash

[ $UID == 0 ] || { echo "Please become root"; return 1; }

get_first_wan_device()
{
### Alle geraete ausser ‘lo’ listen
DEVICELIST=`/sbin/ifconfig|grep -v ‘lo’| sed ‘/^[ t]./d’| awk ‘{print $1}’| sed ‘/^$/d’ | tr ‘n’ ‘ ‘`
### eine ip fuer verbindungstests nehmen, da domains
### bei nicht-erreichen lange timeout-zeiten haben
### wenn dns nicht funktioniert
TESTIP="193.189.244.205"
for i in $DEVICELIST
{
### erst nur verbindung testen, ohne dns
ping -c1 $TESTIP -I${i} -i1 -W1 > /dev/null 2>&1
CONNECTED=$?

### verbindung gefunden? entsprechendes geraet
### ausgeben fuer weitere benutzung
[ $CONNECTED == 0 ] && echo ${i}
[ $CONNECTED == 0 ] && return 1;
}
}

get_unconnected_devices()
{
### alle geraete ausser ‘lo’
DEVICELIST=`/sbin/ifconfig|grep -v ‘lo’| sed ‘/^[ t]./d’| awk ‘{print $1}’| sed ‘/^$/d’ | tr ‘n’ ‘ ‘`
TESTIP="193.189.244.205"
for i in $DEVICELIST
{
### testen ob auf dem gerät verbindung zum internet besteht
ping -c1 $TESTIP -I${i} -i1 -W1 > /dev/null 2>&1
CONNECTED=$?
### keine internetverbindung? geraet auf die liste der geraete setzen, fuer
### welche routing/masquerading gesetzt werden soll
[ $CONNECTED != 0 ] && echo -n "${i} "
}
}

enable_routing()
{
INDEV=`get_first_wan_device`
OUTDEVS=`get_unconnected_devices`

### abbrechen wenn keine entsprechenden geraete gefunden wurden
[ "${INDEV}x" != "x" ] || { echo "No connected device found!" ; return 1; }
[ "${OUTDEVS}x" != "x" ] || { echo "No unconnected devices found!" ; return 1; }

echo "Sharing connection on $INDEV to the devices connected to `echo $OUTDEVS| sed s/’ ‘/’ and ‘/g`";
echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo "1" > /proc/sys/net/ipv4/ip_forward

for OUTDEV in $OUTDEVS
do
{
/sbin/iptables -t nat -A POSTROUTING -o $INDEV -j MASQUERADE
/sbin/iptables -A FORWARD -i $INDEV -o $OUTDEV -m state –state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -i $OUTDEV -o $INDEV -j ACCEPT
}
done
/etc/init.d/dnsmasq start
}

disable_routing()
{
echo "1" > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "Flushing IP-Tables, Disable routing."
iptables -F
/etc/init.d/dnsmasq stop
}

case $1 in
‘enable’) enable_routing;;
‘disable’) disable_routing;;
*) echo "Unknown argument: use ‘enable’ or ‘disable’ ";;
esac
[/sourcecode]

0 thoughts on “Einfaches routing / gateway – script mit device – autodetection”

Leave a Reply

Your email address will not be published. Required fields are marked *