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

我有一个mysql数据库,我只能build立VPN连接后才能访问(IpSec共享密钥+用户名+密码)

所以我想运行一个孤立的docker容器,这将build立此连接和代理/公开的MySQL端口莫名其妙的容器可以连接到它,而不知道是否有一个VPN连接

所有我能find的例子 – 需要特权访问主机/networking(我想避免完全隔离容器逻辑)

所有我想要的是暴露从一个容器,可以build立ipsec-vpn访问远程主机的MySQL端口的MySQL端口

您可以在没有特权访问的情况下执行此操作,但需要NET_ADMINfunction,以便容器可以创build和通道接口。

为了testingconfiguration,我select了一个免费的VPN服务

https://www.vpnbook.com/freevpn

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

我在Dockerfile创build了相同的

 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 ,因此我们可以从文件传递凭据。 接下来是创build一个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在容器内部的运行时创build一个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. 然后,我们可以将这些端口映射到主机或通过容器直接访问它们。

为了运行整个事情,我做了一个简单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映射到容器端口80socat将该端口80转发到ipinfo.io:80 。 转发通过VPN进行