我已经花了很多时间尝试解决我面临的问题,但没有成功。
我有一个 OpenVPN (CentOS 7) 设置,由 VPN 服务器和客户端组成,其中一些位于不同的子网中,使用 iptables 控制访问。Windows 服务器也连接到 OpenVPN 服务器,用户需要通过隧道连接到它。我尝试了各种配置文件选项组合,但无法添加正确的客户端路由以使客户端相互通信。客户端到客户端选项在 server.conf 中指定。
IP 寻址如下:
用户 - 10.8.0.0/24
管理员 - 10.8.1.0/24(在 ccd 文件中指定)
Windows Server - 10.8.2.1(在其 ccd 文件中指定)
OpenVPN 配置如下:
port 2000
proto tcp
dev tun0
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
client-to-client
server 10.8.0.0 255.255.0.0
route 10.8.1.0 255.255.255.0
route 10.8.2.0 255.255.255.0
ifconfig-pool-persist ipp.txt
#push "dhcp-option DNS 1.1.1.1"
#push "dhcp-option DNS 8.8.8.8"
#push "redirect-gateway def1 bypass-dhcp"
dh none
ecdh-curve prime256v1
tls-crypt tls-crypt.key
crl-verify crl.pem
ca ca.crt
cert server.crt
key server.key
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
client-config-dir /etc/openvpn/ccd
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3
远程Windows服务器的ccd文件如下:
ifconfig-push 10.8.2.1 255.255.255.0
iroute 10.8.2.1 255.255.255.255
push "route 10.8.0.0 255.255.255.0"
push "route 10.8.1.0 255.255.255.0"
远程 Windows 服务器的客户端文件如下所示:
client
proto tcp-client
remote X.X.X.X 2000
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
setenv opt block-outside-dns # Prevent Windows 10 DNS leak
verb 3
令人沮丧的是,我之前曾这样做过,但出于不值得深究的原因,配置丢失了。
我发现,在上面提到的 Windows 服务器上,如果在客户端连接后手动添加通过 10.8.2.2 到 10.8.0.0/24 的路由,它就可以 ping 10.8.0.1,其他客户端也可以连接到它。但是,如果我不添加路由,它会尝试从其默认网关向 10.8.0.0 发送流量,这显然会失败。
目前,我已经通过使用持久静态路由解决了这个问题,但我非常想了解我在这里做错了什么。
我也观察到了 10.8.1.0/24 上的管理员用户的相同行为,但由于他们需要访问许多不同机器上的许多子网,因此持久静态路由不是一种选择(而且这感觉非常黑客,我想避免)。
编辑添加路由表以获取更多上下文
这是来自 Windows 服务器的路由表:
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 12.22.122.193 12.22.122.202 271
10.8.0.0 255.255.255.0 10.8.0.1 10.8.2.1 257
10.8.0.0 255.255.255.0 10.8.2.2 10.8.2.1 2
10.8.1.0 255.255.255.0 10.8.0.1 10.8.2.1 257
10.8.2.0 255.255.255.0 On-link 10.8.2.1 257
10.8.2.1 255.255.255.255 On-link 10.8.2.1 257
10.8.2.255 255.255.255.255 On-link 10.8.2.1 257
12.22.122.192 255.255.255.192 On-link 12.22.122.202 271
12.22.122.202 255.255.255.255 On-link 12.22.122.202 271
12.22.122.255 255.255.255.255 On-link 12.22.122.202 271
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 10.8.2.1 257
224.0.0.0 240.0.0.0 On-link 12.22.122.202 271
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 10.8.2.1 257
255.255.255.255 255.255.255.255 On-link 12.22.122.202 271
===========================================================================
Persistent Routes:
Network Address Netmask Gateway Address Metric
0.0.0.0 0.0.0.0 12.22.122.193 Default
10.8.0.0 255.255.255.0 10.8.2.2 1
===========================================================================
请注意,存在一条通过 10.8.2.2 到 10.8.2.0/24 的持久路由,这条路由有效,并且是我静态添加的。您可以看到一条通过 10.8.2.1 到 10.8.1.0/24 的路由 - 这是由客户端添加的,并且无法访问,流量会尝试通过默认网关。
还有一件值得注意的事情是,每次非标准(例如 10.8.0.0/24 之外的)用户连接时,服务器似乎都会记录以下内容:
admin1/1.2.6.4:38593 MULTI ERROR: primary virtual IP for admin1/1.2.6.4:38593 (10.8.1.1) violates tunnel network/netmask constraint (10.8.0.0/255.255.255.0)
我在文档或网上找不到太多关于此内容的信息。
答案1
根据 Tom Yan 的建议,解决此问题的方法是使用route-gateway 10.8.1.1
相关用户的 ccd 文件。这会向客户端添加正确的路由,并允许它们路由回远程子网。