Logo na visita ao NOC da Itália, tive a agradável surpresa que o método de acesso à rede cabeada, leia-se switches fast/giga/ethernet, tinha mudado para usar autenticação via 802.1X.

Como já tinha trabalhado anteriormente com a mesma solução durante meus tempos de D-Link, achei que ia ser fácil.

Primeiramente tentei o seguinte comando:


musashi# wpa_supplicant -i bge0 -c ~helio/IEEE8021X/wpa_supplicant.conf 
ioctl[SIOCG80211, op 16]: Invalid argument Failed to initialize driver interface

Qual não foi minha surpresa... Não tinha funcionado. Tentei verificar o erro mais de perto com a opção "-dd" (extra debug):


Initializing interface (2) 'bge0' 
EAPOL: SUPP_PAE entering state 
DISCONNECTED EAPOL: KEY_RX 
entering state NO_KEY_RECEIVE 
EAPOL: SUPP_BE 
entering state INITIALIZE EAP: EAP 
entering state DISABLED EAPOL: External notification - portEnabled=0 
EAPOL: External notification - portValid=0 
ioctl[SIOCG80211, op 16]: Invalid argument 
wpa_driver_bsd_init: failed to get roaming state: Invalid argument 
Failed to initialize driver interface 
Failed to add interface bge0 
Cancelling scan request

A mensagem ioctl[SIOCG80211, op 16] me fez pensar sobre driver. Verifiquei a versão no ports, e realmente era muito mais antiga que a versão atual. Baixei manualmente e compilei. Consegui fazer rodar, mas dessa vez utilizando o comando:


musashi# wpa_supplicant -i bge0 -D wired -c ~helio/IEEE8021X/wpa_supplicant.conf

Com a opção -D wired consegui forçar o uso da interface de rede. Só restava verificar se meu arquivo de configuração estava correto ou não.


musashi# ./wpa_supplicant -i bge0 -D wired -c /tmp/wpa.conf -dd 
Initializing interface 'bge0' conf '/tmp/wpa.conf' driver 'wired' 
   ctrl_interface 'N/A' bridge 'N/A' 
Configuration file '/tmp/wpa.conf' -> '/tmp/wpa.conf' 
Reading configuration file '/tmp/wpa.conf' 
ctrl_interface='/var/run/wpa_supplicant' 
ctrl_interface_group='0' (DEPRECATED) 
eapol_version=1 
ap_scan=0 
fast_reauth=1 
Line: 12 - start of a new network block ssid - hexdump_ascii(len=0): key_mgmt: 0x8 
eap methods - hexdump(len=16): 00 00 00 00 19 00 00 00 00 00 00 00 00 00 00 00 
phase2 - hexdump_ascii(len=13): 61 75 74 68 3d 4d 53 43 48 41 50 56 32 
auth=MSCHAPV2 identity - hexdump_ascii(len=4): 75 73 65 72 
user password - hexdump_ascii(len=4): [REMOVED] 
Priority group 0 id=0 ssid='' 
Initializing interface (2) 'bge0' 
EAPOL: SUPP_PAE entering state DISCONNECTED 
EAPOL: KEY_RX entering state NO_KEY_RECEIVE 
EAPOL: SUPP_BE entering state INITIALIZE 
EAP: EAP entering state DISABLED 
EAPOL: External notification - portEnabled=0 
EAPOL: External notification - portValid=0 
wpa_driver_wired_init: Added multicast membership with SIOCADDMULTI 
Own MAC address: 00:14:c2:e7:d2:55 
Setting scan request: 0 sec 100000 usec 
Using existing control interface directory. 
ctrl_interface_group=0 
ctrl_iface bind(PF_UNIX) failed: Address already in use 
ctrl_iface exists, but does not allow connections - assuming it was leftover from 
   forced program term ination 
Successfully replaced leftover ctrl_iface socket '/var/run/wpa_supplicant/bge0' 
Added interface bge0 
EAPOL: External notification - portControl=Auto 
Already associated with a configured network - generating associated event 
Association info event State: DISCONNECTED -> ASSOCIATED 
Associated to a new BSS: BSSID=01:80:c2:00:00:03 
No keys have been configured - skip key clearing 
Network configuration found for the current AP 
EAPOL: External notification - portControl=Auto 
Associated with 01:80:c2:00:00:03 
EAPOL: External notification - portEnabled=0 
EAPOL: External notification - portValid=0 
EAPOL: External notification - portEnabled=1 
EAPOL: SUPP_PAE entering state CONNECTING 
EAPOL: SUPP_BE entering state IDLE 
EAP: EAP entering state INITIALIZE 
EAP: EAP entering state IDLE Cancelling scan request 
EAPOL: startWhen --> 0 
EAPOL: SUPP_PAE entering state CONNECTING 
EAPOL: txStart TX EAPOL - hexdump(len=4): 01 01 00 00 
EAPOL: startWhen --> 0 
EAPOL: SUPP_PAE entering state CONNECTING 
EAPOL: txStart TX EAPOL - hexdump(len=4): 01 01 00 00 
EAPOL: idleWhile --> 0 
EAP: EAP entering state FAILURE CTRL-EVENT-EAP-FAILURE EAP authentication failed 
EAPOL: SUPP_PAE entering state AUTHENTICATING 
EAPOL: SUPP_BE entering state FAIL 
EAPOL: SUPP_PAE entering state HELD 
EAPOL: SUPP_BE entering state IDLE 
EAPOL: startWhen --> 0 

Apesar da interface ter sido inicializada corretamente e enviando o primeiro frame, o switch respondia com a solicitação de "identity" que nunca ocorria, ficando a interface sempre em "startWhen --> 0". Busquei vários sites e não encontrei nenhuma resposta satisfatória. Aparentemente o driver de ethernet do FreeBSD não é capaz de utilizar uma chamada ioctl para detectar que um frame foi recebido pela interface.

A única solução que encontrei, não muito elegante, foi inicialiar um linux via quemu com uma interface tap0 em bridge. O wpa_supplicant do Linux funcionou corretamente e pude auntenticar na rede. O método de autenticação foi bem simples, onde segue o arquivo de configuração:


eapol_version=1 
ap_scan=0
fast_reauth=1
network={
key_mgmt=IEEE8021X
eap=PEAP
identity="DOMAIN\login"
phase2="auth=MSCHAPV2"
password="password"
}