valid interface combinations: * #{ managed } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1, total <= 2048, #channels <= 1, STA/AP BI must match * #{ WDS } <= 2048, total <= 2048, #channels <= 1, STA/AP BI must match
Вывод выше показывает, что AP и каналы станции должны совпадать: либо
#channels <= 1
или же
STA/AP BI must match
означает то же самое, что станция и канал AP должны совпадать. Таким образом, вы не вправе указывать какой-либо канал в файле hostapd.conf, вы должны убедиться, что канал в файле совпадает с тем, к которому вы уже подключены через управляемый интерфейс (или станцию, то же самое).
Что касается имен интерфейсов, то по какой-то причине я теперь не могу заставить hostapd работать с именами, такими как new0 и new1, но если я использую wlan0 и wlan1, все работает нормально, согласно моему посту.
Ниже вы найдете простой bash-скрипт, который сделает это за вас:
#!/bin/bash # If you need to debug, uncomment the following statement #set -x # and comment out the "exec" statement. [ "$USER" != "root" ] && exec sudo $0 "$@" exec 2>/var/log/$(basename $0).log if [ $# != 2 ]; then echo "Usage $0 interface action" echo "where interface is the name of the wireless interface to be used" echo "and action is one of start/stop " exit 1 fi MY_IF=$1 HPID=/tmp/host$USER.pid DPID=/tmp/dnsm$USER.pid WPID=/tmp/wpas$USER.pid [ -x /usr/bin/srm ] && RM=/usr/bin/srm || RM="/bin/rm -f" stop() { kill -9 $(cat $HPID) kill -9 $(cat $DPID) dhclient -r kill -9 $(cat $WPID) rm /tmp/*.my_conf rm /tmp/*$USER.pid iw dev wlan1 del ip link set dev $MY_IF down ip addr flush dev $MY_IF ip link set dev $MY_IF up iptables -t nat -D POSTROUTING -o $MY_IF -j MASQUERADE service network-manager start } my_exit() { case $1 in 2) echo "wpa_supplicant failed" >>&2 ;; 3) echo "dhclient failed" >>&2 ;; 4) echo "hostapd failed" >>&2 ;; 5) echo "dnsmasq failed" >>&2 ;; esac stop >>&2 exit $1 } start() { service network-manager stop iw phy phy0 interface add wlan1 type __ap ip addr flush dev $MY_IF ip link set dev $MY_IF up ip link set dev wlan1 up pkill -9 wpa_supplicant MYSECRET=$(mktemp /tmp/XXXXXX.my_conf) echo -e "Please enter BSSID and Password of the Wifi network which\n" echo -e "you wish to connect to:" read BSSID PASSWORD wpa_passphrase $BSSID $PASSWORD > $MYSECRET wpa_supplicant -B -i $MY_IF -c $MYSECRET -Dnl80211 -P $WPID 1> /dev/null EXIT_CODE=$? $RM $MYSECRET [[ $EXIT_CODE == 0 ]] && : || my_exit 2 pkill -9 dhclient dhclient $MY_IF [[ $EXIT_CODE == 0 ]] && : || my_exit 3 MYTEMPH=$(mktemp /tmp/XXXXXX.my_conf) MYTEMPD=$(mktemp /tmp/XXXXXX.my_conf) cat > $MYTEMPH <<EOF interface=wlan1 driver=nl80211 logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 ssid=wtf hw_mode=g channel=3 macaddr_acl=0 auth_algs=3 ignore_broadcast_ssid=0 eap_server=0 wpa=2 wpa_passphrase=12345678 wpa_pairwise=TKIP CCMP rsn_pairwise=TKIP CCMP EOF pkill -9 hostapd /usr/sbin/hostapd -B -P $HPID $MYTEMPH 1> /dev/null sleep 3 ps ax | grep hostapd | grep -v grep >/dev/null if [[ ! $? == 0 ]]; then /usr/sbin/hostapd -B -P $HPID $MYTEMPH 1> /dev/null fi [[ $? == 0 ]] && : || my_exit 4 echo 1 >/proc/sys/net/ipv4/ip_forward ip addr add 10.111.113.1/24 dev wlan1 cat > $MYTEMPD <<EOF domain-needed bogus-priv dhcp-authoritative no-dhcp-interface=$MY_IF no-dhcp-interface=lo interface=wlan1 server=8.8.8.8 server=8.8.4.4 expand-hosts dhcp-range=10.111.113.2,10.111.113.100,12h EOF pkill -9 dnsmasq dnsmasq -C $MYTEMPD -x $DPID [[ $? == 0 ]] && : || my_exit 5 iptables -t nat -A POSTROUTING -o $MY_IF -j MASQUERADE } case $2 in start) stop >>&2 start ;; stop) stop ;; *) echo "Usage $0 interface action" echo "where interface is the name of the wireless interface to be used" echo "and action is one of start/stop " ;; esac
убедитесь, что канал hostapd.conf внутри сценария выше (строка channel = 3 ) соответствует каналу AP, к которому вы хотите подключиться. Я не оставил, в приведенном выше, установите -x, который позволяет увидеть ошибки, если таковые имеются, по мере продвижения сценария: если вам нужно сделать некоторые отладки, вы можете ООН комментировать. Мне не удалось заставить hostapd при вызове из скрипта, как описано выше, работать с чем угодно, кроме country_code = us, но вам может повезти. Кроме того, моя версия hostapd дает сбой каждый раз, так что я добавил условие, которое проверяет, запущен ли hostapd или нет, и пытаетсяточно еще раз, чтобы это началось.