Contents

Configurando um Adaptador USB Wireless no Ubuntu Server

Esses dias um amigo me emprestou um NUC (a.k.a. Next Unit of Computing) e decidi fazer alguns experimentos utilizando o Ubuntu Server 21.04. Durante esse processo, precisei configurar um Adaptador USB Wireless pois não tinha como conectar o NUC utilizando um cabo UTP (e.g. CAT5, CAT6). Devido ter algumas informações não tão fáceis de encontrar ou um passo a passo bem definido, decidi fazer esse post no intuito de ajudar alguém que eventualmente possa passar por uma situação parecida.

Nesse post iremos aprender a configurar o acesso a internet por meio de um Adaptador USB Wireless, mais especificamente o adaptador TL-WN725N no meu caso, considerando que o servidor não tem disponível uma conexão ethernet.

Durante esse processo, precisaremos lidar com ferramentas como wpa_supplicant, netplan, systemd, dentre outros.

Preparando as dependências

Antes de mais nada precisamos baixar os pacotes necessários para construção e execução do driver para comunicação com o adaptador, e do wpa_supplicant.

Se você tiver outro computador disponível com um Ubuntu, você pode utilizar o comando apt-rdepends para baixar os pacotes principais (wpasupplicant, make e gcc) e suas dependências de forma recursiva.

e.g.

1
2
3
4
5
$ sudo apt install apt-rdepends

$ for pkg in wpasupplicant make gcc; do
$  apt download $(apt-rdepends "${pkg}" | grep -v "^ " | sed 's/debconf-2.0/debconf/g')
$ done

Porém, se você não tem outro computador disponível com um Ubuntu, você pode baixar os pacotes individualmente aqui, utilizando qualquer dispositivo que tenha a disposição.

Após baixarmos as dependências, precisamos baixar o driver que iremos utilizar.

O driver oficial da TP-Link está em beta e só suporta as versões de kernel entre 2.6.18 e 4.4.3, porém a versão que estou utilizando é a 5.11.0. Até tentei construir o driver, mas sem sucesso. Com isso, decidi seguir com um open source que encontrei e que iremos utilizar mais a frente. Obrigado ao mantenedor do projeto. :)

1
$ git clone git@github.com:lwfinger/rtl8188eu.git

Uma vez que possuímos as dependências e o driver, podemos colocá-los em um flash drive.

Note
Se estiver utilizando MacOS para montar o flash drive, lembre-se de utilizar um sistema de arquivos reconhecido pelo Ubuntu (e.g. exFAT).

Instalando as dependências e o driver

Após conectar o flash drive no dispositivo com o Ubuntu Server, você precisará montar o sistema de arquivos dele em um diretório qualquer para podermos utilizá-lo.

No entanto, precisamos saber primeiro qual dispositivo de bloco representa nosso flash drive. Para isso, você pode utilizar o comando lsblk para listar os dispositivos reconhecidos.

A saída será bem parecida com essa:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                       7:0    0  55.4M  1 loop /snap/core18/1997
loop1                       7:1    0  68.8M  1 loop /snap/lxd/20037
loop2                       7:2    0  32.3M  1 loop /snap/snapd/11588
sda                         8:0    0 111.8G  0 disk
├─sda1                      8:1    0   512M  0 part /boot/efi
├─sda2                      8:2    0     1G  0 part /boot
└─sda3                      8:3    0 110.3G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0  55.1G  0 lvm  /
sdc                         8:32   1  57.3G  0 disk
├─sdc1                      8:33   1   200M  0 part
└─sdc2                      8:34   1  57.1G  0 part

Agora podemos montar o sistema de arquivos. Para isso, podemos utilizar o seguinte comando:

1
2
3
4
$ sudo mount /dev/<device> /mnt

# no meu caso
$ sudo mount /dev/sdc2 /mnt

Com o sistema de arquivos montado, podemos instalar os pacotes que estão no flash drive.

1
2
3
$ cd /mnt

$ sudo dpkg -i *.deb

Com as dependências instaladas, podemos agora construir e instalar o driver para o adaptador USB wireless.

Ele irá gerenciar toda comunicação feita com o nosso adaptador, além disso ele criará a interface de rede que iremos utilizar posteriormente com o wpa_supplicant.

1
2
3
4
5
6
$ cd /mnt/rtl8188eu
$ make
$ sudo make install

$ sudo echo “blacklist r8188eu”  >>  /etc/modprobe.d/blacklist.conf
$ sudo modprobe -r r8188eu

Lembrando que a cada nova atualização do kernel, após o reboot solicitado, você precisará instalar o driver novamente. Por isso, é interessante que salve o repositório do driver em algum diretório local.

e.g.

1
2
3
4
5
6
$ cd rtl8188eu
$ make clean
$ git pull

$ make
$ sudo make install

Com o driver instalado, remova e insira novamente o adaptador USB wireless.

Ao executar o comando ip a uma nova interface será exibida, além da de loopback e a de ethernet.

Tip
Caso queira, os logs do driver podem ser obtidos junto com os logs do kernel utilizando o comando dmesg.

Configurando o WPA Supplicant

Após a instalação do driver, podemos agora iniciar a configuração do wpa_supplicant.

Uma explicação rápida sobre o wpa_supplicant: ele é como o próprio nome diz, um suplicante (IEEE 802.1X Supplicant), ou seja, é o software que age no lado do cliente e que implementa negociação de chaves com um autenticador WPA. Ele precisa fornecer credenciais ou certificados para se autenticar em um autenticador que está do outro lado da rede (roteador no nosso caso) e conseguir estabeler uma conexão.

Voltando para a sua configuração, o primeiro passo é criar o arquivo que ele utilizará. Para isso precisaremos do SSID, ou nome da rede, em que iremos conectar, e a senha.

1
2
3
4
5
6
7
8
$ cd /etc/wpa_supplicant

# Opção 1
$ wpa_passphrase <ssid> <password> >> wpa_supplicant.conf

# Opção 2
$ wpa_passphrase <ssid> >> wpa_supplicant.conf
# Nesse caso ele irá solicitar a senha. Digite-a e pressione ENTER.

Após a criação do arquivo de configuração, precisaremos adicionar mais alguns parâmetros.

1
2
3
4
5
6
7
8
9
country=BR
ctrl_interface=DIR=/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="<ssid>"
        #psk="<password>"
        psk=<pre-shared-key>
}

Ao instalarmos o wpa_supplicant, é criado uma service unit em /usr/lib/systemd/system/wpa_supplicant.service para a sua execução. Precisaremos editar essa unit para adicionar alguns parâmetros ao seu comando de execução.

Para obter o nome da interface de rede, podemos utilizar o comando ifconfig ou o comando ip a.

A flag -D indica qual driver (interno do wpa_supplicant) que iremos utilizar. No meu caso, precisei utilizar o driver wext.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=WPA supplicant
Before=network.target
After=dbus.service
Wants=network.target
IgnoreOnIsolate=true

[Service]
Type=dbus
BusName=fi.w1.wpa_supplicant1
ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -d -i <interface-name> -D wext dhclient <interface-name> -t

[Install]
WantedBy=multi-user.target
Alias=dbus-fi.w1.wpa_supplicant1.service

Após a modificação da unit precisamos notificar o systemd das mudanças e reiniciar o serviço em execução.

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart wpa_supplicant.service
Tip
Para visualizar os logs do serviço podemos utilizar o comando journalctl -u wpa_supplicant.service -f.

Podemos verificar o status utilizando o wpa_cli.

1
$ sudo wpa_cli status

Se você possui mais de um adaptador, ou até mesmo uma placa de rede embutida no seu dispositivo, e deseja utilizar ambos, provavelmente você precisará configurar uma instância do wpa_supplicant para cada interface de rede individualmente.

Configurando o Netplan

Com o wpa_supplicant configurado, agora iremos configurar o netplan.

Para isso, basta editarmos o arquivo que fica em /etc/netplan, ou criá-lo caso já não exista. No meu caso, já existia o arquivo 00-installer-config.yaml, então apenas o editei.

Precisamos adicionar a seção wifis com o seguinte conteúdo.

1
2
3
4
5
6
7
8
network:
  ...
  wifis:
    "<interface-name>":
      dhcp4: true
      access-points:
        "<ssid>":
          password: "<password>"

Após editar o arquivo, basta aplicarmos as mudanças.

1
2
$ sudo netplan generate
$ sudo netplan apply
Tip

Caso seja necessário, o netplan possui uma flag --debug para ajudar durante um troubleshooting.

Para visualizar os logs do networkd podemos utilizar o comando journalctl -u systemd-networkd -f.

Após isso, podemos testar nossa conexão fazendo um ping para algum dispositivo da rede local, ou para algum endereço externo (e.g. google.com).