OpenVPN Client in Kubernetes Pod

0

Domanda

Sto cercando di fare un client OpenVPN lavoro su un contenitore di contenitore, spiego quello che voglio fare, ma si può saltare tutta la mia spiegazione e di offrire la soluzione direttamente, non mi importa di sostituzione di tutti i sotto con i vostri passi se funziona, voglio fare il mio contenitore di utilizzare una VPN (ExpressVPN per esempio) in modo che sia esterna che interna di rete funziona.

Ho una finestra mobile di immagine che è un Client OpenVPN, funziona con il comando:

docker run --rm -it --cap-add=NET_ADMIN --device=/dev/net/tun my-app /bin/bash

La finestra mobile immagine aveva un punto di ingresso script 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

Funziona bene, ma quando ho distribuito come un contenitore in un K8S Pod, si rompe, è comprensibile, K8S cluster devono rete interna di comunicazione tra i nodi, in modo che il VPN si rompe ... come faccio a farlo funzionare? la ricerca di Google è stato frustrante, nessuna delle soluzioni ha funzionato e ci sono stati pochi, c'è uno con un problema simile: OpenVPN Client-Pod, K8s - rete Locale irraggiungibile Ma non ho capito molto bene, si prega di aiuto.

Dal IPVanish è noto, diamo loro ovpn esempio, io uso un altro fornitore, ma ha avuto accesso a una IPVanish account e non funziona comunque:

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

Accetto risposte in Golang o YAML non importa, anche se io uso go-client, il mio codice pod creazione è:

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 aggiungere il NET_ADMIN capacità, ma ho bisogno anche di dare accesso alla /dev/net/tun dispositivo e questo è il problema, ma io, anche Se trovare un modo, si rompe rete interna.

Aggiornamento

Ho fatto esterno funzionare la rete, aggiungendo le due righe seguenti nel mio mobile del punto di ingresso:

# 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

Migliore risposta

2

Qui è un esempio minimale di un contenitore con un client OpenVPN. Ho usato kylemanna/openvpn come server e generare una base di configurazione del client. Ho aggiunto solo due strade per la configurazione generata per farlo funzionare. Vedere di seguito:

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

grazie per l'aiuto, questa è la soluzione che stavo cercando.
Melardev
0

Provare Tailscale. https://tailscale.com/ È molto più semplice. E hanno un cool free-tier

2021-11-25 08:21:17

Grazie per il suggerimento, non sapevo niente, ma non è esattamente quello che stavo cercando
Melardev

Io sono in esecuzione in un k8s cluster. Si rende il gateway VPN per il cluster in modo vedo i baccelli sulla mia macchina locale come se fossero sulla mia rete locale. Si tratta di un 10 minuti di installazione e ...funziona. C'è un openVPN confronto qui : tailscale.com/kb/1170/tailscale-vs-openvpn
Pierre

In altre lingue

Questa pagina è in altre lingue

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