В бюджетных ноутбуках часто используются беспроводные сетевые адаптеры от компании Broadcom. Если в Windows не возникает никаких проблем при создании точки доступа на карте практически любого производителя, то в Linux не то чтобы точку доступа создать, просто подключиться к сети через WiFi может вызвать очень серьезные затруднения. Правда в последнее время ситуация немного улучшилась. В этой инструкции мы рассмотрим как создать точку доступа Wifi в Linux на карте Broadcom серии bcm4313. Настройка будет рассмотрена в дистрибутиве Gnetoo, но в других дистрибутивах действия и настройки будут похожие, только файлы будут отличатся.
Для карт Broadcom есть аж четыре драйвера: стандартный и по умолчанию включенный b43, входящие в состав ядра brcmsmac и brcmfmac, а также пропертиарный broadcom-wl. Сразу скажу что пропертиарный драйвер совсем никудышний так как не поддерживет не только режим точки доступа, но и неразборчивый режим тоже. Стандартный b43 и brcmfmac нам не подходят потому что не работают в режиме точки доступа на нашей карте, хотя эти уже поддерживают режим монитора.
Остается только brcmsmac, который можно заставить работать в режиме только несколькими пинками, с помощью hostapd. Сначала разберемся с драйверами ядра. Смотрим какой драйвер загружен:
$ lsmod
Если есть вот такие строчки, то все ок и драйвер тот что нужно:
brcmsmac 497481 0
cordic 1024 1 brcmsmac
brcmutil 4596 1 brcmsmac
cordic 1024 1 brcmsmac
brcmutil 4596 1 brcmsmac
Но если загружен b43 или broadcom-wl их нужно удалить. Например для b43:
$ sudo rmmod b43
И запустить brcmsmac:
$ sudo modprobe brcmsmac
Лучше деинсталлировать пропертиарный драйвер если он установлен и выключить с ядра ненужные драйвера, оставив только brcmsmac, чтобы при перезагрузке грузился только он. Теперь установим hostapd:
$ sudo emerge -av hostapd
Стандартная конфигурация программы нам не подойдет, поэтому оригинальный конфигурационный файл переименовываем и создаем вот такой:
$ sudo nano /etc/hostapd/hostapd.conf
#/etc/hostapd/hostapd.conf
interface=wlp3s0
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
#dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
macaddr_acl=1
interface=wlp3s0
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
#dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
macaddr_acl=1
ssid=your_ssid
hw_mode=g
channel=7
channel=7
macaddr_acl=0
auth_algs=3
ieee80211n=1
wmm_enabled=1
auth_algs=3
ieee80211n=1
wmm_enabled=1
eap_server=0
eap_message=hello
eapol_key_index_workaround=0
own_ip_addr=127.0.0.1
wpa=2
wpa_passphrase=your_password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
rsn_pairwise=CCMP
eap_message=hello
eapol_key_index_workaround=0
own_ip_addr=127.0.0.1
wpa=2
wpa_passphrase=your_password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
rsn_pairwise=CCMP
Здесь и далее wlp3s0 — ваш сетевой интерфейс wifi. ssid устанавливает желаемое имя точки доступа, wpa_passphrase — пароль. Далее открываем файл /etc/conf.d/hostapd и указываем в строчке INTERFACES имя своего сетевого интерфейса:
$ sudo nano /etc/conf.d/hostapd
INTERFACES=»wlp3s0″
С настройкой hostapd все, но запускать точку доступа еще рано, я бы даже сказал очень рано. Перейдем к конфигурации сетевого интерфейса. Нам нужно задать статический ip, dns, режим и еще несколько настроек. Для этого идем в /etc/conf.d/net и добавляем следующие строки:
modules_wlp3s0=»!wpa_supplicant !iwconfig»
config_wlp3s0=»10.10.0.1 netmask 255.255.255.0″
mode_wlp3s0=»ap»
dns_servers_wlp3s0=»8.8.8.8″
config_wlp3s0=»10.10.0.1 netmask 255.255.255.0″
mode_wlp3s0=»ap»
dns_servers_wlp3s0=»8.8.8.8″
Осталось настроить dhcp сервер для раздачи ip пользователям которые будут подключаться к нашей сети. Для этого используем dnsmasq:
$ sudo emerge -av dnsmasq
После установки открываем конфиг и добавляем туда несколько строк, чтобы программа слушала интерфейс wlp3s0, и выдавала адреса в диапазоне 10.10.0.x:
dhcp-range=10.10.0.2,10.10.0.255,255.255.255.0,12h
interface=wlp3s0
listen-address=127.0.0.1
dhcp-host=1c:3e:84:82:a2:52,10.10.0.1
cache-size=300
dhcp-authoritative
server=8.8.8.8
no-resolv
address=/backbone/10.10.0.1
dhcp-option=3,10.10.0.1
dhcp-option=1,255.255.255.0
log-queries
log-dhcp
interface=wlp3s0
listen-address=127.0.0.1
dhcp-host=1c:3e:84:82:a2:52,10.10.0.1
cache-size=300
dhcp-authoritative
server=8.8.8.8
no-resolv
address=/backbone/10.10.0.1
dhcp-option=3,10.10.0.1
dhcp-option=1,255.255.255.0
log-queries
log-dhcp
Осталось настроить iptables для пропускания трафика и настроить автозагрузку всего этого, но предлагаю пойти другим путем. Мы напишем скрипт, которым можно будет в любой момент раздать Wifi, а остановить раздачу. Вот сам скрипт:
$ sudo nano /etc/init.d/wifi_access_point
#/bin/bash
case $1 in
start )
# на случай если интерфейс программно отключен
rfkill unblock all
rfkill unblock all
# запускаем сервисы
/etc/init.d/hostapd start
/etc/init.d/dnsmasq start
/etc/init.d/hostapd start
/etc/init.d/dnsmasq start
# включаем форвардинг пакетов
sysctl net.ipv4.ip_forward=1
# правила для iptables
iptables -t nat -A POSTROUTING -o enp2s0f0 -j MASQUERADE
iptables -A FORWARD -i enp2s0f0 -o wlp3s0 -m state —state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlp3s0 -o enp2s0f0 -j ACCEPT
;;
stop )
/etc/init.d/hostapd stop
/etc/init.d/dnsmasq stop
sysctl net.ipv4.ip_forward=0
;;
iptables -t nat -A POSTROUTING -o enp2s0f0 -j MASQUERADE
iptables -A FORWARD -i enp2s0f0 -o wlp3s0 -m state —state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlp3s0 -o enp2s0f0 -j ACCEPT
;;
stop )
/etc/init.d/hostapd stop
/etc/init.d/dnsmasq stop
sysctl net.ipv4.ip_forward=0
;;
esac
После сохранения скрипта дайте ему права на выполнение:
$ sudo chmod ugo+x /etc/init.d/wifi_access_point
И вот только теперь можно тестировать. Для запуска точки доступа используйте:
$ sudo /etc/init.d/wifi_access_point start
А для остановки:
$ sudo /etc/init.d/wifi_access_point stop
Вот и все.