Mac OS Wi-fi 共享过滤MAC地址
有了Mac电脑设备之后,有个功能,或许大家都用过,就是WiFi共享。这个功能可以让你组件一个局域网,Mac充当一个无线AP,就是无线路由器。其中利好,不用多说,但是也会遇到一些尴尬的情况。比如,碍于情面,你可能会把你的WiFi密码告诉很多人,可是,如果所有的访问压力都集中在你一台电脑上,那你本机的带宽就被占光了,还比如有些连上来的同学,看视频,下载。
怎么做可以让我在让对方不察觉的情况,阻止其连接,即使告诉了你密码。心机boy 😆 !
经过几次的探索和多次的Google,本来是想做的更隐秘一点,限速。无奈不会呀,如有同学了解,还烦请告知啊。
退而求其次吧,让对方知道密码,也连不上不也一样吗,而且,保证一部分人可以上,你连不上,只能说明你人品不好,换手机吧,哈哈😆 。
知识储备
首先我们要明白,苹果的Wifi共享使用的DHCP功能,是由一个叫bootpd
的程序控制的。想了解里面的详细说明,可以在你的terminal上输入man bootpd
来了解一下,其实,我们接下来的事,也是围绕着它来做的。
简单介绍一下bootpd
- 实现了DHCP/BOOTP,符合如下的一些RFC文档:RFC951, RFC1542, RFC2131, 和 RFC2132
- 使用配置文件,使用配置文件
/etc/bootpd.plist
,该配置文件为一个XML格式的文件。里面有好多字段用于控制服务的行为 - Allow/Deny 类似于路由器的ACL(访问控制列表)或者是防火墙的in/out规则,如果定义了Deny,出现在Deny中的 MAC 地址,在DHCP请求的时候,会被拒绝,bootpd的做法很简单,丢包。如果只有Allow规则,则只有出现在列表里面的地址,才允许访问。
-
ignore_allow_deny 这个字段里面是一个数组,数组的内容,是
bootpd server name
,在Mac OS中,默认的名字,应该是Bridge100
。如果这个字段
中不出现Bridge100
,那ignore_allow_deny
就会对Bridge100
失效。换句话说,我们的Allow/Deny规则,就会起作用。 -
/etc/bootpd.plist
,什么时候创建,长啥样。在你使用共享Wifi的时候生成,至于长啥样,留到最后再仔细看吧。你只需要知道,它就是一个XML文件。
话不多说,开始干吧!
- 把已有的bootpd.plist复制到一个临时文件里面,需要root权限。
sudo cp /etc/bootpd.plist /tmp/bootpd.plist
- 使用vim或者Sublime打开它,并找到
ignore_allow_deny
,把里面的内容修改一下。
before
<key>ignore_allow_deny</key>
<array>
<string>bridge100</string>
</array>
after
<key>ignore_allow_deny</key>
<array>
<string>bridge100_bk</string>
</array>
目的,不让默认的bridge100生效。
- 添加
Allow
规则
before 如果你是第一次修改,没有Allow规则
after
<key>allow</key>
<array>
<string>DC:37:14:57:EF:1B</string>
<string>6c:72:e7:74:84:4c</string>
</array>
添加规则,让列表中的设备能够获取到IP地址
- 把临时文件复制回去
sudo cp /tmp/bootpd.plist /etc/bootpd.plist
- 重启
关闭WiFi,然后再启动。有兴趣的同学可以留意一下关闭WiFi后
/etc/bootpd.plist
文件的变化。
- 测试一下
把你自己手机的MAC地址加进去,然后再让别人试一下,他已经哭晕,哈哈。大功告成!
说好的bootpd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Subnets</key>
<array>
<dict>
<key>_creator</key>
<string>com.apple.NetworkSharing</string>
<key>allocate</key>
<true/>
<key>dhcp_domain_name_server</key>
<array>
<string>192.168.2.1</string>
</array>
<key>dhcp_router</key>
<string>192.168.2.1</string>
<key>interface</key>
<string>bridge100</string>
<key>lease_max</key>
<integer>86400</integer>
<key>lease_min</key>
<integer>86400</integer>
<key>name</key>
<string>192.168.2/24</string>
<key>net_address</key>
<string>192.168.2.0</string>
<key>net_mask</key>
<string>255.255.255.0</string>
<key>net_range</key>
<array>
<string>192.168.2.2</string>
<string>192.168.2.254</string>
</array>
</dict>
</array>
<key>allow</key>
<array>
<string>DC:37:14:57:EF:1B</string>
</array>
<key>bootp_enabled</key>
<false/>
<key>detect_other_dhcp_server</key>
<array>
<string>bridge100</string>
</array>
<key>dhcp_enabled</key>
<array>
<string>bridge100</string>
</array>
<key>dhcp_ignore_client_identifier</key>
<true/>
<key>ignore_allow_deny</key>
<array>
<string>bridge100_bk</string>
</array>
<key>use_server_config_for_dhcp_options</key>
<false/>
</dict>
</plist>