Kubernetes Pod 中的 OpenVPN 客户端

2023-11-24

我正在研究如何使 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

这是带有 OpenVPN 客户端的 Pod 的最小示例。我用了凯莱曼纳/openvpn作为服务器并生成基本的客户端配置。我只向生成的配置添加了两条路由以使其正常工作。见下文:

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes Pod 中的 OpenVPN 客户端 的相关文章

  • 在容器中运行多个相似的进程有意义吗?

    提供有关该问题的背景的简要背景 目前 我和我的团队正在将微服务迁移到 k8s 以减少维护多个部署工具和管道的工作量 我们计划迁移的微服务之一是 ETL Worker 它监听 SQS 上的消息并执行多阶段处理 它是使用 PHP Laravel
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 本地主机:8080 是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有什么区别本地主机 网络 vs 本地主机 8080 web TCP IP 连接始终与 IP 地址建立 您可以将 IP 地址视为某台计算机的
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • 如何使用 iPhone 将照片上传到服务器?

    我正在编写一个 iPhone 应用程序 它可以拍摄照片然后将其上传到服务器 如何使用 Cocoa 将照片上传到服务器 我想我在某处使用 NSUrl Thanks Header interface EPUploader NSObject NS
  • 无法使用 minikube 设置 Istio

    我按照 Istio 的官方文档为带有 minikube 的示例 bookinfo 应用程序设置了 Istio 但我得到了无法连接到服务器 net http TLS 握手超时错误 这些是我遵循的步骤 我安装了 kubectl 和 miniku
  • 具有相同容器端口的多个 docker 容器连接到同一网络

    我有一个依赖于多个 Docker 容器的应用程序 我使用 docker compose 以便所有这些都位于同一网络中以进行容器间通信 但是 我的两个容器正在各自容器内侦听相同的端口 8080 但是映射到主机上的不同端口 8072 8073
  • 如何为某些节点分配命名空间?

    有什么办法可以配置吗nodeSelector在命名空间级别 我只想在此命名空间的某些节点上运行工作负载 为了达到这个目的 你可以使用PodNodeSelector准入控制器 首先 您需要在您的kubernetes apiserver Edi
  • 调试断言失败。表达式(流!=NULL)

    我收到以下错误 调试断言失败 表达式 流 NULL 文件 f dd vctools crty bld self x86 crt src fwrite c 创建 4 个线程时 CPU 使用率 100 该代码最初运行良好一段时间 然后给出此错误
  • Kubernetes Ingress 在 nginx 反向代理后面运行

    我已经在可以从互联网访问的服务器上安装了 minikube 我创建了一个可用的 kubernetes 服务 gt kubectl get service myservice NAME CLUSTER IP EXTERNAL IP PORT
  • 如何防止两个卷声明在 Kubernetes 上声明同一个卷?

    在 GKE 上的 Kubernetes 集群上 我有以下持久卷声明 PVC kind PersistentVolumeClaim apiVersion v1 metadata name registry spec accessModes R
  • 从 Kubernetes Python 客户端登录到 GitLab 存储库

    我有一个 Django 应用程序 它使用python 的官方 Kubernetes 客户端 https github com kubernetes client python并且工作正常 但它只部署 正确 公共注册表 有没有办法执行登录后让
  • kubernetes,提示符在端口转发命令处冻结

    我想在在线指南之后设置从本地端口 节点 到 pod redis master 的端口转发库伯内特斯 https kubernetes io docs tasks access application cluster port forward
  • 如何使用 kubectl 了解有关先前发布版本的更多详细信息?

    有给出的命令here https kubernetes io docs reference kubectl cheatsheet updating resources其中解释了如何使用执行回滚kubectl 列出以前的部署版本的是 kube
  • Vagrant - 使用私有接口时如何配置 vagrant ssh?

    我有一个包含 3 个虚拟机的多虚拟机 vagrantfile 设置 其中两个虚拟机的 NAT 网络接口已禁用 并且仅在内部接口上使用静态 IP 副作用是我无法再跑步vagrant ssh foo连接到虚拟机 mode ruby vi set
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何在 Kubernetes 中按特定顺序配置 Pod 初始化?

    我想知道如何按特定顺序开始部署 我知道initContainers但这对我不起作用 我有一个巨大的平台 有大约 20 个部署和 5 个有状态集 每个都有自己的服务 环境变量 卷 水平自动缩放器等 所以不可能 或者我不知道如何 在另一个中定义
  • Kubernetes - 尝试部署时“安装卷失败”

    我部署了第一个容器 我得到了信息 deployment apps frontarena ads deployment created 但后来我看到我的容器创建陷入等待状态 然后我看到日志使用kubectl describe pod fron
  • 为什么 h_addr_list (在 hostent 结构中)类型为 char** 而不是 void*?

    我试图找出一段构建 hostent 对象的代码 更具体地说 它的工作部分是填充 h addr list 数组 我对分配到数组中的值被强制转换为这一事实感到困惑char 据我所知 这个数组与字符串无关 我注意到h addr list数组实际上
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock

随机推荐

  • QF_FPA? Z3支持IEEE-754算法吗?

    浏览 Z3 源代码 我发现了一堆引用 QF FPA 的文件 它似乎代表无量词 浮点算术 但是 我似乎无法找到有关其状态或如何通过各种前端 特别是 SMT Lib2 使用它的任何文档 这是 IEEE 754 FP 的编码吗 如果是这样 支持哪
  • 一个 Firefox 扩展,可以更改 about:config 中的值

    我一直在网络上广泛搜索一些微小的光 但一无所获 我需要创建一个 Firefox 扩展 除其他外 它还可以更改 about config 变量之一的值 我找到的教程都没有涵盖这个问题 所以我不知道从哪里开始 谁能给我一个链接 几行代码或解释
  • 如何使用 LINQ 从 List 中获取最接近的数字?

    如何从a中获取最接近的数字List
  • 使用适配器通过 MOXy 或任何其他 JAXB 实现将类编组到根元素

    我有一个类 它扩展了 Apache Commons Configuration 中的 CompositeConfiguration 类 我正在尝试使用 MOXy 将其编组为 XML 我创建了一个 XML 适配器 它将配置转换为简单名称 值对
  • 如何使用 php 删除 json 响应中的反斜杠(“\”)?

    我尝试使用 php 将一行 mysql 查询添加到 JSON 中 我使用这段代码 public function lugaresCercanos lng lat distance result mysql query SELECT nomb
  • 在运行时根据语法构建解析器

    许多 大多数 C 正则表达式库允许在运行时从字符串创建表达式 有谁知道任何 C 解析器生成器允许在运行时将表示为字符串的语法 最好是 BNF 输入到生成器中 我发现的所有实现要么需要运行显式代码生成器 要么需要通过巧妙的模板元编程来表达语法
  • 64 位 Windows 中的汇编系统调用

    我使用的是 Windows 10 安装了 Cygwin 我一直使用 Cygwin 来使用 Cygwin 安装的 gcc 和 nasm 来编译 汇编 c 和汇编程序 据我所知 nasm有一个 f win64模式 因此它可以汇编64位程序 现在
  • 标识列与主键[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我们如何决定使用身份列还是主键 这两个概念并不相互排斥 所有组合都是可能的 身份列也是主
  • 为什么此查询在存储过程中返回不同的结果?

    Synopsis 我有一个查询WHERE包含一个条件的子句 该条件根据可能为 NULL 的参数检查可 NULL 列 如下所示 SELECT FROM Table WHERE NullableColumn NullableParameter
  • Python Tkinter 笔记本小部件

    Using 这个蟒蛇食谱 我在我的 Tk 窗口上创建了一个类似笔记本的小部件 一切正常 直到我尝试将图像添加到每个选项卡中 当我将图像添加到选项卡中时 我最初设置的文本不再显示 我想知道是否可以使文本 在本例中为 选项卡一 显示在图像正下方
  • Node.js 网络库:从“data”事件获取完整数据

    我四处寻找 要么找不到我想要回答的确切问题 要么我需要有人像我 5 岁一样向我解释 基本上 我有一个使用 Net 库的 Node js 脚本 我正在连接到多个主机 发送命令 并监听返回数据 var net require net var n
  • 使用 WKWebView 拉动刷新

    我正在尝试将刷新拉动添加到 WKWebView 在这段代码中 我应该在哪里添加一些东西来允许我触发拉动刷新 我还没有找到任何可行的方法将其添加到我的代码中 因此您不会在下面的代码中找到我尝试完成此操作的任何尝试 我找到的大多数答案都是 Ob
  • 添加高斯噪声

    我有一个 arff文件 其中包含浮点数列表 我需要向每个数字添加高斯噪声 在 MATLAB 中为 m m k randn size m where m是列表中的数字之一 并且k是一个标准差并且有值0 1 是什么C 相当于randn 您能举个
  • Hibernate Envers - 不为 createQuery(...).executeUpdate() 写入审核记录,仅为 .persist() 和 .merge() 写入审核记录

    我有 3 种方式将数据写入数据库 public void create T object entityManager persist object public void update T object object entityManag
  • 寻找一个 O(1) 索引和 O(log(n)) 插入和删除的数据容器

    我不确定这是否可能 但对我来说似乎有点合理 我正在寻找一种允许我执行这些操作的数据结构 插入一个项目的时间复杂度为 O log n 删除一个项目的时间复杂度为 O log n 查找 编辑 O 1 中的第 k 个最小元素 对于任意 k O 1
  • 条带连接错误

    我有以下后端 Node js 代码来连接到我的 Stripe 帐户以进行收费 但我收到这个错误 我正在使用 Firebase 函数 并且此功能以前可以工作 因此我怀疑这与 Firebase 访问限制有关 对此的任何想法和帮助将不胜感激 va
  • Firebase 云消息传递 HTTP V1 API:如何通过 REST 调用获取 Auth 2.0 访问令牌?

    为了使用HTTP V1 API 不是旧版 API 对于 PHP 必须使用 REST 接口 https firebase google com docs cloud messaging send message top of page 我想知
  • 跟踪大型 XML 文件的加载进度

    我尝试跟踪 dotnet C 框架 3 5 SP1 中大 XML 文件 我不是这些文件的提供者 的加载进度 通过网络文件共享从 1 MB 到 300 MB 我使用 XmlReader 进行加载 而不是直接使用 XmlDocument Loa
  • 错误:“致命:使用捆绑安装时我不处理协议“git”

    我的 GemFile 中有以下行 gem rails git gt git github com rails rails git 我收到以下错误 Fetching git github com rails rails git fatal I
  • Kubernetes Pod 中的 OpenVPN 客户端

    我正在研究如何使 OpenVPN 客户端在 Pod 的容器上工作 我解释了我所做的事情 但是您可以跳过我的所有解释并直接提供您的解决方案 如果可行的话 我不在乎将以下所有内容替换为您的步骤 我想让我的容器以外部和内部网络都可以工作的方式使用