Быстрое создание WiFi-хотспота для раздачи интернета

()

У многих пользователей ноутбуков и/или настольных компьютеров периодически возникает задача поднять WiFi-хотспот на своей машине чтобы "раздать" интернет себе и/или друзьям на телефон/планшет/ноутбук. К сожалению средств простого и быстрого развёртывания WiFi-хотспотов в Linux нет, однако задачу можно существенно упростить написав небольшой скрипт. Именно его мы и рассмотрим дальше.

Начальные условия:

  • Ноутбук под управлением Kubuntu 12.10;
  • Единственный работающий за ноубуком пользователь имеет логин "moose";
  • Встроенный WiFi-адаптер на чипе RTL8188, а так же внешний (подключаемый по USB) на том же чипесете. В качестве точки нужно использовать любой из них.

Переходим к решению. Для управления беспроводным интерфейсом используем hostapd, а в качестве DNS и DHCP-сервера используем dnsmasq. Графический интерфейс будет максимально простым и основан он будет на kdialog.

Для начала включим пересылку пакетов:

echo net.ipv4.ip_forward=1 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

Далее надо разрешить нашему пользователю запускать некоторые системные утилиты через sudo без запроса пароля (Внимание! неаакуратное обращение с конфигураций sudo может создать брешь в безопасости системы):

echo moose ALL=NOPASSWD: /bin/kill, /sbin/ifconfig, /sbin/iptables, /usr/sbin/dnsmasq, /usr/sbin/hostapd | sudo tee -a /etc/sudoers

Собственно скрипт управления хотспотом:

#!/bin/sh

# Базовый путь
cd `dirname $0`
BASEPATH=`pwd`

# Настройки

# Имя файла, куда пишется имя интерфейса точки
SETTINGS_IFNAME="${BASEPATH}/.settings_ifname"

# Файлы для записей идентификаторов процессов
SETTINGS_PID_HOSTAPD="/var/run/hotspot_pid_hostapd"
SETTINGS_PID_DNSMASQ="/var/run/hotspot_pid_dnsmasq"

# Файл конфигурации hostapd
SETTINGS_HOSTPAD_CONF="${BASEPATH}/hostapd.conf"

# Первые три октета подсети, используемой нашей точкой доступа
SETTINGS_HOTSPOT_NET="172.31.10"

# Настройки wifi-сети
SETTINGS_HOTSPOT_SSID="notebook-of-moose"
SETTINGS_HOTSPOT_PASS="p4ssw0rd"

# Если файл с именем выбранного интерфейса существует
# То есть если хотспот уже запущен
if [ -f ${SETTINGS_IFNAME} ]; then
        # Запрашиваем подтверждение на остановку хотспота
        kdialog --title 'WiFi хотспот' --yesno 'Хотспот уже запущен. Желаете остановить?'
        # Если пользователь выразил согласие
        if [ $? -eq 0 ]; then
                # Убиваем процессы
                test -f ${SETTINGS_PID_HOSTAPD} && sudo kill `cat ${SETTINGS_PID_HOSTAPD}`
                test -f ${SETTINGS_PID_DNSMASQ} && sudo kill `cat ${SETTINGS_PID_DNSMASQ}`
                # Убираем правило iptabes
                sudo iptables -t nat -D POSTROUTING -s ${SETTINGS_HOTSPOT_NET}.0/24 ! -d ${SETTINGS_HOTSPOT_NET}.0/24 -j MASQUERADE
                # Удаляем файл 
                rm -f ${SETTINGS_IFNAME}
                # Показываем сообщение
                kdialog  --title 'WiFi хотспот' --msgbox 'Хотспот остановлен!'
        fi
        # Завершаем работу
        exit
fi


# Список доступных беспроводных интерфейсов
IFLIST=`iwconfig | grep -E  'IEEE 802.11|^wlan' | awk '{print $1;}'`

# Получаем имя интерфейса для последующей настройки
IFNAME=`kdialog  --title 'WiFi хотспот' --combobox 'Выберите интерефейс для создания хотспота' ${IFLIST}`

# Если интерфейс не был выбран
if [ -z ${IFNAME} ]; then
        kdialog --title 'WiFi хотспот' --msgbox 'Отменено!'
        # Завершаем работу
        exit
fi

# Запоминаем имя интерфейса
echo ${IFNAME} > ${SETTINGS_IFNAME}

# Поднимаем интерфейс
sudo ifconfig ${IFNAME} ${SETTINGS_HOTSPOT_NET}.1 netmask 255.255.255.0 up

# Создаём правило iptables
sudo iptables -t nat -A POSTROUTING -s ${SETTINGS_HOTSPOT_NET}.0/24 ! -d ${SETTINGS_HOTSPOT_NET}.0/24 -j MASQUERADE

# Создаём файл конфигурации hostapd
echo "interface=${IFNAME}
ssid=${SETTINGS_HOTSPOT_SSID}
wpa_passphrase=${SETTINGS_HOTSPOT_PASS}
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa=3
driver=nl80211
country_code=RU
hw_mode=g
channel=3" > ${SETTINGS_HOSTPAD_CONF}

# Запускаем dnsmasq
sudo dnsmasq --listen-address=${SETTINGS_HOTSPOT_NET}.1 \
             --interface=${IFNAME} \
             --bind-interfaces \
             --dhcp-range=${SETTINGS_HOTSPOT_NET}.100,${SETTINGS_HOTSPOT_NET}.200,4h \
             --log-dhcp \
             --pid-file=${SETTINGS_PID_DNSMASQ}

# Запускаем hostapd
sudo hostapd ${SETTINGS_HOSTPAD_CONF} -B -P  ${SETTINGS_PID_HOSTAPD}

ВАЖНО: если у вас настроен файрволл то возможно придётся адаптировать добавляемые правила iptables под ваши настройки.

Работает скрипт следующим образом: если хотспот ещё не запущен, то скрипт предложит выбрать беспроводной интерфейс для создания хотспота и затем сконфигурирует этот интерфейс, запустит hostapd и dnsmasq и внесёт правки в файрволл.

Если хотспот уже запущен то скрипт предложит его остановить и в случае утвердительного ответа остановит hostapd и dnsmasq и уберёт из файрволла добавленные ранее настройки.

Далее останется только добавить ярлык запуска этого скрипта на рабочий стол или панель быстрого запуска и можно пользоваться.

На этом всё. Приятной работы!

Ключевые слова: hostapd, dnsmasq, kdialog, wi-fi, хотспот, dhcp, dns.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Anonymous 2013-01-02 09:03:34 (#)

http://rghost.ru/42672829/image.png :)

Fedora 17: NetworkManager, Gnome 3. И оно даже работает.

MooSE 2013-01-02 14:02:07 (#)

http://rghost.ru/42672829/image.png :)

Fedora 17: NetworkManager, Gnome 3. И оно даже работает.


В федоре вроде как патченный NM. В остальных дистрибутивах можно создать Ad-Hoc сеть, но это не совсем то. А если говорить про KDE то встроенный руль от NM к тому же не успевает за добавляемыми в NM возможностями.

Anonymous 2013-02-05 13:08:00 (#)

Для гномов:
#!/bin/sh

# Базовый путь
cd `dirname $0`
BASEPATH=`pwd`

# Настройки

# Имя файла, куда пишется имя интерфейса точки
SETTINGS_IFNAME="${BASEPATH}/.settings_ifname"

# Файлы для записей идентификаторов процессов
SETTINGS_PID_HOSTAPD="/var/run/hotspot_pid_hostapd"
SETTINGS_PID_DNSMASQ="/var/run/hotspot_pid_dnsmasq"

# Файл конфигурации hostapd
SETTINGS_HOSTPAD_CONF="${BASEPATH}/hostapd.conf"

# Первые три октета подсети, используемой нашей точкой доступа
SETTINGS_HOTSPOT_NET="172.31.10"

# Настройки wifi-сети
SETTINGS_HOTSPOT_SSID="Hotspot name"
SETTINGS_HOTSPOT_PASS="Password"

# Если файл с именем выбранного интерфейса существует
# То есть если хотспот уже запущен
if [ -f ${SETTINGS_IFNAME} ]; then
        # Запрашиваем подтверждение на остановку хотспота
        zenity --title 'WiFi хотспот' --question --text='Хотспот уже запущен. Желаете остановить?'
        # Если пользователь выразил согласие
        if [ $? -eq 0 ]; then
                # Убиваем процессы
                test -f ${SETTINGS_PID_HOSTAPD} && sudo kill `cat ${SETTINGS_PID_HOSTAPD}`
                test -f ${SETTINGS_PID_DNSMASQ} && sudo kill `cat ${SETTINGS_PID_DNSMASQ}`
                # Убираем правило iptabes
                sudo iptables -t nat -D POSTROUTING -s ${SETTINGS_HOTSPOT_NET}.0/24 ! -d ${SETTINGS_HOTSPOT_NET}.0/24 -j MASQUERADE
                # Удаляем файл 
                rm -f ${SETTINGS_IFNAME}
                # Показываем сообщение
                zenity  --title 'WiFi хотспот' --info --text='Хотспот остановлен!'
        fi
        # Завершаем работу
        exit
fi


# Список доступных беспроводных интерфейсов
IFLIST=`iwconfig | grep -E  'IEEE 802.11|^wlan' | awk '{print $1;}'`

# Получаем имя интерфейса для последующей настройки
IFNAME=`zenity --title 'WiFi хотспот' --list --text='Выберите интерефейс для создания хотспота' --column 'Интерфейс' ${IFLIST}`
echo ${IFNAME}

# Если интерфейс не был выбран
if [ -z ${IFNAME} ]; then
        zenity --title 'WiFi хотспот' --info --text='Отменено!'
        # Завершаем работу
        exit
fi

# Запоминаем имя интерфейса
echo ${IFNAME} > ${SETTINGS_IFNAME}

# Поднимаем интерфейс
sudo ifconfig ${IFNAME} ${SETTINGS_HOTSPOT_NET}.1 netmask 255.255.255.0 up

# Создаём правило iptables
sudo iptables -t nat -A POSTROUTING -s ${SETTINGS_HOTSPOT_NET}.0/24 ! -d ${SETTINGS_HOTSPOT_NET}.0/24 -j MASQUERADE

# Создаём файл конфигурации hostapd
echo "interface=${IFNAME}
ssid=${SETTINGS_HOTSPOT_SSID}
wpa_passphrase=${SETTINGS_HOTSPOT_PASS}
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa=3
driver=nl80211
country_code=RU
hw_mode=g
channel=3" > ${SETTINGS_HOSTPAD_CONF}

# Запускаем dnsmasq
sudo dnsmasq --listen-address=${SETTINGS_HOTSPOT_NET}.1 \
             --interface=${IFNAME} \
             --bind-interfaces \
             --dhcp-range=${SETTINGS_HOTSPOT_NET}.100,${SETTINGS_HOTSPOT_NET}.200,4h \
             --log-dhcp \
             --pid-file=${SETTINGS_PID_DNSMASQ}

# Запускаем hostapd
sudo hostapd ${SETTINGS_HOSTPAD_CONF} -B -P  ${SETTINGS_PID_HOSTAPD}
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности