У многих пользователей ноутбуков и/или настольных компьютеров периодически возникает задача поднять 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 и уберёт из файрволла добавленные ранее настройки.
Далее останется только добавить ярлык запуска этого скрипта на рабочий стол или панель быстрого запуска и можно пользоваться.
На этом всё. Приятной работы!
Anonymous 2013-01-02 09:03:34 (#)
Fedora 17: NetworkManager, Gnome 3. И оно даже работает.