在我的工作场所,我们有一个公共Wifinetworking,以及我们的私人无线networking。 私人方面有机会看到其他电脑,打印机,服务器,并访问互联网。 在公共方面,用户需要使用服务器上的用户名/密码组合(仅适用于我们员工的个人设备)与强制门户进行身份validation。
在我find这份工作之前,关键就已经被泄露了,而且我已经把大部分东西清理干净了。 我有Debian Wheezy的DHCP租借脚本(由其他团队成员编写,不是我自己!),并吐出DHCP服务器与DHCP服务器交互的所有设备的制造商,DNS名称,IP地址和MAC地址。 通过这些脚本,我可以创build一个MAC地址黑名单,iptables会阻止他们。 我更新了/etc/blacklist.txt ,当iptables启动时,它执行iptables -A INPUT $if -m mac --mac-source $i -j DROP ( $i正从文件中读取)。
这将阻止他们的设备连接到我们的networking资源和互联网。 不幸的是,它只有在设备从isc-dhcp-server获得IP地址后才会生效。 所以, 我的问题是,我怎样才能防止他们获得分配给他们的IP地址? 是的,我知道他们可以给自己分配一个静态IP地址并绕过DHCP服务器,但是我仍然希望iptables根据他们(希望不变的)MAC地址来阻止他们。 是的,我知道我可以增加DHCP服务器的范围,但是我希望pipe理层能够通过连接和绕过我们的强制门户来pipe理私有设备,从而占用我们的工作资源。
有人想到的一个解决办法(很好,部分)是在我的/etc/dhcp/dhcpd.conf文件中创build一个黑洞类,并用我不想连接的设备的MAC地址填充它。 这将工作,但需要更新MAC地址在多个地方,我不想要的。 我希望能够在一个文件中更新MAC,然后运行一个脚本,将更改添加到我的DHCP文件和我的iptables规则中。
使用ebtables而不是iptables来阻止第2层的MAC地址:
ebtables -A INPUT -s 00:11:22:33:44:55 -j DROP
如果您有权访问该设置,并且硬件允许,则更简单的方法是将访问点configuration为拒绝要过滤的MAC地址,而不是使用iptables“稍后”进行过滤。 这也可以解决人们为他们的设备分配静态IP的问题,因为如果他们在AP级被过滤,他们可能根本不会与networking关联。 当然,这不能解决“非静态”MAC地址的问题…
据我所知,除了像使用电子表格这样的东西,还有其他的记账function,我们不可能这样做。
我以前见过这个问题,我发现使用的解决scheme与您已经使用的解决scheme非常相似。 如果每几分钟就让脚本运行一次,那么未经授权的设备可以在networking上的时间很less,这可能是一个可以接受的折衷。
您还应该考虑将无线身份validation与LDAP服务器相关联,假设您已经使用了这样的应用程序应该很容易。 否则尽快整合LDAP或其他集中authentication系统(在大多数情况下,本地用户帐户是一个坏主意)。 然后根据具体情况创build通用来宾账户或来宾账户。 这样,即使用户可能拥有无线密钥,他们仍然无法通过无线authentication。 通常这将通过无线路由器将redirectstream量的网页完成。 只有在authentication之后,才会创build路由以允许通信。
虽然我认为使用ebtables可能是答案,但是我不想将其添加到我的configuration中。 其他技术人员之一帮助我制作一个脚本,通过IP地址黑名单进行parsing,并将其添加到一个新的池中,这个池不会给出任何IP地址。 它需要常规的黑名单(每行一个MAC地址),我也吐在iptables ,只是创build新的池。
在我的/etc/dhcp/dhcpd.conf文件中,我在顶端附近创build了一个新的类:
class "blacklist" { match hardware; }
在我的“局域网的私有方”的池中,我补充说:
deny members of "blacklist";
…最后,我补充道:
include "/etc/dhcp/blacklist.conf";
然后,我创build一个Python脚本,如下所示:
#!/usr/bin/perl my $if; my @macs; my $line = 0; if ($ARGV[0]) { $if = "-i $ARGV[0]"; } while (<stdin>) { $line++; next if /^$/; next if /^\s*#/; chomp; if (/^([a-f0-9]{2}((:|-)[a-f0-9]{2}){5})$/) { push(@macs, $_); } else { die("syntax error on line $line\n"); } } open(OUT, ">/etc/dhcp/blacklist.conf"); foreach my $i (@macs) { $i =~ tr/-/:/; print OUT "subclass \"blacklist\" 1:$i;\n"; } close(OUT);
我保存这个,然后用chmod +x /usr/local/sbin/dhcpd-macblock.py添加执行位,并设置一个每小时将黑名单提供给脚本的cron作业:
cat /etc/blacklist.txt | dhcpd-macblock.py
每隔一小时,它就会通过创build一个新的文件,其中所有的MAC地址都被阻塞了,而我们不需要这些文件,甚至都没有获得DHCP预留,而且我的位置也慢慢地被释放了。