正常情况,ipfw只能过滤第三层和第四层的包,也就是对IP地址和端口进行过滤。但是PPPoE是第二层的包,跟ARP同一样,是IP的哥们,基于IP协议的过滤对它就无效了。
默认情况下,FreeBSD不会让二层的数据帧通过ipfw,必须手动强制让数据帧进入ipfw中,使用下面的命令:
sysctl –w net.link.ether.ipfw=1
或者把下面这句加进/etc/sysctl.conf
net.link.ether.ipfw=1
这样,ipfw中才能看到二层的数据帧。
在ipfw中过滤数据帧,用的命令是mac-type,比如,要想记录arp的数量:
Ipfw add 10 count ip from any to any mac-type 0x0806 via em0
其中,0x0806是arp的代号,IPV4的代号是0x0800,ipv6的代号是86DD,PPPoE发现帧是8863,会话帧是8864,所以如果拒绝pppoe发现帧,就是:
Ipfw add deny ip from any to any mac-type 0x8863 in via em0
提醒:把二层的数据帧引入ipfw会导致网络性能的下降,除非特殊需求,尽量使用三层以上的过滤。