所以我看过 WOL 脚本,当我尝试从路由器外部的计算机进行连接时,它们似乎可以很好地工作。
我正在使用的脚本: http://www.dd-wrt.com/wiki/index.php/Useful_Scripts#Web_Server_Wake-up
现在我看到的问题是,当我在家时,WOL 脚本将毫无用处,因为发起计算机和服务器位于同一子网上,因此路由器不会记录请求。
有没有办法让路由器记录其网络内两台计算机之间发送的请求?我对网络结构不是很了解,但我不知道这是否可能。我是否需要以某种方式通过路由器代理所有流量?
为了解释这里是我想做的:
我的家庭服务器为 SMB、AFP、HTTP 和一些其他 Web 应用程序提供服务。我希望服务器在不被访问期间处于睡眠状态。因此,如果网络外部请求 HTTP 访问,我希望服务器被唤醒。如果本地子网上的计算机请求 SMB 共享,我希望服务器唤醒。
需要注意的是:我有一个 Ubuntu 服务器。本地网络上的所有计算机都直接连接到路由器。我有一个集线器,一些机器连接到该集线器,但所有流量都应该通过路由器。
编辑:只是有一个想法。如果我将相关服务器放在单独的 VLAN 上并允许通过路由器在 VLAN 之间进行通信会怎样?然后流量必须通过防火墙,我可以在那里记录流量。有人知道如何建立这样的系统吗?
答案1
一个相当简单的方法是wol
从路由器手动调用。虽然您可以在收到数据包时执行此操作,但在实践中可能效果不佳,因为发送 WoL 数据包的时间与目标计算机准备好处理的时间之间存在很大的延迟。应用程序很可能在目标机器唤醒之前超时。
Linux 数据包过滤器可以通过目标将数据包传递到用户空间QUEUE
,您可以编写程序来对这些数据包做出反应netfilter_queue 库。我不知道任何现有的此类程序会发送 WoL 数据包或执行另一个程序(例如/usr/sbin/wol
),但听起来并不难编写。知道何时执行此操作是另一回事:每当可能需要唤醒的计算机收到数据包时,您都不想经历所有这些。
我赞成让用户执行一些手动操作来发送 WoL 数据包。一个简单的方法是在路由器上有一个专门的用户,使用脚本调用/usr/sbin/wol
作为其 shell,并将 SSH 密钥提供给授权用户。一种更简单的方法是在路由器上运行 Web 服务器 - 它可以是可以运行 CGI 脚本的非常简单的服务器 - 并/usr/sbin/wol
在用户访问页面并提供接受的凭据时运行它。
答案2
您应该只运行 /usr/sbin/wol 来本地唤醒。不确定您运行的是什么操作系统和/或您的操作系统是否支持该操作系统。不过,在尝试访问服务器之前,您必须运行该命令。所以它不会是自动的。
我是否需要以某种方式通过路由器代理所有流量?
嗯,这是使其自动化的一种方法。如果您确实必须这样做,请将 DHCP 的网络掩码设置为 255.255.255.255,这样每个 LAN 请求都会往返路由器。但这是非常低效的。将网络掩码设置为 255.255.255.255 会使每台计算机认为它位于自己的网络上,并且发送到除自身之外的任何设备的任何数据包都需要通过网关(您的路由器)。
答案3
通过将有问题的服务器移动到专用 VLAN,然后使用在某些端口上触发的特定 iptable 规则记录它与网络其余部分之间的流量来解决此问题。
当我完成该项目时,我将在我的网站上发表完整的文章,然后更新这个答案。