允许网络中的客户端与通过 OpenVPN 连接的客户端进行通信

允许网络中的客户端与通过 OpenVPN 连接的客户端进行通信

网络拓扑是这样的:

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 Server 时,它无法看到专用范围内的子网。所以我使用 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.0server 10.0.13.0 255.255.0.0网络,但 OpenVPN 服务器不喜欢该配置,并且如果子网中的第一个八位字节不是,则不想启动0

为了简单起见:我如何使 10.0.0.0/16 网络上的某些服务器到达 10.0.13.0/24 上的 VPN 客户端。或者更好的是,我如何让 OpenVPN Server 分配给 10.0.13.0/24 范围内的客户端 IP 地址,但实际上让它们属于 10.0.0.0/16?我是否需要在同一台服务器上安装单独的 DHCP 服务器?

答案1

从你的描述中我看到一个缺失的配置:你没有告诉你的其他服务器如何到达 VPN 客户端。

缺少该配置,任何具有该网络地址的主机10.0/16将默认假定该同一网络的任何其他地址(因此包括子网)10.0.13/24是“在线”的,即无需中间路由器即可直接到达。

作为一个测试示例,请尝试ip r add 10.0.13.0/24 via 10.0.4.23您的任何一个其他属于10.0/16网络的 Linux 服务器(不是 OpenVPN 服务器):之后,流量应该在该特定 Linux 服务器和 OpenVPN 客户端之间定期流动。

当然,这同样适用于您的专用网络上的所有主机10.0/16,无论是 Linux、Windows、Mac、Cisco 还是其他主机。实际上,您应该将该路由放在专用网络的所有主机上。

当然,如果您有很多主机,这可能是不可取的。更好的方法(网络方面)是让您的 OpenVPN 服务器成为整个专用网络的中央网关,也许实际上是所有这些主机的默认网关。

假设这是不可行的,如果您的专用网络中已经有这样一个“中央网关”(也许是您的10.0.0.65主机?),那么您可以尝试使用上面的路由配置该网关:其他主机(指的是网关)通常应服从和遵守。然而,这种解决方案通常不是最佳的,因为它使得这些主机经常被“中央网关”重新路由到 OpenVPN 服务器网关。

其他替代方案包括在充当 OpenVPN 服务器的 Linux 服务器上设置特殊配置,以使其充当 OpenVPN 客户端地址的一种“代理 arp”。可能,但复杂且先进。

桥接解决方案这当然是一个快速且简单的解决方案,但意味着所有广播流量(在中型 LAN 中可能会很频繁)都会传播到您的所有 OpenVPN 客户端,从而占用您的 OpenVPN 服务器的资源您与客户端之间的互联网连接,每个广播帧乘以连接的客户端数量。

答案2

我已经在以下人员的帮助下解决了这个问题以太网桥接

这些是步骤:

  • 在 CentOS 上停止 OpenVPN 服务器:systemctl stop openvpn@server
  • 在CentOS 7上安装bridge-utils包yum install bridge-utils
  • 创建tap0虚拟以太网设备openvpn --mktun --dev tap0
  • 创建一座桥梁brctl addbr br0
  • 将 eth0 设备(具有私有 IP 的设备)添加到新桥brctl addif br0 eth0
  • 将tap0设备添加到桥接brctl addif br0 tap0
  • 启用混杂模式以访问 Tap0 设备ifconfig tap0 0.0.0.0 promisc up
  • 为 eth0 设备启用混杂模式ifconfig eth0 0.0.0.0 promisc up
  • 将之前设置为 eth0 的 IP 地址分配给 br0ifconfig br0 10.0.4.23 netmask 255.255.0.0 broadcast 10.0.255.255
  • 添加 iptables 规则,以便新接口可以接受流量
    iptables -A INPUT -i tap0 -j ACCEPT
    iptables -A INPUT -i br0 -j ACCEPT
    iptables -A FORWARD -i br0 -j ACCEPT
  • 打开VPN Server配置文件,例如/etc/openvpn/server/server.conf,注释掉并在其下方或上方dev tun添加右侧内容。dev tap0
  • 注释掉以 开头的整行,server并添加最初位于 eth0 和现在位于 br0 上的 IP 地址,同时添加 VPN 将分配给客户端的地址的 DHCP 范围,如下所示:
bridge 10.0.4.23 255.255.0.0 10.0.13.2 10.0.13.254

这将允许服务器将 10.0.13.2 - 10.0.13.254 之间的地址租用给客户端。

  • 现在启动 openvpn 服务器并享受:) systemctl start openvpn@servers

相关内容