Eu tenho dois nós em um cluster Docker Swarm. Um desses nós tem uma conexão de cliente OpenVPN com um provedor de VPN na interface tun0
. Meus objetivos são,
- Quaisquer serviços atribuídos a este nó usam exclusivamente a conexão VPN
- Sem vazamentos (ou seja, DNS ou outro tráfego)
- Se a VPN se desconectar, todo o tráfego será descartado
- Permitir descoberta de serviço e conexões com outros contêineres no Swarm
Para DNS, adicionei uma dns
entrada /etc/docker/daemon.json
que usa os servidores DNS do provedor de VPN que só podem ser acessados por meio da VPN.
Aqui estão as regras do iptable que eu criei:
iptables -I DOCKER-USER 1 -o tun0 -j ACCEPT
iptables -I DOCKER-USER 2 -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I DOCKER-USER 3 -j DROP
A cadeia resultante DOCKER-USER
se parece com isso:
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * tun0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
A partir de testes básicos como rodar nslookup
e curl
com a conexão VPN ligada e desligada essas regras parecem funcionar, mas tenho muito pouca experiência com iptables. Esta é a maneira correta de fazer isso?
O IPtables é linear e lê as regras de cima para baixo até atingir um destino ACCEPT, REJECT ou DROP e, em seguida, para de ler as regras. No seu caso, você quer ter
iptables -I DOCKER-USER -j DROP
como a última regra em sua cadeia, caso contrário, todos os pacotes serão descartados. Além disso, não há necessidade da regra RETURN no final, porque o IPtables parará de ler as regras assim que atingir a regra DROP logo acima dela. Essas regras do IPtables com tun0 parecem boas, mas certifique-se de ter essas regras também:Para uma boa prática, certifique-se de aceitar todo o tráfego de loopback, que nunca chegará à internet nem sairá da máquina:
Vamos analisar seus requisitos um por um:
Você não usaria IPtables para fazer isso. Execute estes comandos nos servidores:
Eu acho que o OpenVPN normalmente usa 10.8.0.0/16, então o gateway padrão provavelmente seria 10.8.0.1 ou algo assim. O IProute2 (comando ip) está embutido no kernel, assim como o IPtables.
Você deve primeiro redirecionar todo o tráfego através da VPN, colocando isso na configuração do servidor do seu OpenVPN:
Isso faz com que os clientes coloquem todo o seu tráfego através da VPN, até mesmo DNS e tal. Se o servidor OpenVPN cair, a internet deixará de funcionar nos clientes.
Veja o passo 2
Acredito que o OpenVPN faz isso por padrão. Eu sou capaz de fazer ping/arp de um cliente para outros clientes que estão no servidor OpenVPN. Você definitivamente deve poder acessar serviços que estão em outros clientes.
Espero que isso responda suas perguntas!