通过 VPN 容器路由 Docker 容器流量

Route Docker Container traffic through a VPN container

我在 RockPro64(ARMv8 处理器版本 2(v8|) 运行 openmediavault(版本 4.1.27-1 Arrakis)上安装了几个容器. 一切都很顺利。

我使用的容器包括 Transmission、Jellyfin、Radarr、Sonarr、Jackett...等等。我希望能够通过 VPN 连接这些容器,以便连接更加私密。

理想的情况是我有一个 'VPN-container' 连接到我的 VPN 提供商(目前这是 PIA,但我想要一个灵活的解决方案)。我的其他容器将通过此容器连接到 Internet,以便它们具有 VPN 连接。

也许值得一提的是,我有两个容器(Jellyfin 和 Nextcloud),我可以通过域名从外部通过 Internet 访问它们。也许通过 VPN 连接它们会有所不同。

我找不到任何明确的指南来为我的设置提供解决方案。我希望有人可以提供一些关于从哪里开始的想法或分享对我有用的指南。

这看起来像是容器保护 传出 连接所需的内容:https://jordanelver.co.uk/blog/2019/06/03/routing-docker-traffic-through-a-vpn-connection/。你想用 --net container:name-of-vpn-container.

启动容器

我想如果你想让 incoming 容器通过 VPN,你需要确保 VPN 提供商给你一个静态 IP/hostname 并转发端口。我怀疑你不会想走这条路,因为它会很复杂。最好的办法是继续通过域名访问它们,只要确保它是通过 https* 并确保设备——你的 phone/tablet/laptop 无论你使用什么——都在 VPN 上。

* 只需查看 linuxserver.io 的出色工作即可了解更多信息:https://blog.linuxserver.io/2020/08/21/introducing-swag/

I 运行 radarr, sonarr, lidarr, bazarr, pyload, deluge, jellyfin, jackett, airsonic container behind PIA vpn through https://github.com/qdm12/gluetun (在 amd64 上,但也提供了 arm64 的图像).

它有很好的文档记录和积极维护。在撰写本文时,它支持 Private Internet Access、Mullvad、Windscribe、Surfshark、Cyber​​ghost、Vyprvpn、NordVPN、PureVPN 和 Privado。

对于 gluetun 容器,我用它来公开端口:

version: '3.7'
services:
  gluetun:
    image: qmcgaw/private-internet-access
    container_name: gluetun
    cap_add:
      - NET_ADMIN
    network_mode: bridge
    ports:
      - 8888:8888/tcp # HTTP proxy
      - 8388:8388/tcp # Shadowsocks
      - 8388:8388/udp # Shadowsocks
      - 8000:8000/tcp # Built-in HTTP control server
# other containers ports
      - 8112:8112     # deluge webui
      - 58846:58846   # deluge daemon
      - 6767:6767     # bazarr
      - 8989:8989     # sonarr
      - 7878:7878     # radarr
      - 8686:8686     # lidarr
      - 9117:9117     # jackett
      - 4040:4040     # airsonic
      - 8096:8096     # jellyfin/emby
      - 8227:8227     # pyload
    volumes:
      - ./data_gluetun:/gluetun
      - ./data_gluetun/port_forward:/tmp/gluetun/forwarded_port
    environment:
      - VPNSP=private internet access
      - TZ=Europe/London
      - USER=${PIA_USER}
      - PASSWORD=${PIA_PASS}
      - REGION=${PIA_REGION}
      - PORT_FORWARDING=on
      - FIREWALL_OUTBOUND_SUBNETS=192.168.1.0/24
      - HTTPPROXY=on
      - SHADOWSOCKS=on
      - SHADOWSOCKS_PASSWORD=${SHADOW_PASS}
    restart: unless-stopped

然后在我希望通过上述容器路由的容器中,我评论了任何现有的网络设置并将它们替换为 network_mode: "container:gluetun"

对于从外部本地网络访问的自动 letsencrypt 证书和反向代理,我使用 https://github.com/jc21/nginx-proxy-manager 与 arm 兼容的 mariadb yobasystems/alpine-mariadb:latest 运行ning 在具有 64 位 ubuntu 的 RPi4b 上服务器。