![是否可以设置 OpenVPN,以便服务器不具有作为 VPN 一部分的接口?](https://linux22.com/image/540552/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%AE%BE%E7%BD%AE%20OpenVPN%EF%BC%8C%E4%BB%A5%E4%BE%BF%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8D%E5%85%B7%E6%9C%89%E4%BD%9C%E4%B8%BA%20VPN%20%E4%B8%80%E9%83%A8%E5%88%86%E7%9A%84%E6%8E%A5%E5%8F%A3%EF%BC%9F.png)
我希望设置 VPN(OpenVPN 是我的首选,但我并不局限于此),使得托管 VPN 的服务器在 VPN 内部不可见。也就是说,客户端通过 VPN 接口发送的任何数据包都将被传送到另一个客户端的 VPN 接口或被丢弃。另一方面,服务器根本不应该有 VPN 接口,正常的网络操作不应该能够在网络上发送数据包。
这能做到吗?
我发现的所有文档都假定客户端将通过 DHCP 连接(这要求服务器至少在一定程度上连接),但我想不出任何理由说 VPN 不能使用静态 IP,或者如果不在服务器上设置 VPN 接口,DHCP 服务器就无法在 VPN(请参阅编辑)服务器内部实现。
编辑:基于Phil Hollenback 的回答中关于桥接模式的链接看来 OpenVPN 确实有我所想的“内部 DHCP 服务器”。
答案1
我怀疑这是可能的(尽管很奇怪)。使用 tap 设备,这样远程计算机就通过 vpn 桥接而不是路由。OpenVPN 允许您将脚本推送到客户端以在连接时执行,因此您可以使用该功能在客户端计算机上配置网络,而不是使用服务器推送指令来配置 dhcp。相反,直接在客户端上运行适当的 ifconfig 和 route 命令,告诉它通过 vpn 连接到网络。这可能会变得复杂,因为您必须处理 linux 和 windows 上的不同网络配置工具,但这应该是可行的。
不过我猜这只能避免随意检查。很可能会有信息泄露,让客户端检测到它是通过特定的 openvpn 服务器连接到网络的。
以下是关于 openvpn 桥接的一些信息那可能会有用。
答案2
这不会回答您的 OpenVPN 问题,但如果您不介意的话,让我们退一步来看看。
您想要一个仅供客户端使用的 VPN,对吗?您的客户端可能位于世界任何地方,并且您只想通过 VPN 连接这些客户端?您不想让客户端连接到任何中央资源,而只想让客户端相互连接。明白了。
你看过鰤鱼^2? 它确实实现了您想要实现的目标。
如果您所做的事情不是商业性的,并且您的客户端不超过 16 个,那么 Hamachi^2 是免费的。如果您有商业需求和/或您需要超过 16 个客户端,则每年的费用为 199 美元。
每年 199 美元可能比购买 OpenVPN 硬件(如果需要)、配置和维护 OpenVPN 的时间以及支持客户/用户的时间要少。
当然,如果这个目的是非商业性的,超过 16 个客户端,你捐献了你的时间并且已经提供了硬件,我绝对可以明白为什么 Hamachi^2 不是你的解决方案。
既然如此,我不完全确定为什么 OpenVPN 隧道接口上的完全锁定防火墙解决方案不能满足您的需求。
答案3
我假设 OpenVPN 充当虚拟交换机,默认情况下,它只是将服务器添加为另一个客户端。客户端恰好在同一台机器上,但除此之外完全没有意义。我希望有某种方法可以告诉它不要打扰。然而,似乎(如果我错了,请纠正我)情况并非如此,服务器与 VPN 的连接有一些特殊之处。
编辑:看来我还是错了。在与从事这方面工作(如内核模式开发等)的人聊天大约一个小时后,我发现了我对 VPN 实现方式的误解:我假设 VPN 端点的处理方式是在用户空间进程中它正在监听某个 UDP 端口(使隧道协议成为应用层协议),真实的情况是隧道协议(至少是常见的协议)是一个传输层协议,类似于 TCP/UDP,以及所有数据处理从处理 IP 数据包开始,到隧道数据包的解密,再到转发到内核网络栈,其实就是在内核中完成。一旦有人指出我的这个错误,所使用的设计的合理性就变得一目了然:VPN 服务器的用户空间组件无非就是配置工具它负责管理身份验证,并为每个请求连接的客户端建立一个单独的、对称的点对点链接。
另一方面,这让我想知道 VPN 如何适应大型设置(例如 IBM 或类似设备),这些设置需要同时支持数百到数千个活动会话到同一主机?它们是否运行具有数百到数千个网络接口的普通内核(我很难相信同一内核可以有效处理大多数情况下的一、二、也许三个接口和数千个接口的情况)还是它们基于经过彻底修改的内核、特殊操作系统、不同架构甚至特殊硬件。