事情是这样的,我使用iptables命令出现错误(match错误):
iptables -A INPUT -m physdev --physdev-in ap1_0 -j DROP
报错:iptables: No chain/target/match by that name.
解决办法:
1.iptables的match匹配是需要内核支持的,可以内核目录下make menuconfig查看选项,重点是xtables是否选择了physdev选项:
2.把编译出来的xt_physdev.ko拷贝到目标开发板上进行inmod xt_physdev.ko
然后再次执行刚才的命令就不会报错了
另外加个感叹,内核给的-m physdev 工具配合brctl使用,简直就是绝配啊!太好用了啦!
3.physdev
该模块在桥端口输入和输出设备上匹配,这些输入和输出设备被奴役到桥接设备上。此模块是支持透明桥接IP防火墙的基础结构的一部分,仅适用于2.5.44版本以上的内核版本。
[!] --physdev-in name ,接收数据包的桥端口的名称(仅用于INPUT、FORWARD和PREROUTING链的数据包)。如果接口名以“+“结尾,则以此名称开头的任何接口都将匹配。如果数据包没有通过桥接设备到达,则此数据包将与此选项不匹配,除非“!”被利用了。
[!] --physdev-out name ,要发送数据包的桥接端口的名称(用于FORWARD、OUTPUT和POSTROUTING链的数据包)。如果接口名以“+“结尾,则以此名称开头的任何接口都将匹配。注意,在NAT和Magle输出链中,不能在桥输出端口上匹配,但是在过滤器输出链中可以匹配。如果数据包不会由网桥设备离开,或者如果它还不知道输出设备将是什么,那么该数据包将与此选项不匹配,除非‘!’使用。
[!] --physdev-is-in ,如果数据包已通过网桥接口输入,则匹配。
[!] --physdev-is-out ,如果数据包将通过网桥接口离开,则匹配。。
[!] --physdev-is-bridged ,如果数据包正在桥接,因此不被路由,则匹配。这仅在FORWARD链和POSTROUTING链中有用。
iptables -A FORWARD -m physdev --physdev-in ap1_+ -j DROP //禁止匹配ap1_*的接口转发
iptables -I FORWARD -m physdev --physdev-in ap1_+ -s 192.168.4.1/32 -j ACCEPT //允许转发源地址192.168.4.1/32
iptables -I FORWARD -m physdev --physdev-in ap1_+ -d 192.168.4.1/32 -j ACCEPT//允许转发目标地址192.168.4.1/32
iptables -D FORWARD -m physdev --physdev-in ap1_+ -j DROP
iptables -D FORWARD -m physdev --physdev-in ap1_+ -s 192.168.4.1/32 -j ACCEPT
iptables -D FORWARD -m physdev --physdev-in ap1_+ -d 192.168.4.1/32 -j ACCEPT
备注:
我是看了这篇博客解决的这个问题:https://blog.youkuaiyun.com/yangyang031213/article/details/103791996
关于更多match(iptables -m)使用推荐这个文章:http://blog.itpub.net/29270124/viewspace-2611838/