网络拓扑是这样的:
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.0
为server 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 地址分配给 br0
ifconfig 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
。