#!/bin/bash
## Instant WLAN Access-Point
## elektronenblitz63 ubuntuusers.de 2012
## published under GPL v3
##
## Version 1.6.0 vom 31.Januar 2012
# Bridged-Modus möglich
# kleinere Fehler beseitigt
# Ausgaben verbessert
#
## Version 1.5.2 vom 12.November 2011
# voreingestellte freie DNS geändert
# Restart des Network-Managers erst bei -stop
# entferne iptables-Filter bei -stop
##
## Beispielkonfiguration der dnsmasq.conf
##
# # DHCP-Server dnsmasq aktiv für Interface
#
# interface=wlan0
## DHCP-Server dnsmasq nicht aktiv für Interface
#
# no-dhcp-interface=eth0
# # IP-Adressbereich / Lease-Time
# dhcp-range=192.168.3.20,192.168.3.25,infinite
#
## Ende Beispielkonfiguration dnsmasq.conf
## freie Variablen
## Konfiguration der Ethernet-Schnittstelle
## LAN statisch (Standard ist automatisch über DHCP) / Startoption [-f]
laniface=wlan1
laddress=192.168.178.6
lbroadcast=192.168.178.255
lnetmask=255.255.255.0
lgateway=192.168.178.1
lmacaddress=00:12:79:c0:49:ae
#
## Konfiguration der WLAN-Schnittstelle
## WLAN statisch
wlaniface=wlan2
waddress=192.168.3.1
wbroadcast=192.168.3.255
wnetmask=255.255.255.0
iptablemask=192.168.0.0/24
### manuelle DNS (drei DNS Einträge, 1xDomain und 1xSearch sind möglich)
# Beispiel
# dns="nameserver 192.168.178.1 nameserver 192.168.178.1 nameserver 192.168.178.1 domain fritz.box search fritz.box"
dns="nameserver 8.8.4.4 nameserver 8.8.8.8 nameserver 213.73.91.35"
## dnsmasq-base Konfiguration
# DHCP-Adresspool umfasst x-Adressen
ipaddresses=10
# Basisadresse DHCP-Adresspool (WLAN-IP + X)
wlanbaseip=1
# Lease-Time
leasetime=infinite
## MAC-Adresse (optional) (Startoption [-m])
lmacaddress=00:12:79:c0:49:ae
## Pause vor LAN-Verbindungstest
pause=4
## Proxyserver (squid)
proxy="squid"
## Proxy Server auf Port x (squid 3128 / tinyproxy 3128 / polipo 8123)
proxyport=3128
## Bridge-Konfiguration
## vor Ubuntu 11.x - /usr/sbin/brctl
## ab Ubuntu 11.x - /sbin/brctl
br_util=/sbin/brctl
bridge0=br0
brdelay=5
brstp=0
## Steuerung Dienste
## alt
# hostapdrestart="/etc/init.d/hostapd"
## neu
hostapdservice="service hostapd"
## Ende freie Variablen
##
# Skript
#
pingout=""
## aut. Adressberechnung DHCP-Range für dnsmasq
## gemäß Vorgabe WLAN-Schnittstelle
ipaddresses=$[$ipaddresses+$wlanbaseip]
baseendaddr="`echo $waddress | tr -s . " " | awk {'print $4'}`"
basestartaddr="`echo $waddress | tr -s . " " | awk {'print $1,$2,$3'} | tr -s " " .`"
endaddr="$basestartaddr""."$[$startaddr+$ipaddresses]
startaddr="$basestartaddr""."$[$baseendaddr+$wlanbaseip]
pingout=""
A=1
B=0
D=0
P=0
Br=0
if [ "$1" = "-h" ]; then
echo Verwendung: instant_AP.sh [-start] [-restart] [-stop] [-D] [-d] [-f] [-m] [-h] [-B]
echo Syntax:
echo "sudo ./instant_AP.sh wie [-d] startet mit Standardparametern (DHCP)"
echo "sudo ./instant_AP.sh -f statische LAN-Konfiguration"
echo "sudo ./instant_AP.sh -f -m statische LAN-Konfiguration, MAC-Änderung"
echo "sudo ./instant_AP.sh -D verwendet dnsmasq.conf und nicht dnsmasq-base"
echo "sudo ./instant_AP.sh -start -f statische LAN-Konfiguration"
echo "sudo ./instant_AP.sh -restart -f statische LAN-Konfiguration"
echo "sudo ./instant_AP.sh -B Bridged-Modus ohne DHCP-Server. Dynamische und Statische Schnittstellenparameter werden ignoriert"
echo "sudo ./instant_AP.sh -stop beendet den AP"
echo "Ende"
exit
fi
while getopts ":DdfmhPB" OPTION ; do
case $OPTION in
D) echo "vewende dnsmasq.conf und nicht dnsmasq-base"; D=1;;
d) echo "konfiguriere LAN über DHCP"; A=1;;
f) echo "konfiguriere LAN statisch"; A=2;;
m) echo "MAC-Change LAN ein"; B=1;;
P) echo "Portumleitung für Proxy-Server Port" $proxyport "aktiviert"; P=1;;
B) echo "Bridge-Modus aktiviert"; Br=1;;
esac
done
echo "starte gewählte Konfiguration ..."
sleep 2
if [ "$Br" = "1" ]; then A=3
echo "Bridge-Mode aktiviert - Sonstige Parameter für Schnittstelleneinstellungen werden ignoriert"
fi
if [ "$1" != "-start" ]; then
echo "stoppe alle Dienste, und Verbindungen, lösche Itables-Filter ..."
# Konfiguration löschen
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
defgw="`route -n | grep UG | awk {'print $2'}`"
/sbin/route del default gw $defgw $laniface
echo '' | tee /etc/resolv.conf
$hostapdservice stop
/sbin/ifconfig $wlaniface down
sleep 1
/sbin/iwconfig $wlaniface mode managed
sleep 1
/sbin/ifconfig $laniface down
sleep 1
/usr/bin/killall dnsmasq
/sbin/sysctl -w net.ipv4.ip_forward=0
/sbin/modprobe -rfv iptable_nat ipt_MASQUERADE xt_conntrack iptable_filter
## Bridge löschen
/sbin/ifconfig $bridge0 down
sleep 1
$br_util delif $bridge0 $laniface
$br_util delif $bridge0 $wlaniface
$br_util delbr $bridge0
if [ "$1" = "-stop" ]; then
echo
echo "reaktiviere Network-Manager."
service network-manager start
service network-manager restart
echo "WLAN Access-Point Konfiguration beendet."
exit
fi
fi
## MAC-Adresse abgleichen
if [ "$B" = "1" ]; then
currentmac="`ifconfig $laniface | grep Adresse | awk {'print $6'}`"
echo Schnittstelle $laniface, MAC-Adresse: $currentmac
echo Vorgabe: $lmacaddress
if [ "$currentmac" = "$lmacaddress" ]; then
echo Ãœbereinstimmende MAC-Adresse
else
/sbin/ifconfig $laniface down
/sbin/ip link set dev $laniface addr $lmacaddress
currentmac="`ifconfig $laniface | grep Adresse | awk {'print $6'}`"
echo versuche MAC-Adresse zu ändern ...
echo Schnittstelle $laniface, MAC-Adresse: $currentmac
if [ "$currentmac" = "$lmacaddress" ]; then
echo Änderung der MAC-Adresse erfolgreich!
else
echo Änderung der MAC-Adresse nicht erfolgreich!
echo fahre fort ...
fi
fi
fi
# Grundkonfiguration
echo beende Network-Manager
service network-manager stop
echo "starte alle Dienste, und Verbindungen ..."
# LAN aut.m über DHCP nur wenn kein Bridged-Mode gewählt
if [ "$Br" = "0" ] & [ "$A" = "1" ]; then
echo "starte automatische LAN-Verbindung ..."
/sbin/dhclient $laniface
fi
# LAN statisch nur wenn kein Bridged-Mode gewählt
if [ "$Br" = "0" ] & [ "$A" = "2" ]; then
echo "starte statische LAN-konfiguration ..."
/sbin/ifconfig $laniface down
sleep 2
/sbin/ifconfig $laniface $laddress broadcast $lbroadcast netmask $lnetmask
sleep 2
echo
echo setze Gateway und Route ...
/sbin/route add default gw $lgateway $laniface
sleep 1
echo
echo setze DNS
echo '# erzeugt durch instant_AdHoc.sh' | tee /etc/resolv.conf
echo $dns | awk {'print $1,$2'} | tee -a /etc/resolv.conf
echo $dns | awk {'print $3,$4'} | tee -a /etc/resolv.conf
echo $dns | awk {'print $5,$6'} | tee -a /etc/resolv.conf
echo $dns | awk {'print $7,$8'} | tee -a /etc/resolv.conf
echo $dns | awk {'print $9,$10'} | tee -a /etc/resolv.conf
fi
sleep $pause
## Vorbereitung Bridge
if [ "$Br" = "1" ]; then
## vorhandene Schnittstellenkonfiguration löschen
/sbin/ifconfig $wlaniface down
sleep 1
/sbin/ifconfig $wlaniface up
sleep 1
/sbin/ifconfig $wlaniface 0.0.0.0
sleep 1
/sbin/ifconfig $laniface down
sleep 1
/sbin/ifconfig $laniface up
sleep 1
## Bridge anlegen
$br_util addbr $bridge0
$br_util addif $bridge0 $laniface
$br_util stp $bridge0 $brstp
$br_util setfd $bridge0 $brdelay
sleep 2
## Dienste steuern
service dnsmasq stop
echo "fordere IP-Adresse für Bridge an ..."
/sbin/dhclient $bridge0
$hostapdservice restart
$br_util addif $bridge0 $wlaniface
else
## ohne Bridge-Mode
## WLAN-Schnittstelle statisch konfigurieren
echo "WLAN-Schnittstelle initialisieren ..."
/sbin/ifconfig $laniface up
sleep 1
/sbin/ifconfig $wlaniface $waddress broadcast $wbroadcast netmask $wnetmask
$hostapdservice restart
echo
echo "starte IP-Forward, Masquerading und NAT"
/sbin/iptables -A FORWARD -o $laniface -i $wlaniface -s $iptablemask -m conntrack --ctstate NEW -j ACCEPT
/sbin/iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o $laniface -j MASQUERADE
/sbin/sysctl -w net.ipv4.ip_forward=1
fi
## dnsmasq-base starten
echo
echo starte dnsmasq-base
if [ "$D" = "0" ]; then
echo DHCP-Range dnsmasq-base - Startadresse: $startaddr Endadresse: $endaddr
/usr/sbin/dnsmasq -i $wlaniface -I $laniface -F $startaddr,$endaddr,$leasetime
echo
else
## dnsmasq neu starten
echo "verwende dnsmasq.conf"
/etc/init.d/dnsmasq restart
echo fertig ...
fi
## Portumleitung für Squid Proxyserver
if [ "$P" = "1" ]; then
/sbin/iptables -t nat -A PREROUTING -i $wlaniface -p tcp --dport 80 -j REDIRECT --to-port $proxyport
## optional Port 443 HTTPS
# /sbin/iptables -t nat -A PREROUTING -i $wlaniface -p tcp --dport 443 -j REDIRECT --to-port $proxyport
echo "Port 80 (HTTP) " $wlaniface "auf Port $proxyport umgeleitet ("$proxy "Proxyserver)"
echo "Starte" $proxy "Proxyserver ..."
sleep 2
if [ "$proxy" != "squid" ]; then
/etc/init.d/$proxy restart
else
service squid start -n
fi
fi
## Ausgabe der aktuellen Konfiguration
echo "DNS-Konfiguration"
cat /etc/resolv.conf
echo
/sbin/route -n
echo
if [ "$Br" = "1" ]; then
echo "Konfiguration Bridge:"
$br_util show
echo
/sbin/ifconfig $bridge0 | egrep 'Link|inet Adresse'
echo
fi
echo "Konfiguration LAN:"
/sbin/ifconfig $laniface | egrep 'Link|inet Adresse'
echo
echo "Konfiguration WLAN:"
/sbin/ifconfig $wlaniface | egrep 'Link|inet Adresse'
echo
/sbin/iwconfig $wlaniface | egrep 'IEEE|Power|Mode'
echo
/sbin/iwconfig mon.$wlaniface
exit 0