Last active
June 7, 2024 18:03
-
-
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).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 | |
" |
thanks , genius job it's solved my handheld wifi problem
how to restore the default after installing your script , can i undo the modifications?
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
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
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