【发布时间】:2022-01-02 10:43:35
【问题描述】:
我正在研究如何让 OpenVPN 客户端在 pod 的容器上工作,我解释了我的工作,但您可以跳过我的所有解释并直接提供您的解决方案,如果您将以下所有内容替换为您的步骤,我不在乎它可以工作,我想让我的容器以外部和内部网络都可以工作的方式使用 VPN(例如 ExpressVPN)。
我有一个 docker 镜像,它是一个 OpenVPN 客户端,它可以使用以下命令查找:
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 会中断它......我该怎么做工作?谷歌搜索令人沮丧,没有一个解决方案有效,只有几个,有一个有类似问题:OpenVPN-Client Pod on K8s - Local network unreachable 但是不是很明白,请大家帮忙。
由于 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
【问题讨论】:
-
您能否提供问题中错误的完整详细信息?
-
@gohm'c 我的问题很简单,我只是没有互联网连接,既没有内部也没有外部,现在我做了改进,我做了外部网络工作,但没有内部网络。请查看更新
-
嗨,@Melardev。现在您已经完成了外部连接,我想您与链接帖子中的人处于同一位置。尝试配置两条路由:一条用于 Kubernetes 服务子网,一条用于 pod 子网。通常,它们分别是
10.43.0.0/16和10.42.0.0/16,但最好检查一下。例如,使用这一行route 10.42.0.0 255.255.0.0 net_gateway,您告诉我们要到达10.42.0.0/16中的任何IP,数据包应该通过默认网关而不是VPN 隧道。换句话说,除了10.42.0.0/16中的 IP,所有流量都通过 VPN。 -
@anemyte 嗨,谢谢,但仍未解决,使用 kubectl get pod -o wide(有更好的命令吗?)我看到 pod 的内部 IP 是 192.168.87.228,所以在我的 . ovpn 文件我添加了
route 192.168.0.0 255.255.0.0 net_gateway以及上面的两行(10.43.0.0 和 10.42.0.0 以防万一),作为测试,我在主机上的端口 3002 上有一个 http 服务器,尝试 curl 192.168.1.138 不起作用VPN,没有 VPN 工作,这是路由前后的输出:gist.github.com/melardev/9a1c9653ac41835625469ed1e5b6b77b -
@Melardev 请添加您使用的
curl命令以及traceroute示例,稍后我会对此进行研究。
标签: kubernetes networking vpn openvpn