hostapd: сопоставление MAC-адреса с идентификатором VLAN (статическое сопоставление через accept_mac_file)

Я хочу, чтобы hostapd назначал каждой станции заданную VLAN на основе MAC-адреса . Кстати, моя сеть довольно мала. Использование RADIUS было бы излишним. установить статический MAC-адрес клиента для сопоставления идентификаторов VLAN.

Предположим, у меня есть только 1 станция (с MAC DE: AD: BE: EF: CA: FE). Я создал VLAN, используя:

sudo ip link add link wlan0 name vlan.100 type vlan id 100
sudo ip addr add 192.168.100.1/24 brd 192.168.100.255 dev vlan.100
sudo ip link set dev vlan.100 up

В hostapd.conf я использую:

#  Interface to use
interface=wlan0
#  Driver
driver=nl80211
#  Name of the network
ssid=YaddaYadda
#  Use the 2.4GHz band: g = IEEE 802.11g (2.4 GHz)
hw_mode=g
#  Use channel 6
channel=6
#  Enable 802.11n
ieee80211n=1
#  Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
#  Accept only known MAC addresses
macaddr_acl=1
accept_mac_file=/etc/hostapd/accept
#  Use WPA authentication
auth_algs=1
#  Send empty SSID in beacons and ignore probe request frames that do not specify full SSID
ignore_broadcast_ssid=1
#  Use WPA2
wpa=2
#  Use a pre-shared key
wpa_key_mgmt=WPA-PSK
#  Enable the wireless multimedia extensions
wmm_enabled=1
#  The network hashed passphrase
wpa_psk=786451648446NotReallyTheHashedPassphrase849989654651651651654564
#  Use AES, instead of TKIP
rsn_pairwise=CCMP
# Isolate Clients
ap_isolate=1

#  HOSTAPD event logger configuration
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

#  Country code
country_code=NO

В файле / etc / hostapd / accept Я добавил следующее:

DE:AD:BE:EF:CA:FE vlan.100

hostapd запускается без каких-либо вопросы. Однако после подключения моей станции к MAC DE: AD: BE: EF: CA: FE, я все еще получаю весь трафик на wlan0, а не на vlan.100 ...

hostapd ничего не говорит о том, как файл accept_mac_file должен выглядеть так, чтобы отображать MAC <-> VLAN ID. Я пробовал использовать запятую с пробелами и без них, но не повезло ...

Кто-нибудь смог заставить работать это сопоставление MAC <-> VLAN?

2
задан 28 October 2018 в 17:43
1 ответ

Глядя на исходный код hostapd , я обнаружил, что в config_file есть функция hostapd_config_read_maclist () .c , который анализирует файлы, на которые ссылаются значения конфигурации accept_mac_file и deny_mac_file :

static int hostapd_config_read_maclist(const char *fname,
                       struct mac_acl_entry **acl, int *num)
{
    FILE *f;
    char buf[128], *pos;
    int line = 0;
    u8 addr[ETH_ALEN];
    int vlan_id;

    f = fopen(fname, "r");
    if (!f) {
        wpa_printf(MSG_ERROR, "MAC list file '%s' not found.", fname);
        return -1;
    }

    while (fgets(buf, sizeof(buf), f)) {
        int rem = 0;

        line++;

        if (buf[0] == '#')
            continue;
        pos = buf;
        while (*pos != '\0') {
            if (*pos == '\n') {
                *pos = '\0';
                break;
            }
            pos++;
        }
        if (buf[0] == '\0')
            continue;
        pos = buf;
        if (buf[0] == '-') {
            rem = 1;
            pos++;
        }

        if (hwaddr_aton(pos, addr)) {
            wpa_printf(MSG_ERROR, "Invalid MAC address '%s' at "
                   "line %d in '%s'", pos, line, fname);
            fclose(f);
            return -1;
        }

        if (rem) {
            hostapd_remove_acl_mac(acl, num, addr);
            continue;
        }
        vlan_id = 0;
        pos = buf;
        while (*pos != '\0' && *pos != ' ' && *pos != '\t')
            pos++;
        while (*pos == ' ' || *pos == '\t')
            pos++;
        if (*pos != '\0')
            vlan_id = atoi(pos);

        if (hostapd_add_acl_maclist(acl, num, vlan_id, addr) < 0) {
            fclose(f);
            return -1;
        }
    }

    fclose(f);

    if (*acl)
        qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);

    return 0;
}

Я (пока) не проверял это, чтобы подтвердить, но на основе кода выше, похоже, что правила для файлов * _ mac_file следующие:

  1. Строки, начинающиеся с # , игнорируются.
  2. Пустые строки игнорируются.
  3. MAC адрес указывается шестью октетами в шестнадцатеричном формате, каждый из которых разделен : .
    • MAC-адрес может дополнительно иметь префикс - , чтобы удалить все его вхождения из списка на данный момент.
    • В противном случае за MAC-адресом может дополнительно следовать некоторая комбинация символов пробела и табуляции за которым следует целое число, определяющее VLAN. Если VLAN 0 , не указана или не является целым числом, это рассматривается как отсутствие VLAN.

На основании этих правил я считаю способ сопоставления MAC-адреса DE: AD: BE: EF: CA: FE к VLAN с именем vlan.100 и ID 100 находится в этой строке:

DE:AD:BE:EF:CA:FE 100

То есть, только идентификатор VLAN имеет значение для hostapd , а не имя VLAN.

0
ответ дан 3 December 2019 в 13:51

Теги

Похожие вопросы