Docker VPN IPSec客户端没有特权访问
我有一个mysql数据库,我只能build立VPN连接后才能访问(IpSec共享密钥+用户名+密码)
所以我想运行一个孤立的docker容器,这将build立此连接和代理/公开的MySQL端口莫名其妙的容器可以连接到它,而不知道是否有一个VPN连接
所有我能find的例子 – 需要特权访问主机/networking(我想避免完全隔离容器逻辑)
所有我想要的是暴露从一个容器,可以build立ipsec-vpn访问远程主机的MySQL端口的MySQL端口
您可以在没有特权访问的情况下执行此操作,但需要NET_ADMIN
function,以便容器可以创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
映射到容器端口80
, socat
将该端口80
转发到ipinfo.io:80
。 转发通过VPN进行