我正在研究如何使 OpenVPN 客户端在 Pod 的容器上工作,我解释了我所做的事情,但是您可以跳过我的所有解释并直接提供您的解决方案,如果可行的话,我不在乎将以下所有内容替换为您的步骤,我想让我的容器以外部和内部网络都可以工作的方式使用 VPN(例如 ExpressVPN)。
我有一个作为 OpenVPN 客户端的 docker 镜像,它可以与以下命令配合使用:
docker run --rm -it --cap-add=NET_ADMIN --device=/dev/net/tun my-app /bin/bash
docker 镜像有一个入口点 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 Pod 中的容器时,它崩溃了,这是可以理解的,K8S 集群需要节点之间的内部网络通信,因此 VPN 破坏了它......我该如何让它工作?谷歌搜索令人沮丧,没有一个解决方案有效,而且只有几个,有一个有类似的问题:K8s 上的 OpenVPN-Client Pod - 本地网络无法访问但不太明白,请帮忙。
由于 IPVanish 众所周知,让我们以他们的 ovpn 为例,我使用其他供应商,但可以访问 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-client,但我的 pod 创建代码是:
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
设备,这就是问题所在,但即使我找到办法,它也会破坏内部网络。
更新一
我通过在 Docker 的入口点中添加以下两行来使外部网络正常工作:
# 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