110 lines
3.0 KiB
Bash
110 lines
3.0 KiB
Bash
#!/bin/sh
|
|
# The script configures simultaneous AP and Managed Mode Wifi on Raspberry Pi Zero W (should also work on Raspberry Pi 3)
|
|
# Usage: curl https://gist.githubusercontent.com/lukicdarkoo/6b92d182d37d0a10400060d8344f86e4/raw | sh -s WifiSSID WifiPass APSSID APPass
|
|
# Licence: GPLv3
|
|
# Author: Darko Lukic <lukicdarkoo@gmail.com>
|
|
# Special thanks to: https://albeec13.github.io/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/
|
|
|
|
MAC_ADDRESS="$(cat /sys/class/net/wlan0/address)"
|
|
CLIENT_SSID="${1}"
|
|
CLIENT_PASSPHRASE="${2}"
|
|
AP_SSID="${3}"
|
|
AP_PASSPHRASE="${4}"
|
|
|
|
# Install dependencies
|
|
sudo apt -y update
|
|
sudo apt -y upgrade
|
|
sudo apt -y install dnsmasq dhcpcd hostapd
|
|
|
|
# Populate `/etc/udev/rules.d/70-persistent-net.rules`
|
|
sudo bash -c 'cat > /etc/udev/rules.d/70-persistent-net.rules' << EOF
|
|
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="${MAC_ADDRESS}", KERNEL=="phy0", \
|
|
RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
|
|
RUN+="/bin/ip link set ap0 address ${MAC_ADDRESS}
|
|
EOF
|
|
|
|
# Populate `/etc/dnsmasq.conf`
|
|
sudo bash -c 'cat > /etc/dnsmasq.conf' << EOF
|
|
interface=lo,ap0
|
|
no-dhcp-interface=lo,wlan0
|
|
bind-interfaces
|
|
server=8.8.8.8
|
|
domain-needed
|
|
bogus-priv
|
|
dhcp-range=192.168.10.50,192.168.10.150,12h
|
|
EOF
|
|
|
|
# Populate `/etc/hostapd/hostapd.conf`
|
|
sudo bash -c 'cat > /etc/hostapd/hostapd.conf' << EOF
|
|
ctrl_interface=/var/run/hostapd
|
|
ctrl_interface_group=0
|
|
interface=ap0
|
|
driver=nl80211
|
|
ssid=${AP_SSID}
|
|
hw_mode=g
|
|
channel=11
|
|
wmm_enabled=0
|
|
macaddr_acl=0
|
|
auth_algs=1
|
|
wpa=2PASSPHRASE
|
|
wpa_passphrase=${AP_PASSPHRASE}
|
|
wpa_key_mgmt=WPA-PSK
|
|
wpa_pairwise=TKIP CCMP
|
|
rsn_pairwise=CCMP
|
|
EOF
|
|
|
|
# Populate `/etc/default/hostapd`
|
|
sudo bash -c 'cat > /etc/default/hostapd' << EOF
|
|
DAEMON_CONF="/etc/hostapd/hostapd.conf"
|
|
EOF
|
|
|
|
# Populate `/etc/wpa_supplicant/wpa_supplicant.conf`
|
|
sudo bash -c 'cat > /etc/wpa_supplicant/wpa_supplicant.conf' << EOF
|
|
country=US
|
|
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
|
update_config=1
|
|
|
|
network={
|
|
ssid="${CLIENT_SSID}"
|
|
psk="${CLIENT_PASSPHRASE}"
|
|
id_str="AP1"
|
|
}
|
|
EOF
|
|
|
|
# Populate `/etc/network/interfaces`
|
|
sudo bash -c 'cat > /etc/network/interfaces' << EOF
|
|
source-directory /etc/network/interfaces.d
|
|
|
|
auto lo
|
|
auto ap0
|
|
auto wlan0
|
|
iface lo inet loopback
|
|
|
|
allow-hotplug ap0
|
|
iface ap0 inet static
|
|
address 192.168.10.1
|
|
netmask 255.255.255.0
|
|
hostapd /etc/hostapd/hostapd.conf
|
|
|
|
allow-hotplug wlan0
|
|
iface wlan0 inet manual
|
|
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
|
|
iface AP1 inet dhcp
|
|
EOF
|
|
|
|
# Populate `/bin/start_wifi.sh`
|
|
sudo bash -c 'cat > /bin/start_wifi.sh' << EOF
|
|
echo 'Starting Wifi AP and client...'
|
|
sleep 30
|
|
sudo ifdown --force wlan0
|
|
sudo ifdown --force ap0
|
|
sudo ifup ap0
|
|
sudo ifup wlan0
|
|
sudo sysctl -w net.ipv4.ip_forward=1
|
|
sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
|
|
sudo systemctl restart dnsmasq
|
|
EOF
|
|
sudo chmod +x /bin/start_wifi.sh
|
|
crontab -l | { cat; echo "@reboot /bin/start_wifi.sh"; } | crontab -
|
|
echo "Wifi configuration is finished! Please reboot your Raspberry Pi to apply changes..."
|