Wifi repeater/range extender script

Updated September 17, 2014 : updated, improved and should be working! (Use at your own risk!). Thanks to AL for pointing errors!

#!/bin/bash
#
# Wireless Repeater/Range extender script
#
# Last changes:
#   - 20/Apr/2014 : added ad filtering (uses an additional hosts file)
#   - 12/Apr/2013 : adapted for Debian (tested under 7.0 Wheezy)
#
# https://agentoss.wordpress.com
#
# thanks to : http://www.aerospacesoftware.com/howtos/Laptop-NAT-Howto.html (link dead now)
#
# hardware requirements : 2 wireless NICs
# software requirements : iptables, wpa_supplicant, hostapd, dnsmasq, dhcpcd (or dhclient)
#
# This is a standalone script, it will not use your existing configuration files
# (wpa_supplicant/hostapd)
#
# Both wireless interfaces will use WPA/WPA2 encryption.
#
# BEFORE STARTING THIS SCRIPT :
# - you must have root rights
# - stop your wireless connection manager (networkmanager, wicd, etc...)
# - disable your firewall
# - disable power management (prevent the computer to go into suspend mode when unused)
#
# This script has been tested on OpenSUSE 12.2, Debian 7.0
# but should work on other Linux systems with minor adaptations.
#
# USE AT YOUR OWN RISK!
#
# TODO : repeater with 1 wireless NIC + 1 ethernet NIC

# this is the wireless interface we use to connect to our existing Access Point
WLAN_STA="wlan0"

# enter here your existing SSID and WPA passphrase
WLAN_STA_SSID="YOUR_EXISTING_SSID"
WLAN_STA_PASSPHRASE="your$existing$passphrase"

# this is the wireless interface we use to create our new AP (the "repeater" AP)
WLAN_AP="wlan1"

# your new AP's SSID (change the name eventually)
WLAN_AP_SSID="REPEAT_$WLAN_STA_SSID"
# Be sure to use different channels for the 2 AP's for best performance
WLAN_AP_CHANNEL=3
WLAN_AP_IP="192.168.9.1"
WLAN_AP_DHCP_RANGE="192.168.9.10,192.168.9.20"
# we can use the same passphrase (or not)
WLAN_AP_PASSPHRASE=$WLAN_STA_PASSPHRASE

# temp files (will contain passphrases in clear text, so make sure they are not world readable)
HOSTAP_TEMP_CONF="/root/hostap_temp.conf"
WPASUPPLICANT_TEMP_CONF="/root/wpasupplicant_temp.conf"

# URL and filename to download for the ad filter hosts file
# Thanks to winhelp2002.mvps.org
# just comment the two variables if you don't want to use ad filtering
HOSTS_FILE="hosts.zip"
HOSTS_URL="http://winhelp2002.mvps.org/$HOSTS_FILE"

# log file for dnsmasq
DNSMASQ_LOG="/root/dnsmasq.log"

# Path for used commands (adapt to your system)
#DHCPCD="/sbin/dhcpcd"
#for Debian we use dhclient (installed by default)
DHCPCD=$(which dhclient)
HOSTAPD=$(which hostapd)
WPASUPPLICANT=$(which wpa_supplicant)
DNSMASQ=$(which dnsmasq)
IPTABLES=$(which iptables)

PIDFILE="/var/run/repeater.pid"
IPTABLES_SAVE_FILE="/root/iptables.save"

USAGE="Usage : `basename $0` \
\n\nWireless repeater/extender script."

MSG_STOP="Repeater has been stopped."

# sub-routines
show_notification()
{
 xmessage -center -timeout $2 "$1"
}

# Main program
if [[ "$#" -ne 1 || "$1" == "help" ]]; then
 # show program help
 echo -e "$USAGE"
 exit 0
fi

# check if we are root
if [ $EUID -ne 0 ]; then
   echo `basename $0` ": this script must be run as root!" 1>&2
   exit 1
fi
# check for software we need
if [ ! -x $DHCPCD ]; then
 echo "FATAL: $DHCPCD not found!"; exit 1
fi
if [ ! -x $HOSTAPD ]; then
 echo "FATAL: $HOSTAPD not found!"; exit 1
fi
if [ ! -x $WPASUPPLICANT ]; then
 echo "FATAL: $WPASUPPLICANT not found!"; exit 1
fi
if [ ! -x $DNSMASQ ]; then
 echo "FATAL: $DNSMASQ not found!"; exit 1
fi
if [ ! -x $IPTABLES ]; then
 echo "FATAL: $IPTABLES not found!"; exit 1
fi
# check for wireless interfaces
ifconfig $WLAN_STA 1>&2>/dev/null
if [[ $? -ne 0 ]]; then
 echo "FATAL: Wireless interface $WLAN_STA unavailable!"; exit 1
fi
ifconfig $WLAN_AP 1>&2>/dev/null
if [[ $? -ne 0 ]]; then
 echo "FATAL: Wireless interface $WLAN_AP unavailable!"; exit 1
fi


# stop the repeater?
if [ "$1" == "stop" ]; then
 # be sure the repeater is already running
 if [ -f "$PIDFILE" ]; then
 # kill existing wireless connections from previous execution of this script
 echo -n -e "Stopping... "
 $DHCPCD -x $WLAN_STA 2>/dev/null
 $DHCPCD -x $WLAN_AP 2>/dev/null
 killall wpa_supplicant 2>/dev/null

 # kill running hostapd daemon if it exists
 killall hostapd 2>/dev/null

 # kill dnsmasq dhcp
 killall dnsmasq 2>/dev/null

 # empty existing temp.conf files, for security
 >$HOSTAP_TEMP_CONF
 >$WPASUPPLICANT_TEMP_CONF

 echo "OK"

 # restore firewall rules
 echo -n -e "Restoring firewall... "
 iptables-restore /dev/null
service wicd stop 2>/dev/null

# create temp wpa_supplicant.conf file for our STA interface
cat >$WPASUPPLICANT_TEMP_CONF <$HOSTAP_TEMP_CONF <"$IPTABLES_SAVE_FILE" && echo "OK"

# enable packet forwarding and add firewall rules to allow forwarding packets
# between our 2 network interfaces.
IF_IN=$WLAN_STA
IF_OUT=$WLAN_AP

sysctl -w net.ipv4.ip_forward=1
$IPTABLES -F
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $IF_IN -j MASQUERADE
$IPTABLES -A FORWARD -i $IF_IN -o $IF_OUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i $IF_OUT -o $IF_IN -j ACCEPT

# create pid file
echo $$ >"$PIDFILE"

echo -e "\nWireless repeater access point \"$WLAN_AP_SSID\" is *up* and running!\n"
echo -e "To stop it : `basename $0` stop"
show_notification "Wireless repeater access point \"$WLAN_AP_SSID\" is *up* and running!" 3

# optional : open a new xterm which displays the DNS log in realtime
xterm -e "tail -f $DNSMASQ_LOG" &

exit 0
fi

# unknown command, show usage
echo -e "$USAGE"
exit 1

Wireless Ad-hoc server script

Today, a quick and dirty Bash script which will allow you, for instance, to quickly serve files from your laptop to other wireless devices (Warning here, we use WEP encryption which is not secure).


#!/bin/bash
#
# Wireless Ad-hoc script
#
# https://agentoss.wordpress.com / fredo696@gmail.com
#
# This script will setup your wireless adapter in Ad-Hoc mode
# and start a DHCP server so that other peers (eg. an Android device)
# can receive an IP address and connect to your computer.
#
# After that, you can start a minimal webserver (darkhttpd for example)
# so that you can quickly share some files with minimal effort!
#
# This script must be run as root.
# Tested on Arch Linux.
# Some adaptations may be needed for other Linux systems.
#
# Requirements: iw, ifconfig commands, and dnsmasq.
#
# WARNING : WEP encryption is weak security :)

# User variables
mywlan="wlan0"
myessid="fredo"
mychan="4"
mywepkey="dead-beef-00"
myip="192.168.7.100"
mydhcprange="192.168.7.101,192.168.7.110"

# Main program
echo -n "Stopping wireless connections (if any)... "
# adapt to your system; I use wicd
systemctl stop wicd && echo "OK"
# for networkmanager
#systemctl stop NetworkManager

echo -n "Starting wireless Ad-hoc mode... "
ifconfig $mywlan down || exit 1
iwconfig $mywlan mode ad-hoc || exit 1
iwconfig $mywlan essid $myessid
iwconfig $mywlan channel $mychan
[ "$mywepkey" ] && iwconfig $mywlan key $mywepkey

ifconfig $mywlan $myip
ifconfig $mywlan up && echo "OK"
echo -n "Starting DHCP server ... "
dnsmasq --dhcp-range="$mydhcprange" && echo "OK"

echo "--------------------------------------"
echo "ESSID : $myessid"
[ "$mywepkey" ] && echo "WEP KEY : $mywepkey"
echo "This computer's IP : $myip"
echo "--------------------------------------"

# debug
#iwconfig $mywlan

while true; do
echo -n "Enter 'q' to quit. "
read value
if [ "$value" == "q" ]; then
break
fi
done

echo -n "Killing DHCP server... "
killall dnsmasq && echo "OK"
echo -n "Killing wireless... "
# restoring the wlan interface to "default" mode
ifconfig $mywlan down
iwconfig $mywlan mode managed
iwconfig $mywlan essid off
iwconfig $mywlan key off
echo "OK"
echo "Wireless Ad-hoc mode terminated."
# now you can restart your network manager

exit 0

Creating a Wireless Access Point with Debian Linux

A quick and dirty way to recycle an older computer with a wifi adapter.

Adapted from original HowTo (Thanks Matt!) at :
http://mcbridematt.dhs.org/blog/2010/11/21/HOWTO%3A%20HostAP%20%28Master%29%20mode%20for%20Ralink%20rt73%20USB%20wifi

Other sources :
http://en.wikipedia.org/wiki/Bridging_%28networking%29
http://wiki.debian.org/BridgeNetworkConnections
http://linuxwireless.org/en/users/Documentation/hostapd

Continue reading