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

时间:2017-09-28 15:02:36

标签: docker vpn

我有一个mysql数据库,只有在建立VPN连接后才可以访问(IpSec-shared-secret + username + password)

所以我想运行一个隔离的docker容器,它将建立这个连接并以某种方式代理/暴露mysql端口,这样其他容器就可以连接到它而不知道是否存在vpn连接

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

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

1 个答案:

答案 0 :(得分:2)

您可以在没有特权访问的情况下执行此操作,但需要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

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

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

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

socat TCP4-LISTEN:80,reuseaddr,fork TCP4:ipinfo.io:80 2>&1 >/dev/null &

socat TCP4-LISTEN:3306,reuseaddr,fork TCP4:<YourMYSQLIP>:3306 2>&1 >/dev/null &

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

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

version: "3"

services:
  vpn:
    build: .
    cap_add:
      - NET_ADMIN
    ports:
      - 3306:3006
      - 8080:80
    dns:
      - 8.8.8.8

现在执行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"
}

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