Para manter o SSH acessível apenas através do WireGuard, levante a interface wg0 com o wg-quick, atribua a cada cliente um endereço com AllowedIPs e restrinja a porta 22 a essa rede: seja com ListenAddress no sshd_config, seja com uma regra ufw que só aceite TCP 22 a chegar pela wg0. Vista de fora, o servidor expõe apenas a porta UDP do WireGuard.

Como o WireGuard altera a exposição de um servidor SSH

Por omissão, o OpenSSH escuta na porta TCP 22 e, salvo indicação em contrário, em todas as interfaces, incluindo a pública. Com o WireGuard à frente, a única porta aberta para a Internet é a porta UDP do túnel, e o WireGuard não responde a pacotes que não estejam assinados por uma chave conhecida, pelo que uma varredura não vê nada.

A configuração deste artigo usa 10.8.0.0/24: o servidor é 10.8.0.1 e o telemóvel ou portátil é 10.8.0.2. O SSH só aceita ligações em 10.8.0.1 ou apenas a partir da interface wg0. Há duas formas de lá chegar, e combinam bem: associar o sshd ao endereço do túnel com ListenAddress, ou filtrar por interface com o ufw.

Configurar o WireGuard com wg-quick e AllowedIPs para SSH

O wg-quick lê /etc/wireguard/wg0.conf, cria a interface, atribui o endereço e adiciona rotas para cada intervalo indicado em AllowedIPs. Comece por gerar as chaves com permissões restritas:

umask 077
wg genkey | tee server.key | wg pubkey > server.pub

Configuração do servidor:

# /etc/wireguard/wg0.conf (server)
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server private key>

[Peer]
# phone
PublicKey = <phone public key>
AllowedIPs = 10.8.0.2/32

Configuração do cliente, em split tunnel: só o tráfego para 10.8.0.1 entra na VPN e todo o resto usa a ligação normal.

[Interface]
Address = 10.8.0.2/32
PrivateKey = <phone private key>

[Peer]
PublicKey = <server public key>
Endpoint = server.example.com:51820
AllowedIPs = 10.8.0.1/32
PersistentKeepalive = 25

No servidor, AllowedIPs funciona como lista de acesso: os pacotes desse peer só são aceites com origem 10.8.0.2. No cliente, decide que destinos são encaminhados pelo túnel; 0.0.0.0/0 enviaria tudo. Para o iniciar e torná-lo persistente:

sudo wg-quick up wg0
sudo systemctl enable --now wg-quick@wg0
sudo wg show

Os detalhes do protocolo e da troca de chaves estão no guia de início rápido oficial do WireGuard.

Restringir o SSH à wg0 com ListenAddress no sshd_config

A diretiva ListenAddress faz com que o sshd abra o seu socket apenas no endereço indicado; a porta 22 desaparece do IP público, tanto em IPv4 como em IPv6.

# /etc/ssh/sshd_config
ListenAddress 10.8.0.1
PasswordAuthentication no

sudo sshd -t
sudo systemctl restart ssh   # sshd on other distributions

O problema habitual é a ordem de arranque: se o sshd arrancar antes da wg0, o endereço ainda não existe e o sshd falha com "Cannot assign requested address". Resolve-se com um override do systemd (sudo systemctl edit ssh) que acrescente [email protected] e [email protected] em [Unit]. Nas distribuições que iniciam o sshd através de ssh.socket, o endereço de escuta vem da unidade do socket, não do sshd_config. Todas as opções estão documentadas na página de manual do sshd_config.

Restringir o SSH à wg0 com ufw: regras exatas por interface

Com o ufw, o sshd continua a escutar em todo o lado, mas a firewall só deixa passar TCP 22 quando chega pela wg0. Não depende da ordem de arranque e cobre também o Mosh, que usa as portas UDP 60000-61000.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 51820/udp
sudo ufw allow in on wg0 to any port 22 proto tcp
sudo ufw allow in on wg0 to any port 60000:61000 proto udp
sudo ufw delete allow OpenSSH
sudo ufw enable
sudo ufw status verbose

Aplique estas regras a partir de uma sessão que já esteja a correr pelo túnel e abra uma segunda ligação a 10.8.0.1 antes de fechar a primeira. A configuração mais robusta é ufw por interface mais ListenAddress: se uma camada falhar, a outra continua a manter a porta fechada.

SSH sobre WireGuard em iOS e Android versus computador

No telemóvel, a aplicação oficial do WireGuard levanta o túnel como perfil VPN do sistema, e o cliente SSH liga-se a 10.8.0.1 como a qualquer outro host. A aplicação pode gerar o par de chaves no próprio dispositivo ou importar um .conf a partir de um código QR criado com qrencode -t ansiutf8 < client.conf.

O que se comparaiOS / AndroidComputador
Cliente do túnelAplicação oficial do WireGuard, perfil VPN do sistemawg-quick ou a aplicação oficial
Importar a configuraçãoCódigo QR ou ficheiro .confCopiar o .conf para /etc/wireguard
Passar de wifi para dados móveisO Mosh mantém a sessão SSH vivaRaro; o SSH simples costuma bastar
Esc, Ctrl, Tab e setasPrecisam do teclado próprio do terminalTeclado físico
Chave privada SSHArmazenamento seguro do sistema~/.ssh a 700, chaves a 600

No termi1, o terminal SSH para telemóvel, a chave Ed25519 é gerada no telemóvel e nunca sai do dispositivo; o Mosh mantém a sessão quando passa de wifi para dados móveis, e o tmux guarda o que deixou a correr. Se a ligação a 10.8.0.1 estiver marcada como produção, o Production Guard trava os comandos que apagam ou param coisas antes de chegarem ao prompt. Se preferir não gerir chaves do WireGuard à mão, uma rede mesh como uma rede privada sem portas abertas ou o Tailscale cumpre a mesma função.

4 erros ao fechar o SSH dentro do WireGuard

  1. Fechar a porta 22 pública sem alternativa. Se o túnel cair, só resta a consola do fornecedor; confirme primeiro que funciona.
  2. AllowedIPs sobrepostos entre peers. Dois peers com o mesmo intervalo enviam o tráfego para o que tiver sido declarado em último lugar.
  3. Esquecer as portas UDP do Mosh. O Mosh arranca por SSH, mas sem 60000-61000 abertas na wg0 a sessão nunca chega a ligar.
  4. Não validar o sshd_config. Execute sshd -t antes de reiniciar; um erro de sintaxe deixa o serviço em baixo.

Perguntas frequentes

O WireGuard basta sem alterar a configuração do SSH?

O WireGuard sozinho não protege a porta 22: o sshd continua a escutar no IP público e qualquer pessoa pode tentar ligar-se. Precisa também de ListenAddress definido com o endereço do túnel ou de uma regra ufw que só aceite TCP 22 a chegar pela wg0.

O que deve conter o AllowedIPs do cliente para usar só SSH?

O AllowedIPs do cliente deve conter apenas o endereço do servidor no túnel, por exemplo 10.8.0.1/32. Assim, o wg-quick encaminha só esse tráfego pela VPN e a navegação normal usa a ligação habitual. Definir 0.0.0.0/0 faria passar todo o tráfego pelo túnel.

O Mosh funciona sobre WireGuard?

O Mosh funciona sobre WireGuard desde que o servidor aceite UDP 60000-61000 na wg0. O Mosh abre primeiro uma ligação SSH para lançar o mosh-server e depois passa para UDP. Não faz reencaminhamento de portas nem de X11, pelo que esses continuam a exigir o SSH clássico.

O que acontece se o WireGuard cair e o SSH só escutar na wg0?

Se o WireGuard cair enquanto o SSH está limitado à wg0, não há acesso SSH a partir da Internet até o túnel voltar. Mantenha disponível a consola web do fornecedor, ative wg-quick@wg0 no arranque e ordene o sshd depois do túnel com o systemd.