我如何确保 openVPN 客户端持续使用相同的 VPN IP 地址?
我已在 /etc/openvpn/ccd/ 中添加client-config-dir ccd
并openvpn.conf
创建了包含客户端名称的文件,例如“/etc/openvpn/ccd/CLIENTNAME”仅包含 192.168.255.20,但此 IP 地址未分配给与 CLIENTNAME.ovpn 连接的客户端
就上下文而言,VPN 的目的是允许多个远程客户端从任意位置相互访问,但它们应该对其他所有东西使用默认的本地路由:www PoE 摄像头等。OpenVPN 服务器在 docker 中使用https://github.com/kylemanna/docker-openvpn
因此客户端证书/ovpns 生成如下: docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
客户端是 Ubuntu 16.04 上的 OpenVPN 2.4.7
我的本地 .ovpn 配置
client
nobind
dev tun
remote-cert-tls server
remote XXX.XXX.XXX.XXX 1194 udp
# only route the subnet
route-nopull
route 192.168.255.0 255.255.255.0
# various certificates / keys
我的服务器 openvpn.conf
# client specific configurations
client-config-dir ccd
# allow clients to reach other
client-to-client
server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/XXX.XXX.XXX.XXX.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/XXX.XXX.XXX.XXX.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
comp-lzo no
### Route Configurations Below
route 192.168.254.0 255.255.255.0
### Push Configurations Below
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "comp-lzo no"
答案1
客户端配置目录文件不是这样工作的。它应该包含与您插入主配置文件相同的 OpenVPN 选项。当该客户端连接时,这些选项将使用为该客户端设置的上下文执行。
要使用 CCD 文件设置客户端 IP 地址,请插入ifconfig-push 命令进入其CCD文件:
ifconfig-push 192.168.255.18 192.168.255.17
我稍微改变了地址,因为看起来您正在使用net30
拓扑,因此客户端需要有 4n+2 个地址,而其本地 OpenVPN 内部地址是 4n+1。
更简单的方法是使用一个ifconfig-pool-persist
选项,在其中指定文件来存储 cname-ip 关联。服务器启动时读取此文件。如果连接的客户端仍然没有关联,则分配其地址并将更新的表保存在内存中。服务器关闭时,它会写入磁盘。(我描述这一点是为了让您不要在服务器运行时尝试修改此文件 - 它将会被覆盖。)这样您就不必费心创建 CCD 文件。但是,有时客户端可能会获得另一个地址。这些情况是:客户端太多(多于池中的地址)或duplicate-cn
启用了选项。
第三种方法是使用client-connect
脚本,它可以动态生成部分配置。它类似于 CCD 文件,只是文件是由脚本在临时位置生成的。这是最灵活的方法,但需要付出更多努力。我曾经用它在客户端连接时自动添加 DNS 记录。
OpenVPN 按以下顺序使用这三个有关客户端地址的信息源:客户端连接脚本、CCD 文件、IPP 文件。
隨機記錄。
您的配置不够理想。例如,您指示服务器推送某些路由,同时指示客户端拒绝从服务器推送的任何路由。更好的做法是不要拒绝路由,而是首先不要推送它们。然后,当您决定推送某些路由时,您只需要修改服务器配置,而不需要修改客户端。您甚至可以使用 CCD 文件或客户端连接脚本为每个客户端设置路由。
您在客户端上重写 DNS 配置。当客户端断开连接时,没有人保证他们会将配置恢复到连接之前的状态。此外,想象一下客户端使用两个不同的 OpenVPN,每个都修改 DNS。那将是地狱。这个和其他一些推理导致了这里的教训:除非绝对必要,否则永远不要将任何 DNS 选项推送到 VPN 客户端!(这是一般性声明,不仅适用于 OpenVPN。)
您将服务器状态转储到文件中。虽然这不是一个坏主意,但 OpenVPN 可以做得更好。有一个management
命令,它会打开一个端口(我使用 7505),然后您可以“telnet”到它。在那里您可以查询状态(查看它转储到文件中的相同数据),但您可以选择机器可解析的格式以轻松实现自动化。您可以终止客户端。您可以通过运行实时日志来调试 OpenVPN。您可以动态更改日志详细程度。总的来说,这是件好事。
所有可能性都在 中描述man openvpn
。最好至少完整阅读一次以了解它能为您做什么,因为 OpenVPN 是一款功能强大的软件,而且成熟可靠。
答案2
您的 CCD 文件的语法不正确。
查看 ifconfig-push 指令。例如
ifconfig-push IP.add.RR.ESS netmask
根据您的目标,还有另一种格式 ifconfig-push IP.add.r1 IP.addr.2,其中两个 IP 都在同一个 /30 中,并且不是网关或广播,例如 10.0.0.1 和 10.0.0.2,但是不是10.0.0.3 或 10.0.0.4