我有一个使用 openvpn 托管多个桥接(即 tap)VPN 的服务器,其中每个 VPN 都有不同的 10.8.X.0/24 子网。
我希望将发送到每个 VPN 中特定未分配 IP 地址(例如 10.8.X.254)的流量重定向到不同 VPN 上的固定地址(例如 10.8.1.10)。这样做的目的是通过保留 VPN 服务器上的大部分路由配置来保持客户端配置相对干净(即它知道某些流量始终流向其自己子网上的地址 254),同时也使将来修改目标 IP 更加容易。
首先,在 VPN 服务器上,我在内核中启用了 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables
然后我尝试在 VPN 服务器上为每个 VPN设置 NAT 重定向,例如
sudo iptables -t nat -A PREROUTING -s 10.8.2.0/24 -d 10.8.2.254 -j DNAT --to-destination 10.8.1.10
但是从 VPN 内部对 10.8.2.254 的 ping 请求失败,并且服务器的 VPN 接口上Destination Host Unreachable
报告了以下网络流量tshark
6.943311 10.8.2.12 -> 10.8.2.1 SSH 274 Encrypted response packet len=208
6.943347 10.8.2.1 -> 10.8.2.12 TCP 66 42926 > ssh [ACK] Seq=97 Ack=625 Win=563 Len=0 TSval=3930766820 TSecr=80207294
6.959100 9e:10:2c:67:91:2a -> Broadcast ARP 42 Who has 10.8.2.254? Tell 10.8.2.12
7.983824 9e:10:2c:67:91:2a -> Broadcast ARP 42 Who has 10.8.2.254? Tell 10.8.2.12
这似乎表明服务器不知道将流量发送到哪里,即使我已经按照上述配置了重定向规则。
我认为也许我应该通过 VPN 设置来配置路由,但无法弄清楚如何针对包含多个桥接 VPN 的系统进行此操作;我能找到的与重定向流量有关的所有 VPN 特定信息都是基于路由 (tun) VPN。
我想避免将目标主机添加到每个 VPN 的解决方案,因为当 VPN 服务器托管的 VPN 数量以及最终 VPN 服务器数量增加时,这会变得越来越复杂。
答案1
10.8.2.12 认为 10.8.2.254 位于同一子网,因此它请求 10.8.2.254 的 MAC 地址,以便将其作为目标 MAC 插入到将来发往 10.8.2.254 的数据包中。由于 10.8.2.254 不存在,因此没有人回复,并且 10.8.2.12 永远不知道要将哪个 MAC 设置为目标 MAC。
尝试在主服务器上使用 proxy_arp。echo 1 > /proc/sys/net/ipv4/conf/ethXX/proxy_arp
运行 tcpdump 您应该会看到 VPN 服务器使用其自己的 MAC 地址响应 10.8.x.254 的 ARP 查询,这将使您更进一步。