У многих пользователей ноутбуков и/или настольных компьютеров периодически возникает задача поднять 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. И оно даже работает.