网络拓扑是这样的:
OpenVPN 服务器:
Private IP (eth0): 10.0.4.23/16
Public IP (eth1): 77.20.30.40/24
Routes:
default via 77.20.30.1
10.0.0.0/16 (not routable, so no gateway)
10.8.0.0/16 via 10.0.0.65
在同一个私有子网上,我们为通过 OpenVPN 连接的客户端提供了 10.0.13.0/24 网络范围内的专用地址。因此客户端将 OpenVPN 服务器地址视为 10.0.13.1 作为网关。
客户端机器:
Public IP: 217.40.50.60
目前,当客户端连接到 VPN 服务器时,它无法看到私有范围内的子网。因此,我使用 OpenVPN 服务器 tun0 IP (10.0.13.1) 添加了到这些网络的路由
ip r add 10.0.0.0/16 via 10.0.13.1
ip r add 10.8.0.0/16 via 10.0.13.1
它不起作用。所以我在 OpenVPN 服务器上添加了 POSTROUTING iptables 规则
iptables -A POSTROUTING -s 10.0.13.0/24 -o eth0 -j MASQUERADE
那时它奏效了。但是,问题是,例如,当我连接到该私有子网中的服务器时10.0.4.20
,该服务器会将原始 IP 地址视为 OpenVPN 私有地址10.0.4.23
。
目前我们已经建立了 Microsoft VPN,当我们使用它时,所有服务器都可以看到由 VPN 分配的客户端 IP 地址,因此可以完成(也许)但我不确定我哪里弄错了。
这是 OpenVPN Server 配置文件,为了方便读者,去掉了注释。
port 1194
proto udp
dev tun
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.0.13.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 10.0.0.1"
push "dhcp-option DNS 10.0.0.2"
push "route 10.0.0.0 255.255.0.0"
push "route 10.8.0.0 255.255.0.0"
dh none
ecdh-curve prime256v1
tls-crypt tls-crypt.key 0
crl-verify crl.pem
ca ca.crt
cert server_oy94rAaIiMtrnvAB.crt
key server_oy94rAaIiMtrnvAB.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
status /var/log/openvpn/status.log
log /var/log/openvpn/openvpn.log
verb 3
plugin /opt/openvpn-ldap-auth/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
client-cert-not-required
我尝试设置server 10.0.13.0 255.255.255.0
为server 10.0.13.0 255.255.0.0
应该是网络,但 OpenVPN 服务器不喜欢该配置,并且如果子网中的第一个八位字节不是,则不想启动0
。
所以为了简单起见:我如何制作一些位于 10.0.0.0/16 网络上的服务器,访问位于 10.0.13.0/24 上的 VPN 客户端。或者更好的是,我如何让 OpenVPN 服务器分配给 10.0.13.0/24 范围内的客户端 IP 地址,但实际上让它们属于 10.0.0.0/16?我可能需要在同一台服务器上安装单独的 DHCP 服务器吗?
在Ethernet Bridging的帮助下,我设法解决了这个问题。
这些将是步骤:
systemctl stop openvpn@server
yum install bridge-utils
openvpn --mktun --dev tap0
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 tap0
ifconfig tap0 0.0.0.0 promisc up
ifconfig eth0 0.0.0.0 promisc up
ifconfig br0 10.0.4.23 netmask 255.255.0.0 broadcast 10.0.255.255
/etc/openvpn/server/server.conf
,注释掉dev tun
并在其下方或上方添加dev tap0
右侧。server
并添加最初在 eth0 和现在在 br0 上的 IP 地址,还添加 VPN 将分配给客户端的地址的 DHCP 范围,如下所示:这将允许服务器将地址从 10.0.13.2 - 10.0.13.254 租给客户端。
systemctl start openvpn@servers
。从您的描述中,我看到一个缺失的配置:您没有告诉其他服务器如何访问 VPN 客户端。
缺少该配置,任何具有
10.0/16
网络地址的主机将默认假定同一网络的任何其他地址,因此包括10.0.13/24
子网络,是“on-link”,即无需干预路由器即可直接访问。作为一个示例测试,尝试使用属于网络
ip r add 10.0.13.0/24 via 10.0.4.23
的任何其他Linux 服务器(不是 OpenVPN 服务器)10.0/16
:之后,流量应该在该特定 Linux 服务器和 OpenVPN 客户端之间定期流动。当然,这同样适用于您的
10.0/16
专用网络上的所有主机,无论是 Linux、Windows、Mac 还是 Cisco 等等。在实践中,您应该将该路由放在您专用网络的所有主机上。当然,如果您有很多主机,这可能是不可取的。更好的方法(网络方面)是让您的 OpenVPN 服务器为您的整个私有网络托管一种中央网关,可能实际上是所有这些主机的默认网关。
假设这是不可行的,如果您的私有网络中已经有这样一个“中央网关”(可能是您的
10.0.0.65
主机?),那么您可以尝试使用上面的路由配置那个:其他主机(指的是那个网关)通常应该服从和遵守。然而,这种解决方案通常不是最理想的,因为它使这些主机经常被“中央网关”重新路由到 OpenVPN 服务器网关。其他替代方案包括在充当 OpenVPN 服务器的 Linux 服务器上设置特殊配置,以使其也充当 OpenVPN 客户端地址的一种“代理 arp”。可能,但复杂而先进。
桥接解决方案无疑是一种快速简便的解决方案,但意味着所有广播流量(在中等规模的 LAN 中可能是闲聊的)都会传播到您的所有 OpenVPN 客户端,从而占用您的 OpenVPN 服务器的资源和您的 Internet 连接到和来自您的客户端,每个广播帧乘以连接的客户端数量。