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.pubConfiguraçã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/32Configuraçã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 = 25No 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 showOs 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 distributionsO 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 verboseAplique 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 compara | iOS / Android | Computador |
|---|---|---|
| Cliente do túnel | Aplicação oficial do WireGuard, perfil VPN do sistema | wg-quick ou a aplicação oficial |
| Importar a configuração | Código QR ou ficheiro .conf | Copiar o .conf para /etc/wireguard |
| Passar de wifi para dados móveis | O Mosh mantém a sessão SSH viva | Raro; o SSH simples costuma bastar |
| Esc, Ctrl, Tab e setas | Precisam do teclado próprio do terminal | Teclado físico |
| Chave privada SSH | Armazenamento 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
- Fechar a porta 22 pública sem alternativa. Se o túnel cair, só resta a consola do fornecedor; confirme primeiro que funciona.
- AllowedIPs sobrepostos entre peers. Dois peers com o mesmo intervalo enviam o tráfego para o que tiver sido declarado em último lugar.
- 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.
- Não validar o sshd_config. Execute
sshd -tantes 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.