没有特权访问的Docker VPN IPSec客户端

Pyd*_* UA 6 vpn docker

我有一个 mysql 数据库,只有在建立 VPN 连接后才能访问(IpSec-shared-secret + 用户名 + 密码)

所以我想运行一个隔离的 docker 容器,它将以某种方式建立这个连接和代理/公开 mysql 端口,以便其他容器可以连接到它而不知道是否有 vpn 连接

我能找到的所有示例 - 需要对主机/网络的特权访问(我想避免完全隔离容器逻辑)

我想要的只是从容器中公开 mysql 端口,该容器可以建立对远程主机的 mysql 端口的 ipsec-vpn 访问

Tar*_*ani 4

您可以在没有特权访问的情况下执行此操作,但NET_ADMIN需要功能,以便容器可以创建并隧道接口。

为了测试配置,我从以下网站选择了免费 VPN 服务

https://www.vpnbook.com/freevpn

下载此[文件] ( https://www.vpnbook.com/free-openvpn-account/VPNBook.com-OpenVPN-US1.zip )

我在下面创建了Dockerfile相同的

FROM ubuntu:16.04
RUN apt update && apt install -y openvpn curl socat wget ca-certificates openssl
WORKDIR /openvpn/config
COPY vpnbook-us1-tcp80.ovpn .
COPY start.sh /start.sh
ENV OPENVPN_USERNAME=vpnbook OPENVPN_PASSWORD=dup2atu
CMD /start.sh
Run Code Online (Sandbox Code Playgroud)

在 中vpnbook-us1-tcp80.ovpn,我对 进行了一个小更改auth-user-pass并进行了修改auth-user-pass openvpn-credentials,以便我们可以从文件传递凭据。接下来是创建一个start.sh

#!/bin/sh

mkdir -p /dev/net && mknod /dev/net/tun c 10 200

printf "$OPENVPN_USERNAME\n$OPENVPN_PASSWORD" > openvpn-credentials
chmod 600 openvpn-credentials

socat TCP4-LISTEN:80,reuseaddr,fork TCP4:ipinfo.io:80 2>&1 >/dev/null &
exec openvpn --inactive 3600 --ping 10 --ping-exit 60 --config vpnbook-us1-tcp80.ovpn
Run Code Online (Sandbox Code Playgroud)

mknod /dev/net/tun c 10 200在运行时在容器内创建一个 tun 设备,因此我们不需要从主机映射它。

由于您希望其他容器通过连接到此容器来访问mysql,因此您将在下面进行更改

socat TCP4-LISTEN:80,reuseaddr,fork TCP4:ipinfo.io:80 2>&1 >/dev/null &
Run Code Online (Sandbox Code Playgroud)

socat TCP4-LISTEN:3306,reuseaddr,fork TCP4:<YourMYSQLIP>:3306 2>&1 >/dev/null &
Run Code Online (Sandbox Code Playgroud)

这样做的作用是监听容器上的本地端口 X,并将该请求转发到您提供的 IP/域上的端口 Y。然后我们可以将此端口映射到主机或直接通过容器访问它们。

为了运行整个过程,我做了一个简单的docker-compose.yml

version: "3"

services:
  vpn:
    build: .
    cap_add:
      - NET_ADMIN
    ports:
      - 3306:3006
      - 8080:80
    dns:
      - 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

现在,在完成docker-compose up -d并等待几秒钟后,我在主机上运行以下命令

$ curl -H "Host: ipinfo.io" localhost:8080/json
{
  "ip": "198.7.62.204",
  "hostname": "us1.vpnbook.com",
  "city": "Manassas",
  "region": "Virginia",
  "country": "US",
  "loc": "38.7701,-77.6321",
  "org": "AS30633 Leaseweb USA, Inc.",
  "postal": "20109"
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,localhost:8080已映射到容器端口80并将socat该端口转发80ipinfo.io:80. 转发是通过 VPN 进行的