Skip to content

Instantly share code, notes, and snippets.

@dashohoxha
Last active June 7, 2024 18:03
Show Gist options
  • Save dashohoxha/5767262 to your computer and use it in GitHub Desktop.
Save dashohoxha/5767262 to your computer and use it in GitHub Desktop.
How to setup a Wifi Access Point on Ubuntu 12.04 (or its derivatives).
#!/bin/bash
### Setup a wifi Access Point on Ubuntu 12.04 (or its derivatives).
### make sure that this script is executed from root
if [ $(whoami) != 'root' ]
then
echo "
This script should be executed as root or with sudo:
sudo $0
"
exit 1
fi
##############################################################
## Check whether the wireless card supports Access Point mode
##############################################################
### make sure that iw is installed
apt-get -y install iw
### check that AP is supported
supports_access_point=$(iw list | sed -n -e '/* AP$/p')
if [ "$supports_access_point" = '' ]
then
echo "AP is not supported by the driver of the wireless card."
echo "This script does not work for this driver."
exit 1
fi
##############################################################
## Setup and host a network
##############################################################
### install hostapd
apt-get -y install hostapd
### it should not start automatically on boot
update-rc.d hostapd disable
### get ssid and password
ssid=$(hostname --short)
read -p "The name of your hosted network (SSID) [$ssid]: " input
ssid=${input:-$ssid}
password='1234567890'
read -p "The password of your hosted network [$password]: " input
password=${input:-$password}
### get wifi interface
rfkill unblock wifi # enable wifi in case it is somehow disabled (thanks to Darrin Wolf for this tip)
wifi_interface=$(lshw -quiet -c network | sed -n -e '/Wireless interface/,+12 p' | sed -n -e '/logical name:/p' | cut -d: -f2 | sed -e 's/ //g')
### create /etc/hostapd/hostapd.conf
cat <<EOF > /etc/hostapd/hostapd.conf
interface=$wifi_interface
driver=nl80211
ssid=$ssid
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=$password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
### modify /etc/default/hostapd
cp -n /etc/default/hostapd{,.bak}
sed -i /etc/default/hostapd \
-e '/DAEMON_CONF=/c DAEMON_CONF="/etc/hostapd/hostapd.conf"'
################################################
## Set up DHCP server for IP address management
################################################
### make sure that the DHCP server is installed
apt-get -y install isc-dhcp-server
### it should not start automatically on boot
update-rc.d isc-dhcp-server disable
### set the INTERFACES on /etc/default/isc-dhcp-server
cp -n /etc/default/isc-dhcp-server{,.bak}
sed -i /etc/default/isc-dhcp-server \
-e "/INTERFACES=/c INTERFACES=\"$wifi_interface\""
### modify /etc/dhcp/dhcpd.conf
cp -n /etc/dhcp/dhcpd.conf{,.bak}
sed -i /etc/dhcp/dhcpd.conf \
-e 's/^option domain-name/#option domain-name/' \
-e 's/^option domain-name-servers/#option domain-name-servers/' \
-e 's/^default-lease-time/#default-lease-time/' \
-e 's/^max-lease-time/#max-lease-time/'
sed -i /etc/dhcp/dhcpd.conf \
-e '/subnet 10.10.0.0 netmask 255.255.255.0/,+4 d'
cat <<EOF >> /etc/dhcp/dhcpd.conf
subnet 10.10.0.0 netmask 255.255.255.0 {
range 10.10.0.2 10.10.0.16;
option domain-name-servers 8.8.4.4, 208.67.222.222;
option routers 10.10.0.1;
}
EOF
#################################################
## Create a startup script
#################################################
cat <<EOF > /etc/init.d/wifi_access_point
#!/bin/bash
ext_interface=\$(ip route | grep default | cut -d' ' -f5)
function stop_wifi_ap {
### stop services dhcpd and hostapd
service isc-dhcp-server stop
service hostapd stop
### disable IP forwarding
echo 0 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -D POSTROUTING -s 10.10.0.0/16 -o \$ext_interface -j MASQUERADE 2>/dev/null
### remove the static IP from the wifi interface
if grep -q 'auto $wifi_interface' /etc/network/interfaces
then
sed -i /etc/network/interfaces -e '/auto $wifi_interface/,\$ d'
sed -i /etc/network/interfaces -e '\$ d'
fi
### restart network manager to takeover wifi management
service network-manager restart
}
function start_wifi_ap {
stop_wifi_ap
sleep 3
### see: https://bugs.launchpad.net/ubuntu/+source/wpa/+bug/1289047/comments/8
nmcli nm wifi off
rfkill unblock wlan
### give a static IP to the wifi interface
ip link set dev $wifi_interface up
ip address add 10.10.0.1/24 dev $wifi_interface
### protect the static IP from network-manger restart
echo >> /etc/network/interfaces
echo 'auto $wifi_interface' >> /etc/network/interfaces
echo 'iface $wifi_interface' inet static >> /etc/network/interfaces
echo 'address 10.10.0.1' >> /etc/network/interfaces
echo 'netmask 255.255.255.0' >> /etc/network/interfaces
### enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -o \$ext_interface -j MASQUERADE
### start services dhcpd and hostapd
service hostapd start
service isc-dhcp-server start
}
### start/stop wifi access point
case "\$1" in
start) start_wifi_ap ;;
stop) stop_wifi_ap ;;
esac
EOF
chmod +x /etc/init.d/wifi_access_point
### make sure that it is stopped on boot
sed -i /etc/rc.local \
-e '/service wifi_access_point stop/ d'
sed -i /etc/rc.local \
-e '/^exit/ i service wifi_access_point stop'
### display usage message
echo "
======================================
Wifi Access Point installed.
You can start and stop it with:
service wifi_access_point start
service wifi_access_point stop
"
@nwjlyons
Copy link

I also get a similar problem as @cmoulliard

Sep 13 01:00:52 crunchbang dhcpd: Wrote 0 leases to leases file.
Sep 13 01:00:52 crunchbang dhcpd: 
Sep 13 01:00:52 crunchbang dhcpd: No subnet declaration for eth0 (124.39.204.230).
Sep 13 01:00:52 crunchbang dhcpd: ** Ignoring requests on eth0.  If this is not what
Sep 13 01:00:52 crunchbang dhcpd:    you want, please write a subnet declaration
Sep 13 01:00:52 crunchbang dhcpd:    in your dhcpd.conf file for the network segment
Sep 13 01:00:52 crunchbang dhcpd:    to which interface eth0 is attached. **
Sep 13 01:00:52 crunchbang dhcpd: 
Sep 13 01:00:52 crunchbang dhcpd: 
Sep 13 01:00:52 crunchbang dhcpd: Not configured to listen on any interfaces!

This is the subnet in my dhcpd.conf file

subnet 10.10.0.0 netmask 255.255.255.0 {
        range 10.10.0.2 10.10.0.16;
        option domain-name-servers 8.8.4.4, 208.67.222.222;
        option routers 10.10.0.1;
}

I don't know anything about subnets etc.

@mitsos1os
Copy link

Hi. I am using your script and is working nicely!
I have one question though. I would like the service to start automatically when plugging in the wireless usb. For this I created a udev rule that started your service on entry of usb wirless device. I can see from the log that the service tries to start, but the hostapd sevice fails to run. It fails on

'nl80211: Failed to set channel (freq=2412): -16 (Device or resource busy)'
'/home/sporos/entto-server/hotspotOn.sh'(out) 'Could not set channel for kernel driver'
'/home/sporos/entto-server/hotspotOn.sh'(out) 'Interface initialization failed'

I have tried with many pririties for the udev rule, like 39 (to be loaded first), 70, 79,80,99 (last loaded with no result. I believe there is something to do with the things run by udev. Because manually it starts just fine

Could you anyone help with this situation?

@debashish216
Copy link

This procedure works fine for setting up the access point.. But the internet sharing is not working,, Could you please help in this regard and suggest some work around if any?

Thanks,
Dev

@aero9
Copy link

aero9 commented Apr 16, 2016

thanks , genius job it's solved my handheld wifi problem

@aero9
Copy link

aero9 commented Apr 29, 2016

how to restore the default after installing your script , can i undo the modifications?

@vishalkg
Copy link

vishalkg commented Apr 30, 2016

Hey,

All worked good on Ubuntu 12.04. But on 14.04, I am getting this error. Please help.

:~$ sudo service wifi_access_point start
stop: Unknown instance: 
 * Stopping advanced IEEE 802.11 management hostapd                      [ OK ] 
network-manager stop/waiting
network-manager start/running, process 5917
RTNETLINK answers: Operation not possible due to RF-kill
 * Starting advanced IEEE 802.11 management hostapd                      [fail] 
isc-dhcp-server` start/running, process 6074

@hyprstereo
Copy link

how to restore the default after installing your script , can i undo the modifications?

yeah i'd like to ask the similiar question, can guide pls?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment