Skip to content

Instantly share code, notes, and snippets.

@Cdaprod
Created March 17, 2024 01:09
Show Gist options
  • Save Cdaprod/1faad04546fb4adc3457b7d5e89527fe to your computer and use it in GitHub Desktop.
Save Cdaprod/1faad04546fb4adc3457b7d5e89527fe to your computer and use it in GitHub Desktop.
This setup, once secured and refined according to your needs, will allow you to configure the Raspberry Pi's Wi-Fi settings via a user-friendly web interface.

Yes, you can configure your Raspberry Pi Zero W2 running Ubuntu to act as a Wi-Fi access point and also serve a web UI for Wi-Fi configuration, similar to what you might do with Raspbian. Since you have established services running on the device, I'll guide you through setting up the access point functionality and a web-based network configuration interface without disturbing your existing setup.

Step 1: Install Necessary Packages

  1. Update your system:

    sudo apt update && sudo apt upgrade -y
  2. Install hostapd and dnsmasq:

    sudo apt install hostapd dnsmasq -y

Step 2: Configure the Access Point

  1. Stop and disable hostapd and dnsmasq services temporarily to avoid conflicts while configuring:

    sudo systemctl stop hostapd
    sudo systemctl stop dnsmasq
    sudo systemctl disable hostapd
    sudo systemctl disable dnsmasq
  2. Configure hostapd:

    • Create the configuration file /etc/hostapd/hostapd.conf with the following content, adjusting ssid and wpa_passphrase as desired:
      interface=wlan0
      driver=nl80211
      ssid=YourNetworkSSID
      hw_mode=g
      channel=7
      wmm_enabled=0
      macaddr_acl=0
      auth_algs=1
      ignore_broadcast_ssid=0
      wpa=2
      wpa_passphrase=YourPassword
      wpa_key_mgmt=WPA-PSK
      wpa_pairwise=TKIP
      rsn_pairwise=CCMP
      
    • Specify the hostapd configuration file in /etc/default/hostapd by adding or modifying the line:
      DAEMON_CONF="/etc/hostapd/hostapd.conf"
      
  3. Configure dnsmasq:

    • Back up the original configuration file:
      sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
    • Create a new /etc/dnsmasq.conf with the following content, which sets up DHCP for your Wi-Fi network:
      interface=wlan0
      dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
      
  4. Enable IP Forwarding:

    • Edit /etc/sysctl.conf and uncomment net.ipv4.ip_forward=1.
  5. Configure NAT:

    • Assuming your internet connection is on eth0 (adjust if necessary), set up NAT with iptables:
      sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
    • Save the iptables rule:
      sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
    • To ensure iptables rules are applied on boot, edit /etc/rc.local and add before exit 0:
      iptables-restore < /etc/iptables.ipv4.nat
      
  6. Re-enable and start hostapd and dnsmasq:

    sudo systemctl unmask hostapd
    sudo systemctl enable hostapd
    sudo systemctl enable dnsmasq
    sudo systemctl start hostapd
    sudo systemctl start dnsmasq

Step 3: Setting Up a Web UI for Network Configuration

While there isn't a direct Ubuntu equivalent to RaspiWiFi, you can create or deploy a simple web-based interface that allows you to configure the network settings. This might involve:

  • Writing a simple Python Flask or Django app that interfaces with the system's networking configuration. This app would provide a web form to input Wi-Fi SSID and password, which it then uses to update the wpa_supplicant.conf file or the netplan configuration files in Ubuntu.
  • Using existing web-based tools designed for Linux network management if available, though they may require customization to fit your specific needs.

For a custom solution, your web app would need to:

  1. Run as root or with sufficient privileges to modify network configurations.
  2. Provide a form for entering new Wi-Fi network credentials.
  3. Apply these credentials to the system's Wi-Fi configuration, which could involve editing the wpa_supplicant.conf file or manipulating the system's network configuration files directly.

Here's a basic outline of how you might proceed with a custom web interface for Wi-Fi configuration using Flask, a lightweight Python web framework:

Install Flask

First, install Flask if you haven't already:

sudo apt install python3-flask

Create the Flask App

Create a directory for your Flask application and navigate into it:

mkdir ~/wifi-config-app
cd ~/wifi-config-app

Create a file named app.py and open it in your favorite text editor:

nano app.py

Insert the following Python code, which provides a simple form for network configuration:

from flask import Flask, request, redirect, url_for, render_template_string
import subprocess

app = Flask(__name__)

TEMPLATE = '''
<html>
    <head>
        <title>Wi-Fi Configuration</title>
    </head>
    <body>
        <h2>Configure Wi-Fi Connection</h2>
        <form method="post">
            SSID: <input type="text" name="ssid"><br>
            Password: <input type="password" name="password"><br>
            <input type="submit" value="Submit">
        </form>
    </body>
</html>
'''

@app.route('/', methods=['GET', 'POST'])
def wifi_config():
    if request.method == 'POST':
        ssid = request.form['ssid']
        password = request.form['password']
        configure_wifi(ssid, password)
        return redirect(url_for('wifi_config'))
    return render_template_string(TEMPLATE)

def configure_wifi(ssid, password):
    # Example: Update the wpa_supplicant.conf file
    config_lines = [
        '\n',
        'network={\n',
        f'    ssid="{ssid}"\n',
        f'    psk="{password}"\n',
        '    key_mgmt=WPA-PSK\n',
        '}\n'
    ]
    with open('/etc/wpa_supplicant/wpa_supplicant.conf', 'a') as file:
        file.writelines(config_lines)
    # Restart the Wi-Fi interface
    subprocess.run(['wpa_cli', '-i', 'wlan0', 'reconfigure'], check=True)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

This script creates a simple web page where you can input the SSID and password for a Wi-Fi network. Upon submitting the form, it appends the new network configuration to the wpa_supplicant.conf file and restarts the Wi-Fi interface to apply the changes.

Important Security Note: Running this app as is, especially on port 80 and allowing it to modify system files, poses significant security risks. It's crucial to implement proper authentication and ensure the app runs in a secure environment. Additionally, directly manipulating system files without validation can lead to system misconfigurations.

Run the Flask App

To run the app:

sudo python3 app.py

Now, you can connect to the Raspberry Pi's Wi-Fi network, navigate to the Pi's IP address in a web browser, and see a form to configure a new Wi-Fi connection.

Further Security Enhancements

  • Implement user authentication in the Flask app to secure access to the Wi-Fi configuration page.
  • Consider using HTTPS to secure the communication between the client and the Flask app.
  • Validate input data rigorously to avoid security vulnerabilities.

This setup, once secured and refined according to your needs, will allow you to configure the Raspberry Pi's Wi-Fi settings via a user-friendly web interface.

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