Cliente OpenVPN en Kubernetes Pod

0

Pregunta

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
kubernetes networking openvpn vpn
2021-11-24 00:17:46
2

Mejor respuesta

2

Aquí es un ejemplo mínimo de un pod con el cliente de OpenVPN. He utilizado kylemanna/openvpn como un servidor y generar un básico de configuración de cliente. Sólo he añadido dos rutas para generar el config para hacer el trabajo. Ver a continuación:

apiVersion: v1
kind: Pod
metadata:
  name: ovpn
  namespace: default
spec:
  containers:
    - name: ovpn
      image: debian:buster
      args:
        - bash
        - -c
        # install OpenVPN and curl; use curl in an endless loop to print external IP
        - apt update && apt install -y openvpn curl && cd /config && openvpn client & while sleep 5; do echo $(date; curl --silent ifconfig.me/ip); done
      volumeMounts:
        - mountPath: /dev/net/tun
          readOnly: true
          name: tun-device
        - mountPath: /config
          name: config
      securityContext:
        capabilities:
          add: ["NET_ADMIN"]
  volumes:
    - name: tun-device
      hostPath:
        path: /dev/net/tun
    - name: config
      secret:
        secretName: ovpn-config
---
apiVersion: v1
kind: Secret
metadata:
  name: ovpn-config
  namespace: default
stringData:
  client: |

    # A sample config generated by https://github.com/kylemanna/docker-openvpn server
    client
    nobind
    dev tun

    # Remote server params
    remote PASTE.SERVER.IP.HERE 1194 udp

    # Push all traffic through the VPN
    redirect-gateway def1
    # except these two k8s subnets
    route 10.43.0.0 255.255.0.0 net_gateway
    route 10.42.0.0 255.255.0.0 net_gateway

    # Below goes irrelevant TLS config
    remote-cert-tls server
    <key>
    -----BEGIN PRIVATE KEY-----
    -----END PRIVATE KEY-----
    </key>
    <cert>
    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    </cert>
    <ca>
    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    </ca>
    key-direction 1
    <tls-auth>
    #
    # 2048 bit OpenVPN static key
    #
    -----BEGIN OpenVPN Static key V1-----
    -----END OpenVPN Static key V1-----
    </tls-auth>
2021-11-24 18:42:15

gracias por la ayuda, esta es la solución que estaba buscando.
Melardev
0

Trate De Tailscale. https://tailscale.com/ Es mucho más simple. Y tienen un lugar fresco libre de capa de

2021-11-25 08:21:17

Gracias por la sugerencia, yo no sabía nada, pero no es exactamente lo que estaba buscando
Melardev

Yo lo tengo corriendo en un k8s clúster. Se hace una puerta de enlace VPN para el clúster así que no veo las vainas en mi máquina local como si estuvieran en mi red local. Es una de las 10 mn de instalar y sólo ...funciona. Hay un openVPN comparación aquí : tailscale.com/kb/1170/tailscale-vs-openvpn
Pierre

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................