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