使用 Dockerized OpenVPN-Server进行端口转发

使用 Dockerized OpenVPN-Server进行端口转发

所以我对 VPN 的东西有点陌生,目前有点绝望。

对于我想做的事情。我在某处租了一台小型服务器(静态 IP、域名等)。现在我想通过 docker 在该服务器上运行一些服务。这些服务不应仅供所有人访问,而应仅通过与服务器的有效 VPN 连接才能访问。(防火墙目前阻止从外部访问这些端口)

据我所知,我可以通过 VPN 和端口转发实现这一点,但肯定是我在根本层面上误解了一些东西。

无论如何,我有一个通过 docker compose 运行的 OpenVPN-Server:

version: '2'
services:
  openvpn:
    cap_add:
     - NET_ADMIN
    image: kylemanna/openvpn
    container_name: openvpn
    ports:
     - "1194:1194/udp"
    restart: always
    volumes:
     - ./openvpn-data/conf:/etc/openvpn

我跟着本教程对其进行配置。我可以使用客户端软件顺利连接到 VPN,但现在我不知道如何配置它,以便一旦连接,我就可以调用服务器上端口 8080 上的服务。

到目前为止,我还没有找到任何可以帮助我进行设置的答案,所以我希望这里有人可以帮助我。我尝试在同一个docker网络中运行该服务,并配置VPN,但没有成功。

提前感谢您并祝您有美好的一天。

在“盲点”问题后提供具体信息

OpenVPN.conf

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/www.mysite.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/www.mysite.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup

### Push Configurations Below
push "dhcp-option DNS 192.168.13.6"
push "dhcp-option DOMAIN mysite.com"
push "route 192.168.192.0 255.255.255.0"

对于故障排除结果:在我修复了压缩问题我发现,上面提到的每一个步骤这里很满意。

对于我实现的目标和想要实现的目标。配置文件的最后一部分push "route 192.168.192.0 255.255.255.0"添加了一个 docker 网络,这是我定义的,openVPN 容器以及一些其他容器都连接到该网络(当然,所有这些都在服务器上发生)。

当我的 openVPN 客户端连接时,它会获得 IP 192.168.192.6,正如预期的那样,我可以 ping 192.168.192.1 上的 192.168.192.0/20 网关以及连接到所述 docker 网络的所有容器。现在一切正常。我还没能实现的是连接到其中一个容器端口。

例如,我有一个正在运行的 teamcity 容器,它连接到 docker 网络。我可以 ping 它,但无法通过我为其定义的端口(比如说端口 8080)访问它。我想为我的 openVPN 客户端转发该端口,但我不知道该怎么做。这就是仍然存在的问题。

答案1

我找到了问题的解决方案。我将在这里详细介绍如何实现我想要的。对于所有只对 openVPN 配置感兴趣的人,可以跳到:“端口转发”部分:

因此,我想要实现的是在我的服务器上运行一个 openVPN 容器,以及一些其他私有容器,我希望任何有 VPN 连接的人都可以访问这些容器。问题是如何配置 openVPN 来实现这一点,而不是如何最初设置它,但无论如何我都会描述整个过程

Docker 组成

version: '2'
networks:
  openvpn:
    name: openvpn
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.192.0/20
          gateway: 192.168.192.1
  research_network:
    name: research_network
volumes:
  research-data:
    name: research-data
  uploads:
    name: research_uploads
  storage-uploads:
    name: research_storage-uploads

services:
  openvpn:
    container_name: openvpn_server
    image: kylemanna/openvpn
    cap_add:
     - NET_ADMIN
    ports:
     - "4223:1194/udp"
    volumes:
     - ./openvpn-data/conf:/etc/openvpn
    networks:
      openvpn:
        ipv4_address: 192.168.192.2

  mysql:
    container_name: research_DB
    image: mysql:8.0
    depends_on:
      - openvpn
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${RESEARCH_DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=research
      - MYSQL_USER=${RESEARCH_DB_USER}
      - MYSQL_PASSWORD=${RESEARCH_DB_PASSWORD}
    volumes:
      - research-data:/var/lib/mysql
    networks:
      - research_network
  bookstack:
    container_name: research
    image: solidnerd/bookstack:22.10.2
    depends_on:
      - research_DB
    restart: always
    environment:
      - DB_HOST=research_DB:3306
      - DB_DATABASE=research
      - DB_USERNAME=${RESEARCH_DB_USER}
      - DB_PASSWORD=${RESEARCH_DB_PASSWORD}
      - APP_URL=http://192.168.255.1:8080
    volumes:
      - uploads:/var/www/bookstack/public/uploads
      - storage-uploads:/var/www/bookstack/storage/uploads
    networks:
      research_network:
      openvpn:
          ipv4_address: 192.168.192.3

这是一个带有 openVPN 实例和示例服务的示例 docker-compose.yml 文件。

创建一个 docker 网络:192.168.192.0/20,它连接所有服务。在本例中是 openVPN 以及 bookstack 实例。这对后面的内容很重要。

设置 OpenVPN

您可以关注本教程并根据您想要实现的目标做出必要的改变。

我变了:

docker-compose run --rm openvpn ovpn_genconfig -N -d -n 192.168.13.6 -u udp://vpn.mycompany.net -p "dhcp-option DOMAIN mycompany.net" -p "route 192.168.13.0 255.255.255.0" -p "route 172.17.0.0 255.255.0.0"

因此:

docker-compose run --rm openvpn ovpn_genconfig -N -d -n 192.168.13.6 -u udp://vpn.mycompany.net -p "dhcp-option DOMAIN mycompany.net" -p "route 192.168.192.0 255.255.255.0"

这将使我们之前创建的 docker 网络可用于 VPN。其余部分将正常工作

故障排除

在进入有趣的部分之前,我想提一下故障排除部分。本教程提供了几个步骤,尽管建立了连接,但我无法 ping 192.168.255.1(这是 VPN 容器的默认网关),之后我按照这些步骤操作。我花了一段时间才注意到原因。

使用:

docker logs <yourOpenVpnContainerName

我注意到一大块“坏压缩存根解压缩头字节:xx”。这是由于 OpenVPN 服务器版本和客户端版本的压缩不兼容造成的。如果您感兴趣,可以阅读它,但要修复它,请转到“openvpn.conf”文件并删除任何提及:“comp-lzo no”的内容。这将修复它。

转发端口

现在我们进入我的问题部分。配置端口转发。

要测试一切是否正常,请从客户端计算机 ping 192.168.192.1,即 docker 网络的默认网关(至少在此示例中,在 docker-compose 中定义)(当然,前提是您有常设 VPN 连接)。如果一切正常,请继续。如果不行,则说明您的配置有问题。

我们不必进入 openVPN 容器 bash 来配置 iptables。为此使用:

docker exec -ti -u 0 <OpenVpnContainerName> /bin/bash

(-u 0 让你成为 root)

一旦进入运行

iptables -t nat -A PREROUTING -d 192.168.255.1 -p tcp --dport 8080 -j DNAT --to-dest 192.168.192.3:8080

iptables -t filter -A INPUT -p tcp -d 192.168.255.1 --dport 8080 -j ACCEPT

这会将 bookstack 实例转发到 192.168.255.1:8080 上的所有 VPN 客户端。您可以根据自己的使用情况进行相应更改。这将起作用并实现我最初想要的功能。

注意:这不会永久起作用。如果 OpenVPN 容器停止,这些 iptable 配置将不会保留!然后您必须重做它们。可能有一种方法可以自动执行此操作,但到目前为止我还没能做到。无论如何。感谢您的阅读,我希望这对您有所帮助。

相关内容