
Docker IPsec VPN Server — Updated!
Servidor VPN IPsec baseado em Docker com suporte a IPsec/L2TP, IPsec Cisco e IKEv2, com geração automática de credenciais e configuração de clientes multiplataforma.
English | 简体中文 | 繁體中文 | Русский
Servidor VPN IPsec no Docker
Imagem Docker para executar um servidor VPN IPsec, com IPsec/L2TP, Cisco IPsec e IKEv2.
Baseado em Alpine 3.23 ou Debian 12 com Libreswan (software VPN IPsec) e xl2tpd (daemon L2TP).
Uma VPN IPsec criptografa o tráfego de rede, de modo que ninguém entre você e o servidor VPN possa espionar seus dados enquanto eles trafegam pela Internet. Isso é especialmente útil ao usar redes não seguras, por exemplo, em cafeterias, aeroportos ou quartos de hotel.
Recursos:
- Gera automaticamente credenciais VPN e configuração IKEv2 na primeira inicialização
- Suporta IKEv2 com cifras fortes e rápidas (por exemplo, AES-GCM)
- Gera perfis VPN para configurar automaticamente dispositivos iOS, macOS e Android
- Suporta Windows, macOS, iOS, Android, Chrome OS e Linux como clientes VPN
- Inclui um script auxiliar para gerenciar usuários e certificados IKEv2
- Compilado e publicado automaticamente via GitHub Actions
- Dados persistentes via volume Docker
- Multi-arquitetura:
linux/amd64,linux/arm64,linux/arm/v7
Também disponível:
- VPN: IPsec sem Docker, WireGuard, OpenVPN, Headscale
- IA: Self-Hosted AI Stack para LLMs locais, chat, RAG, voz e ferramentas de IA
- 📚 Livros: The Self-Hosted AI Builder’s Guide, Privacy Tools in the Age of AI
Início rápido
Use este comando para configurar um servidor VPN IPsec no Docker:```bash
docker run
--name ipsec-vpn-server
--restart=always
-v ikev2-vpn-data:/etc/ipsec.d
-v /lib/modules:/lib/modules:ro
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
hwdsl2/ipsec-vpn-server
Os seus dados de login da VPN serão gerados aleatoriamente. Consulte [Recuperar dados de login da VPN](#retrieve-vpn-login-details).
Em alternativa, pode [configurar uma VPN IPsec sem Docker](https://github.com/hwdsl2/setup-ipsec-vpn). Para saber mais sobre como utilizar esta imagem, leia as secções abaixo.
## Comunidade
- 📬 [Subscreva para receber atualizações do projeto](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn) (1–2 e-mails/mês) — obtenha guias gratuitos de implantação de VPN e IA (PDF)
- 💬 Junte-se à comunidade [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) para discussões
- ⭐ Marque o repositório com uma estrela se o achar útil — isso ajuda outras pessoas a descobri-lo
## Requisitos
- Um servidor Linux com um endereço IP público ou nome DNS
- Docker instalado
- Portas VPN abertas no seu firewall (UDP 500 e 4500)
- Também pode utilizar [Podman](https://docs.podman.io) para executar esta imagem, após criar um alias para `docker`
**Nota:** Utilizadores avançados podem usar esta imagem em macOS com [Docker for Mac](https://docs.docker.com/desktop/setup/install/mac-install/). Antes de utilizar o modo IPsec/L2TP, poderá ser necessário reiniciar o contentor uma vez com `docker restart ipsec-vpn-server`. Esta imagem não suporta Docker for Windows.
## Download
Obtenha a compilação fiável a partir do [registo do Docker Hub](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/):```bash
docker pull hwdsl2/ipsec-vpn-server
Alternativamente, você pode baixar do Quay.io:```bash docker pull quay.io/hwdsl2/ipsec-vpn-server docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
Plataformas suportadas: `linux/amd64`, `linux/arm64` e `linux/arm/v7`.
Utilizadores avançados podem [compilar a partir do código-fonte](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#build-from-source-code) no GitHub.
### Comparação de imagens
Estão disponíveis duas imagens pré-construídas. A imagem padrão baseada em Alpine tem apenas ~19 MB.
| | Baseada em Alpine | Baseada em Debian |
| ----------------- | ------------------------ | -------------------------------- |
| Nome da imagem | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| Tamanho compactado| ~ 19 MB | ~ 62 MB |
| Imagem base | Alpine Linux 3.23 | Debian Linux 12 |
| Plataformas | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Versão do Libreswan | 5.4 | 5.4 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
**Nota:** Para utilizar a imagem baseada em Debian, substitua todas as ocorrências de `hwdsl2/ipsec-vpn-server` por `hwdsl2/ipsec-vpn-server:debian` neste README. Estas imagens não são atualmente compatíveis com sistemas Synology NAS.
<details>
<summary>
Quero utilizar a versão mais antiga do Libreswan 4.
</summary>
Geralmente, recomenda-se utilizar a versão mais recente do [Libreswan](https://libreswan.org/) 5, que é a versão padrão neste projeto. No entanto, se pretender utilizar a versão mais antiga do Libreswan 4, pode compilar a imagem Docker a partir do código-fonte:```bash
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server
cd docker-ipsec-vpn-server
# Specify Libreswan version 4
sed -i 's/SWAN_VER=5\..*/SWAN_VER=4.15/' Dockerfile Dockerfile.debian
# To build Alpine-based image
docker build -t hwdsl2/ipsec-vpn-server .
# To build Debian-based image
docker build -f Dockerfile.debian -t hwdsl2/ipsec-vpn-server:debian .
Como usar esta imagem
Variáveis de ambiente
Nota: Todas as variáveis desta imagem são opcionais, o que significa que você não precisa digitar nenhuma variável e pode ter um servidor VPN IPsec pronto para uso! Para isso, crie um arquivo env vazio usando touch vpn.env e pule para a próxima seção.
Esta imagem Docker usa as seguintes variáveis, que podem ser declaradas em um arquivo env (veja o exemplo):```
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
Isto criará uma conta de usuário para login de VPN, que pode ser usada pelos seus múltiplos dispositivos[\*](#notas-importantes). A PSK (chave pré-compartilhada) do IPsec é especificada pela variável de ambiente `VPN_IPSEC_PSK`. O nome de usuário da VPN é definido em `VPN_USER`, e a senha da VPN é especificada por `VPN_PASSWORD`.
Usuários adicionais de VPN são suportados e podem ser opcionalmente declarados no seu arquivo `env` desta forma. Nomes de usuário e senhas devem ser separados por espaços, e os nomes de usuário não podem conter duplicatas. Todos os usuários de VPN compartilharão a mesma PSK do IPsec.```
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
As variáveis acima são apenas para os modos IPsec/L2TP e IPsec/XAuth ("Cisco IPsec"). Para IKEv2, consulte Configurar e usar VPN IKEv2.
Nota: No seu arquivo env, NÃO coloque "" ou '' ao redor dos valores, nem adicione espaço ao redor de =. NÃO use estes caracteres especiais dentro dos valores: \ " '. Um PSK IPsec seguro deve consistir em pelo menos 20 caracteres aleatórios.
Nota: Se você modificar o arquivo env depois que o contêiner Docker já foi criado, você deve remover e recriar o contêiner para que as alterações tenham efeito. Consulte Atualizar imagem Docker.
Variáveis de ambiente adicionais
Usuários avançados podem opcionalmente especificar um nome DNS, nome do cliente e/ou servidores DNS personalizados.
Aprenda como especificar um nome DNS, nome do cliente e/ou servidores DNS personalizados.
Usuários avançados podem opcionalmente especificar um nome DNS para o endereço do servidor IKEv2. O nome DNS deve ser um nome de domínio totalmente qualificado (FQDN). Exemplo:``` VPN_DNS_NAME=vpn.example.com
Pode especificar um nome para o primeiro cliente IKEv2. Use apenas uma palavra, sem caracteres especiais, exceto `-` e `_`. O padrão é `vpnclient` se não for especificado.```
VPN_CLIENT_NAME=your_client_name
Por padrão, os clientes são configurados para usar o Google Public DNS quando a VPN está ativa. Você pode especificar servidores DNS personalizados para todos os modos de VPN. Exemplo:``` VPN_DNS_SRV1=1.1.1.1 VPN_DNS_SRV2=1.0.0.1
Para mais detalhes e uma lista de alguns provedores públicos de DNS populares, consulte [Usar servidores DNS alternativos](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md).
Por padrão, nenhuma senha é necessária ao importar a configuração do cliente IKEv2. Você pode optar por proteger os arquivos de configuração do cliente usando uma senha aleatória.```
VPN_PROTECT_CONFIG=yes
Nota: As variáveis acima não têm efeito para o modo IKEv2, se o IKEv2 já estiver configurado no contêiner Docker. Nesse caso, você pode remover o IKEv2 e configurá-lo novamente usando opções personalizadas. Consulte Configurar e usar VPN IKEv2.
Iniciar o servidor VPN IPsec
Crie um novo contêiner Docker a partir desta imagem (substitua ./vpn.env pelo seu próprio arquivo env):```bash
docker run
--name ipsec-vpn-server
--env-file ./vpn.env
--restart=always
-v ikev2-vpn-data:/etc/ipsec.d
-v /lib/modules:/lib/modules:ro
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
hwdsl2/ipsec-vpn-server
Neste comando, usamos a opção `-v` do `docker run` para criar um novo [volume Docker](https://docs.docker.com/storage/volumes/) chamado `ikev2-vpn-data` e montá-lo em `/etc/ipsec.d` no contêiner. Dados relacionados ao IKEv2, como certificados e chaves, serão persistidos no volume, e mais tarde, quando você precisar recriar o contêiner Docker, basta especificar o mesmo volume novamente.
É recomendado habilitar o IKEv2 ao usar esta imagem. No entanto, se você preferir não habilitar o IKEv2 e usar apenas os modos IPsec/L2TP e IPsec/XAuth ("Cisco IPsec") para se conectar à VPN, remova a primeira opção `-v` do comando `docker run` acima.
**Observação:** Usuários avançados também podem [executar sem o modo privilegiado](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#run-without-privileged-mode).
### Recuperar detalhes de login da VPN
Se você não especificou um arquivo `env` no comando `docker run` acima, `VPN_USER` terá como padrão `vpnuser` e tanto `VPN_IPSEC_PSK` quanto `VPN_PASSWORD` serão gerados aleatoriamente. Para recuperá-los, visualize os logs do contêiner:```bash
docker logs ipsec-vpn-server
Procure por estas linhas na saída:``` Connect to your new VPN with these details:
Server IP: your_vpn_server_ip IPsec PSK: your_ipsec_pre_shared_key Username: your_vpn_username Password: your_vpn_password
A saída também incluirá detalhes para o modo IKEv2, se estiver habilitado.
(Opcional) Faça backup dos detalhes de login VPN gerados (se houver) para o diretório atual:```bash
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
Usando docker-compose```bash
cp vpn.env.example vpn.env
Edit vpn.env if needed, then:
docker compose up -d docker logs ipsec-vpn-server
Example `docker-compose.yml` (já incluído):```yaml
volumes:
ikev2-vpn-data:
services:
vpn:
image: hwdsl2/ipsec-vpn-server
restart: always
env_file:
- ./vpn.env
ports:
- "500:500/udp"
- "4500:4500/udp"
privileged: true
hostname: ipsec-vpn-server
container_name: ipsec-vpn-server
volumes:
- ikev2-vpn-data:/etc/ipsec.d
- /lib/modules:/lib/modules:ro
Próximos passos
Leia isto em outros idiomas: English, 简体中文, 繁體中文, Русский.
Configure o seu computador ou dispositivo para usar a VPN. Consulte:
Configurar e usar VPN IKEv2 (recomendado)
Configurar clientes VPN IPsec/L2TP
Configurar clientes VPN IPsec/XAuth ("Cisco IPsec")
Leia 📖 Livro VPN para aceder a conteúdo extra.
Desfrute da sua própria VPN! ✨🎉🚀✨
Notas importantes
Utilizadores Windows: Para o modo IPsec/L2TP, é necessária uma alteração única no registo se o servidor ou cliente VPN estiver atrás de NAT (ex.: router doméstico).
A mesma conta VPN pode ser usada em vários dispositivos. No entanto, devido a uma limitação do IPsec/L2TP, se pretender ligar vários dispositivos a partir do mesmo NAT (ex.: router doméstico), deve usar o modo IKEv2 ou IPsec/XAuth.
Se pretender adicionar, editar ou remover contas de utilizador VPN, atualize primeiro o seu ficheiro env e, em seguida, remova e recrie o contentor Docker usando as instruções da próxima secção. Utilizadores avançados podem montar o ficheiro env.
Para servidores com firewall externa (ex.: EC2/GCE), abra as portas UDP 500 e 4500 para a VPN. Utilizadores Aliyun, consulte #433.
Os clientes estão configurados para usar o Google Public DNS quando a VPN está ativa. Se preferir outro fornecedor de DNS, leia esta secção.
Atualizar imagem Docker
Para atualizar a imagem e o contentor Docker, primeiro descarregue a versão mais recente:```bash docker pull hwdsl2/ipsec-vpn-server
Se a imagem Docker já estiver atualizada, você deverá ver:```
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
Caso contrário, ele baixará a versão mais recente. Para atualizar seu contêiner Docker, primeiro anote seus detalhes de login VPN. Em seguida, remova o contêiner Docker com docker rm -f ipsec-vpn-server. Por fim, recrie-o usando as instruções de Como usar esta imagem.
Configurar e usar VPN IKEv2
O modo IKEv2 tem melhorias em relação ao IPsec/L2TP e IPsec/XAuth ("Cisco IPsec"), e não requer PSK IPsec, nome de usuário ou senha. Leia mais aqui.
Primeiro, verifique os logs do contêiner para ver os detalhes do IKEv2:```bash docker logs ipsec-vpn-server
**Nota:** Se não conseguir encontrar os detalhes do IKEv2, o IKEv2 pode não estar ativado no contêiner. Tente atualizar a imagem Docker e o contêiner usando as instruções da seção [Atualizar imagem Docker](#update-docker-image).
Durante a configuração do IKEv2, um cliente IKEv2 (com o nome padrão `vpnclient`) é criado, com sua configuração exportada para `/etc/ipsec.d` **dentro do contêiner**. Para copiar o(s) arquivo(s) de configuração para o host Docker:```bash
# Check contents of /etc/ipsec.d in the container
docker exec -it ipsec-vpn-server ls -l /etc/ipsec.d
# Example: Copy a client config file from the container
# to the current directory on the Docker host
docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12 ./
Próximos passos: Configure seus dispositivos para usar a VPN IKEv2.
Aprenda como gerenciar clientes IKEv2.
Você pode gerenciar clientes IKEv2 usando o script auxiliar. Veja os exemplos abaixo. Para personalizar as opções do cliente, execute o script sem argumentos.```bash
Add a new client (using default options)
docker exec -it ipsec-vpn-server ikev2.sh --addclient [client name]
Export configuration for an existing client
docker exec -it ipsec-vpn-server ikev2.sh --exportclient [client name]
List existing clients
docker exec -it ipsec-vpn-server ikev2.sh --listclients
Show usage
docker exec -it ipsec-vpn-server ikev2.sh -h
**Nota:** Se encontrar o erro "executable file not found", substitua `ikev2.sh` acima por `/opt/src/ikev2.sh`.
</details>
<details>
<summary>
Saiba como alterar o endereço do servidor IKEv2.
</summary>
Em determinadas circunstâncias, pode ser necessário alterar o endereço do servidor IKEv2. Por exemplo, para mudar para usar um nome DNS, ou após alterações no IP do servidor. Para alterar o endereço do servidor IKEv2, primeiro [abra um shell bash dentro do contêiner](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#bash-shell-inside-container) e depois [siga estas instruções](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto.md#change-ikev2-server-address). Note que os logs do contêiner não mostrarão o novo endereço do servidor IKEv2 até que você reinicie o contêiner Docker.
</details>
<details>
<summary>
Remova o IKEv2 e configure-o novamente usando opções personalizadas.
</summary>
Em determinadas circunstâncias, pode ser necessário remover o IKEv2 e configurá-lo novamente usando opções personalizadas.
**Aviso:** Toda a configuração do IKEv2, incluindo certificados e chaves, será **permanentemente excluída**. Isso **não pode ser desfeito**!
**Opção 1:** Remova o IKEv2 e configure-o novamente usando o script auxiliar.
Note que isso substituirá as variáveis que você especificou no arquivo `env`, como `VPN_DNS_NAME` e `VPN_CLIENT_NAME`, e os logs do contêiner não mostrarão mais informações atualizadas para o IKEv2.```bash
# Remove IKEv2 and delete all IKEv2 configuration
docker exec -it ipsec-vpn-server ikev2.sh --removeikev2
# Set up IKEv2 again using custom options
docker exec -it ipsec-vpn-server ikev2.sh
Opção 2: Remova ikev2-vpn-data e recrie o contêiner.
- Anote todos os seus detalhes de login da VPN.
- Remova o contêiner Docker:
docker rm -f ipsec-vpn-server. - Remova o volume
ikev2-vpn-data:docker volume rm ikev2-vpn-data. - Atualize seu arquivo
enve adicione opções IKEv2 personalizadas, comoVPN_DNS_NAMEeVPN_CLIENT_NAME, e então recrie o contêiner. Consulte Como usar esta imagem.
Uso avançado
Consulte Uso avançado.
- Usar servidores DNS alternativos
- Executar sem modo privilegiado
- Selecionar modos de VPN
- Habilitar perfect forward secrecy do IKEv2
- Acessar outros contêineres no host Docker
- Especificar o IP público do servidor VPN
- Atribuir IPs estáticos aos clientes VPN
- Personalizar sub-redes da VPN
- Suporte a IPv6
- Split tunneling
- Sobre o modo de rede do host
- Habilitar logs do Libreswan
- Verificar o status do servidor
- Compilar a partir do código-fonte
- Shell Bash dentro do contêiner
- Montar o arquivo env via bind mount
- Implantar o controle de congestionamento Google BBR
Detalhes técnicos
Há dois serviços em execução: Libreswan (pluto) para a VPN IPsec e xl2tpd para suporte a L2TP.
A configuração IPsec padrão suporta:
- IPsec/L2TP com PSK
- IKEv1 com PSK e XAuth ("Cisco IPsec")
- IKEv2
Portas necessárias: 500/udp e 4500/udp (IPsec)
Licença
Nota: Os componentes de software dentro da imagem pré-compilada (como Libreswan e xl2tpd) estão sob as respectivas licenças escolhidas por seus respectivos detentores de direitos autorais. Quanto a qualquer uso de imagem pré-compilada, é responsabilidade do usuário da imagem garantir que qualquer uso desta imagem esteja em conformidade com todas as licenças relevantes para todo o software contido nela.
Copyright (C) 2016-2026 Lin Song 
Baseado em o trabalho de Thomas Sarlandie (Copyright 2012)

Este trabalho está licenciado sob a Licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada
Atribuição necessária: inclua meu nome em qualquer trabalho derivado e me avise como você o melhorou!