我目前有以下设置:
Windows Server 2008
-------> Mint 16 Cinnamon VM 通过外部 VPN 建立隧道(使用 OpenVPN)
---------------> 内部的 Web 服务器用于本地网络访问
当 Web 服务器通过 VPN 隧道传输时,是否有可能使用我的外部 ISP IP 地址访问该 Web 服务器...而不需要在 VPN 端进行端口转发?
举个例子,是否可以在另一台虚拟机或主机操作系统上托管一个 Web 服务器,该服务器重定向到或充当指向该本地服务器的指针(...比如 mod_rewrite 或重定向?),以便可以从外部访问它而无需访问 VPN 服务器上的配置防火墙规则?
例如:
主机操作系统
-----> VM 1,VPN + Web 服务器,本地适配器 IP 为 192.168.1.2(家庭网络),VPN 隧道 IP 为 10.xxx,所有外部流量都通过 VPN 路由。
--------------> VM 2,本地适配器 IP 为 192.168.1.3,Web 服务器在端口 80 上运行,指向托管在 192.168.1.2:80 上的页面,并允许通过端口转发本地路由器进行外部查看。
目前,本地网络上的所有设备都可以正常访问该网络服务器。
如果这个想法失败了,有没有办法强制某些程序仅通过特定接口(即本地以太网接口)发送流量,或者强制某些端口通过 ISP 网关而不是 VPN 进行路由(在操作系统级别)。
感谢您的反馈。
答案1
是的,这是可以做到的,因为你的 Web 服务器运行在Linux 虚拟机。第一个事实(您正在使用 Linux)是绝对先决条件,第二个事实(它是 VM,而不是物理机器)使其更容易且更便宜。
当你设置 VPN 时,它会更改你的路由表,确定(就你的情况而言)所有流量都必须通过不同的服务器。如果连接通过你的本地路由器进入,Mint VM 将尝试按照它所知道的唯一路由表的路由指令进行应答,IE通过 VPN。但是,尝试联系您的 Web 服务器的 PC 会发现它对您的非 VPN 地址的查询已由不同的第三方(VPN 服务器)回答。出于明显的安全原因,这些回复会被立即丢弃。
为了解决这个问题,Linux 能够处理两个(或更多)不同的路由表,并指定何时使用每个路由表。因此,您需要在 Mint VM 上创建第二个接口(我们称之为eth1),并确保它在你的 LAN 上有一个 IP 地址(如果你使用的是 VirtualBox,这意味着创建一个桥接界面。
现在你需要做的就是设置两个路由表,这样,如果一个通信通过 OpenVPN 进入,它由 OpenVPN 设置的路由表来应答,但如果通过 LAN(我们称之为eth1)由不同的路由表来回答,该路由表将流量路由到其来源处,IE您的本地路由器,不是OpenVPN 服务器。
操作如下:
在启动 VPN 之前,请创建两个表:我们将它们称为主表(注定要由 OpenVPN 使用的表)和 NONVPN:
echo 200 main >> /etc/iproute2/rt_tables
echo 201 NONVPN >> /etc/iproute2/rt_tables
向每个路由表添加一个网关(如果需要):
ip route add 192.168.1.0/24 dev eth0 src <SRC1> table main
ip route add 192.168.1.0/24 dev eth1 src <SRC2> table NONVPN
然后是默认路由:
ip route add default via 192.168.1.1 table main
ip route add default via 192.168.1.1 table NONVPN
我假设 192.168.1.1 是您的本地路由器,192.168.1.0/24 是 LAN。
现在您可以启动您的VPN:它将修改您的主路由表。
最后,您根据源地址选择路由表的规则:
ip rule add from 10.0.0.0/24 table main
ip rule add from 192.168.1.0/24 table NONVPN
我假设您的 OpenVPN 隧道的地址在 10.0.0.0/24 范围内,请进行相应修改。
你已经完成了。