我有一个 mysql 数据库,只有在建立 VPN 连接后才能访问(IpSec-shared-secret + 用户名 + 密码)
所以我想运行一个隔离的 docker 容器,它将以某种方式建立这个连接和代理/公开 mysql 端口,以便其他容器可以连接到它而不知道是否有 vpn 连接
我能找到的所有示例 - 需要对主机/网络的特权访问(我想避免完全隔离容器逻辑)
我想要的只是从容器中公开 mysql 端口,该容器可以建立对远程主机的 mysql 端口的 ipsec-vpn 访问
您可以在没有特权访问的情况下执行此操作,但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该端口转发80到ipinfo.io:80. 转发是通过 VPN 进行的
| 归档时间: |
|
| 查看次数: |
2205 次 |
| 最近记录: |