Я смотрю на то, как заставить OpenVPN-клиент работать с контейнером модуля, я объясняю, что я делаю, но вы можете пропустить все мои объяснения и предложить свое решение напрямую, мне все равно, заменяя все нижеперечисленное вашими шагами, если это сработает, я хочу, чтобы мой контейнер использовал VPN (например, ExpressVPN) таким образом, чтобы работали как внешние, так и внутренние сети.
У меня есть образ докера, который является клиентом OpenVPN, он работает с командой найти:
docker run --rm -it --cap-add=NET_ADMIN --device=/dev/net/tun my-app /bin/bash
На изображении докера был скрипт 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
Он работает нормально, но когда я развертываю его в качестве контейнера в модуле K8S, он ломается, это понятно, кластерам K8S требуется внутренняя сетевая связь между узлами, поэтому VPN его ломает ... как мне заставить это работать? поиск в Google был разочаровывающим, ни одно из решений не работало, и их было всего несколько, есть одно с аналогичной проблемой: OpenVPN-Клиентский модуль в K8s - Локальная сеть недоступна Но я не очень хорошо это понял, пожалуйста, помогите.
Поскольку IPVanish хорошо известен, давайте возьмем их пример ovp, я использую другого поставщика, но у меня был доступ к учетной записи IPVanish, и она тоже не работает:
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
Я принимаю ответы на Golang или YAML, это не имеет значения, хотя я использую go-клиент, мой код для создания модуля:
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{})
Я могу добавить NET_ADMIN
возможности, но мне также нужно предоставить доступ к /dev/net/tun
устройство, и в этом проблема, но даже если я найду способ, это нарушит внутреннюю сеть.
Обновление одно
Я заставил работать внешнюю сеть, добавив следующие две строки в точку входа моего докера:
# 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