Estoy buscando cómo hacer OpenVPN cliente trabajo en una vaina del contenedor, explico lo que yo hago, pero puede pasar toda mi explicación y ofrecer la solución directamente, no me importa la sustitución de todos los de abajo con sus pasos si funciona, yo quiero hacer mi contenedor de usar una VPN (ExpressVPN por ejemplo) de forma que tanto el interno y el externo de red funciona.
Tengo una ventana acoplable imagen que es un Cliente de OpenVPN, funciona con el comando:
docker run --rm -it --cap-add=NET_ADMIN --device=/dev/net/tun my-app /bin/bash
La ventana acoplable imagen había un punto de entrada script de bash:
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
Funciona bien, pero cuando voy a implementarlo como un contenedor en un K8S Vaina se rompe, es comprensible, K8S clusters necesidad de la red interna de comunicación entre los nodos, por lo que el VPN se rompe ... ¿cómo puedo hacer que funcione? la búsqueda en Google era frustrante, ninguna de las soluciones trabajado y no eran pocos, hay uno con problema similar: OpenVPN Cliente-Pod en K8s - red Local inalcanzable Pero no lo entiendo muy bien, por favor ayuda.
Desde IPVanish es bien conocido, vamos a tomar su ovpn ejemplo, yo uso otro vendedor, pero tenían acceso a un IPVanish cuenta y no funciona bien:
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
Acepto respuestas en Golang o YAML no importa, aunque yo uso el go-cliente, mi código para el pod es el de la creación:
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{})
Puedo agregar el NET_ADMIN
la capacidad, pero también tengo para dar acceso a la /dev/net/tun
dispositivo y ese es el problema, pero incluso Si puedo encontrar una manera, se romperá el trabajo en red interno.
Actualización de uno
He hecho la creación de redes externas de trabajo, mediante la adición de las dos líneas siguientes en mi ventana acoplable del punto 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