我有几个室友,他们每个月都会和我分摊网费。有时他们会忘记付钱给我,我就得缠着他们要钱。
如果经过 3 天的纠缠,他们仍然没有付款,我会在基于 unix 的路由器中创建一个防火墙规则,阻止到他们 mac 地址的流量。事实证明,这种方法对于让拖欠房租的室友付钱非常有效。
我如何才能在每月 3 号自动将 MAC 地址添加/删除到防火墙规则中?我希望有一种简单的方法,在他们付款后,在本月的剩余时间内解除对他们的阻止。
我目前正在使用 pfSense。虽然有强制门户模块,不支持调节每个用户/每月的访问权限。
我怎样才能自动阻止/解除阻止室友的互联网访问?
答案1
- 制作一个添加限制性 iptables 规则的 bash 脚本。
- 把这个脚本放入每月的 cron 中。
- 在 bash 脚本中设定一个条件 - 如果文件
~/do_not_block_friends
存在并且其修改时间在月周期内(stat -c %y filename
) - 则不要运行该脚本。 - 一旦他们付款,你就这么做
touch ~/do_not_block_friends
。
脚本将运行并看到已do_not_block_friends
被修改,因此它不会运行 iptables 命令。
如果他们没有付款给你 - 脚本将会阻止他们。
一旦他们付款,您就运行另一个准备好的脚本来解锁他们。
这是总体计划,没有太多细节,但我认为弄清楚其余部分并不难。
编辑:
以下是编写此类脚本的更简单的方法:
#!/bin/bash
count=`find ~ -maxdepth 1 -type f -name do_not_block_friends -mtime -31 | wc -l`
if [ "$count" -eq 1 ]; then
# Friends have paid. Do nothing;
else
# Friends have not paid. Run iptables command;
fi
我们使用find
带有以下选项的命令:
maxdepth 1
- 不进行递归搜索type f
- 搜索文件name
- 搜索此名称mtime -31
- 查找 31 天内修改的文件
wc -l
将计算命令生成的行数。0
如果朋友尚未付款(未找到任何内容),则计算结果为1
;如果朋友已付款且我们已touch
控制文件,则计算结果为。
该脚本不计算月份的天数,默认为 31,我认为这没问题,因为我们不是在构建商业计费系统,但我相信甚至可以在 bash 中计算。
答案2
它可能超出了您的要求,但是您是否考虑过使用 802.1x 身份验证针对 RADIUS 作为后端来设置无线凭据?
可以设置 RADIUS 来检查您想要的任何验证器(您可能需要编写脚本并存储在数据库或其他地方),以查看您的室友是否已支付房租。当他们通过身份验证并已付款时,RADIUS 会验证他们。否则,不会。这样做的好处是您不依赖于 MAC 地址过滤。这样,如果您的室友精通技术,他们就无法轻易绕过您设置的控制。
答案3
检查您的银行账户或您可能使用的其他交易解决方案(PayPal?)是否提供任何自动付款通知方式,例如:
- 每笔交易的电子邮件通知
- 每日交易摘要电子邮件
- 一些不错的 API
如果有这样的方法,剩下的就是编写一些简单的脚本来监控付款。您可能只是解析银行发来的电子邮件,要求您的朋友每月付款。您需要一个配置文件来存储每个朋友的帐号或 ID、付款金额(也可能是一个全局常量)和 MAC 地址。
然后脚本会根据每月的付款情况调整防火墙条目。
之后,告知您的朋友可用的付款方式,并在配置防火墙时记得为您的朋友提供付款机制的访问权限,以便他们在错过 3 天的宽限期时仍可以付款:)