Estou procurando como fazer o cliente OpenVPN trabalhar em uma carcaça do recipiente, me explicar o que eu faço, mas você pode ignorar toda a minha explicação e oferecer a sua solução diretamente, eu não me importo com a substituição de todos os abaixo com seus passos se funciona, eu quero fazer o meu recipiente para usar uma VPN (ExpressVPN por exemplo), de forma que, tanto externos como internos de rede funciona.
Eu tenho uma janela de encaixe imagem de que é um Cliente OpenVPN, ele funciona encontrar com o comando:
docker run --rm -it --cap-add=NET_ADMIN --device=/dev/net/tun my-app /bin/bash
A janela de encaixe imagem tinha um ponto de entrada bash script:
curl https://vpnvendor/configurations.zip -o /app/configurations.zip
mkdir -p /app/open_vpn/ip_vanish/config
unzip /app/configurations.zip -d /app/open_vpn/config
printf "username\npassword\n" > /app/open_vpn/vpn-auth.conf
cd /app/open_vpn/config
openvpn --config ./config.ovpn --auth-user-pass /app/open_vpn/vpn-auth.conf
Ele funciona bem, mas quando eu implantá-lo como um contêiner em um K8S Pod, de quebra, é compreensível, K8S clusters necessidade de rede interna de comunicação entre os nós, de modo a VPN quebra-lo ... como faço para fazer ele funcionar? a pesquisa do Google foi frustrante, nenhuma das soluções trabalhadas e não foram poucos, não é um problema semelhante: o OpenVPN-Cliente Pod em K8s - rede Local inacessível Mas não entendi muito bem, por favor, ajuda.
Desde IPVanish é bem conhecido, vamos tomar o seu ovpn exemplo, eu uso outro fornecedor, mas tinham acesso a uma IPVanish conta e ele não funciona:
client
dev tun
proto udp
remote lon-a52.ipvanish.com 443
resolv-retry infinite
nobind
persist-key
persist-tun
persist-remote-ip
ca ca.ipvanish.com.crt
verify-x509-name lon-a52.ipvanish.com name
auth-user-pass
comp-lzo
verb 3
auth SHA256
cipher AES-256-CBC
keysize 256
tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA
Aceito respostas em Golang ou YAML não importa, apesar de eu uso go-cliente, o meu código para o pod de criação é:
podObj := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "mypod",
Namespace: "default",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "worker1",
Image: "192.168.1.138:5000/myimage",
ImagePullPolicy: v1.PullAlways,
Stdin: true,
TTY: true,
/* Trying to simulate --device=/dev/net/tun I copied the below, but it does not work
// https://garunski.medium.com/openvpn-and-minikube-25511099f8de
VolumeMounts: []v1.VolumeMount{
{
ReadOnly: true,
Name: "dev-tun",
MountPath: "/dev/net/tun",
},
},*/
SecurityContext: &v1.SecurityContext{
// Taken from https://caveofcode.com/how-to-setup-a-vpn-connection-from-inside-a-pod-in-kubernetes/
Privileged: boolPtr(true),
Capabilities: &v1.Capabilities{
Add: []v1.Capability{
"NET_ADMIN",
},
},
},
},
},
NodeName: "worker-node01",
},
}
clientset.CoreV1().Pods("default").Create(context.Background(), podObj, metav1.CreateOptions{})
Posso adicionar o NET_ADMIN
capacidade, mas eu preciso também dar acesso à /dev/net/tun
dispositivo e esse é o problema, mas mesmo Se eu encontrar uma forma, ele vai quebrar de rede interna.
A atualização de um
Eu fiz de rede externo de trabalho, adicionando as duas linhas seguintes no meu janela de encaixe do ponto de entrada:
# Taken from https://caveofcode.com/how-to-setup-a-vpn-connection-from-inside-a-pod-in-kubernetes/
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun