所以我对 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 配置将不会保留!然后您必须重做它们。可能有一种方法可以自动执行此操作,但到目前为止我还没能做到。无论如何。感谢您的阅读,我希望这对您有所帮助。