允许Docker容器在主机隧道接口上连接到OpenVPN客户端


12

我有以下设置:

  • 运行docker服务的CentOS主机
  • 用户定义的Docker桥接网络
  • 2个Docker容器连接到该用户定义的桥接网络
  • OpenVPN安装(当前在主机上运行。也可以在docker容器中运行)
  • 一些客户端连接到OpenVPN

如何允许docker bridge网络上的docker容器与tun0网络上的openvpn客户端通信?

我希望能够以透明方式在docker1(10.10.0.3)与连接到vpn(172.19.0.x范围)的客户端之间进行基于tcp的通信。

我需要在docker(网络/ iptables / ...)端和主机(iptables?)端设置什么


1
也许已经晚了,但是对于您而言,我认为您需要tap,坚果tun,到目前为止,我已经进行了超过12个小时的工作,但没有成功。
Mohammed Noureldin

@MohammedNoureldin你们找到了解决方案吗?我也在考虑现在要点击设备。令人沮丧的是,我可以从ovpn容器中访问vpn客户端。从vpn客户端,我可以访问同一Docker网络上的其他容器。但是,ovpn容器内的“ eth0”和tun0之间的转发不起作用。我猜这是由于tun0自然与水龙头造成的。
惠更斯(Huygens)

@Huygens,是的,我已经解决了,请问一个单独的问题,并给我一个参考,我会尽力为您提供帮助。
Mohammed Noureldin

1
嗨@MohammedNoureldin,我发现2条缺少的说明可以正常工作。他们在openvpn手册页中。我将尽快为其他人发布该问题的答案。
惠更斯(Huygens)

1
@Huygens,很高兴知道,实际上我还没有时间发布答案,但是我很想知道对您的情况有用的方法。
Mohammed Noureldin

Answers:


7

语境

我一直在使用来自Kyle Manna(https://github.com/kylemanna/docker-openvpn)的非常好的Docker容器。我正在使用所谓的“偏执狂”文档来设置我的OpenVPN服务器,但是我认为这应该是标准方式,而不是偏执狂方式。

组态

为了允许选定的Docker容器和VPN客户端之间进行双向连接,您需要创建一个Docker网络,您将在该网络上附加容器,VPN客户端应允许该容器访问。VPN服务器将成为这些容器之一。

VPN服务器应具有client-to-clienttopology subnetdev tun0(或其它tun设备)和push "route <docker net IP> <docker net mask>"配置。

VPN服务器的主机应配置为支持将IP数据包从一个子网转发到另一个子网。这意味着将sysctl ip_forward设置为1(如果已安装Docker,则应该是这种情况),允许来自tun设备的数据包通过iptables FORWARD链并设置正确的路由。可以使用以下命令进行总结:

$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via <IP address of OpenVPN server container>

无论如何,这是我用来设置服务器的选项:

$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<FQDN> -N -d -c -p "route <docker net IP> <docker net range>" -e "topology subnet"

这将生成类似于以下内容的服务器配置文件:

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.example.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.example.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
client-to-client

### Push Configurations Below
push "dhcp-option DNS 8.8.8.8"
push "route 172.20.20.0 255.255.255.0"

### Extra Configurations Below
topology subnet

具体例子

我现在将举一个具体的例子。在此示例中,我将在主机vpn.example.com上的Docker内部运行上述OpenVPN服务器。该容器已附加到Docker网络docker-net-vpn。这是命令(在此示例中,我直接在服务器上生成服务器配置,而跳过CA生成,请改用上述项目的偏执文档):

$ docker network create --attachable=true --driver=bridge --subnet=172.20.20.0/24 --gateway=172.20.20.1 docker-net-vpn
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.example.com -N -d -c -p "route 172.20.20.0 255.255.255.0" -e "topology subnet"
$ docker run --detach --name openvpn -v $PWD/files/openvpn:/etc/openvpn --net=docker-net-vpn --ip=172.20.20.2 -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via 172.20.20.2

第一条命令创建一个专用的新Docker网络,该网络定义了一个新子网。我们将OpenVPN服务器连接到该网络。

第二个使用与第一个命令中定义的子网相同的子网创建OpenVPN配置。

第三个创建OpenVPN服务器。它连接到新创建的Docker网络并使用修复IP。

第四和第五命令配置IP转发。

最后一条命令通过OpenVPN容器固定IP向VPN客户端配置添加新路由。

注意

我还没有尝试过,但是应该可以限制iptables的FORWARD规则。Docker网络的创建创建了一个新的桥接设备。该桥的名称br-<ID>是Docker网络ID的前12个字符。可以使用获取此ID docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12。因此,以下命令可能更具限制性(因此在安全方面更好),但仍应允许我们的流量被路由:

$ NET_VPN_BRIDGE="br-$(docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12)"
$ sudo iptables -A FORWARD -i tun+ -o ${NET_VPN_BRIDGE} -j ACCEPT

嘿,无法使它正常工作,我可以追踪到192.168.255.6并得到:1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H,但是我无法ping或到达开放端口。
GuySoft '18

@GuySoft,您好,traceroute报告的是您的最后一跳(172.20.20.1)无法到达主机192.168.255.6。因此,这意味着您的路由表可能不正确。我们可以聊天看看问题出在哪里吗?
惠更斯

它开始工作,我想发生的是两台计算机都安装了docker,并且都安装了子网172.20.20.1,这使事情发生了冲突,我需要找到一种方法使docker不创建会在客户端计算机上发生冲突的子网。 。
GuySoft '19

如果使用Docker Compose,则可以指定网络应使用的IP地址范围。请参阅撰写文档。也可以从命令行使用来完成docker network…
惠更斯(Huygens)

我认为即时通讯未将与主机(主机ip + openvpn端口)的连接路由到openvpn容器(172.20.20.2)的部分
jtomasrl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.