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